Skip to content

AnimatedSwitcher crashes with null child in Column or Row #88575

@nt4f04uNd

Description

@nt4f04uNd

Steps to Reproduce

Run the code sample

Expected results: no crash

Actual results: crash

Code sample
// Flutter code sample for AnimatedSwitcher
//
// This sample shows a counter that animates the scale of a text widget
// whenever the value changes.

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

/// This is the main application widget.
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: MyStatefulWidget(),
    );
  }
}

/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({Key? key}) : super(key: key);

  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int _count = 0;

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          AnimatedSwitcher(
            duration: const Duration(milliseconds: 500),
            transitionBuilder: (Widget child, Animation<double> animation) {
              return ScaleTransition(child: child, scale: animation);
            },
            child: _count % 2 == 0 ? null : Text(
              '$_count',
              // This key causes the AnimatedSwitcher to interpret this as a "new"
              // child each time the count changes, so that it will begin its animation
              // when the count changes.
              key: ValueKey<int>(_count),
              style: Theme.of(context).textTheme.headline4,
            ),
          ),
          ElevatedButton(
            child: const Text('Increment'),
            onPressed: () {
              setState(() {
                _count += 1;
              });
            },
          ),
        ],
      ),
    );
  }
}
Logs
════════ Exception caught by rendering library ═════════════════════════════════
The following assertion was thrown during performLayout():
'package:flutter/src/rendering/stack.dart': Failed assertion: line 541 pos 14: 'constraints.biggest.isFinite': is not true.
2

Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=2_bug.md

The relevant error-causing widget was
AnimatedSwitcher AnimatedSwitcher:file:///C:/dev/projects/issues/lib/main.dart:44:11
When the exception was thrown, this was the stack
#2      RenderStack._computeSize
package:flutter/…/rendering/stack.dart:541
#3      RenderStack.performLayout
package:flutter/…/rendering/stack.dart:597
#4      RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#5      ChildLayoutHelper.layoutChild
package:flutter/…/rendering/layout_helper.dart:56
#6      RenderFlex._computeSizes
package:flutter/…/rendering/flex.dart:829
#7      RenderFlex.performLayout
package:flutter/…/rendering/flex.dart:931
#8      RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#9      RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#10     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#11     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#12     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#13     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#14     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#15     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#16     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#17     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#18     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#19     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#20     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#21     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#22     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#23     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#24     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#25     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#26     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#27     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#28     RenderOffstage.performLayout
package:flutter/…/rendering/proxy_box.dart:3422
#29     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#30     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#31     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#32     _RenderTheatre.performLayout
package:flutter/…/widgets/overlay.dart:745
#33     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#34     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#35     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#36     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#37     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#38     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#39     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#40     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#41     RenderCustomPaint.performLayout
package:flutter/…/rendering/custom_paint.dart:545
#42     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#43     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#44     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#45     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#46     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#47     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#48     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#49     RenderProxyBoxMixin.performLayout
package:flutter/…/rendering/proxy_box.dart:116
#50     RenderObject.layout
package:flutter/…/rendering/object.dart:1858
#51     RenderView.performLayout
package:flutter/…/rendering/view.dart:165
#52     RenderObject._layoutWithoutResize
package:flutter/…/rendering/object.dart:1713
#53     PipelineOwner.flushLayout
package:flutter/…/rendering/object.dart:885
#54     RendererBinding.drawFrame
package:flutter/…/rendering/binding.dart:453
#55     WidgetsBinding.drawFrame
package:flutter/…/widgets/binding.dart:883
#56     RendererBinding._handlePersistentFrameCallback
package:flutter/…/rendering/binding.dart:319
#57     SchedulerBinding._invokeFrameCallback
package:flutter/…/scheduler/binding.dart:1143
#58     SchedulerBinding.handleDrawFrame
package:flutter/…/scheduler/binding.dart:1080
#59     SchedulerBinding.scheduleWarmUpFrame.<anonymous closure>
package:flutter/…/scheduler/binding.dart:863
(elided 13 frames from class _AssertionError, class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
The following RenderObject was being processed when the exception was fired: RenderStack#2a782 relayoutBoundary=up1 NEEDS-LAYOUT NEEDS-PAINT
RenderObject: RenderStack#2a782 relayoutBoundary=up1 NEEDS-LAYOUT NEEDS-PAINT
    parentData: offset=Offset(0.0, 0.0); flex=null; fit=null (can use size)
    constraints: BoxConstraints(0.0<=w<=392.7, 0.0<=h<=Infinity)
    size: MISSING
    alignment: Alignment.center
    textDirection: ltr
    fit: loose
════════════════════════════════════════════════════════════════════════════════
flutter doctor -v
[√] Flutter (Channel master, 2.5.0-7.0.pre.83, on Microsoft Windows [Version 10.0.19041.1110], locale ru-RU)
    • Flutter version 2.5.0-7.0.pre.83 at C:\dev\src\flutter
    • Upstream repository [email protected]:nt4f04und/flutter.git
    • FLUTTER_GIT_URL = [email protected]:nt4f04und/flutter.git
    • Framework revision 06be7e5392 (4 hours ago), 2021-08-15 14:37:02 -0400
    • Engine revision 1af0a20793
    • Dart version 2.15.0 (build 2.15.0-15.0.dev)

[!] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    • Android SDK at C:\Users\danya\AppData\Local\Android\sdk
    X cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    X Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.7.7)
    • Visual Studio at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
    • Visual Studio Community 2019 version 16.7.30621.155
    • Windows 10 SDK version 10.0.19041.0

[√] Android Studio (version 4.1)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] IntelliJ IDEA Community Edition (version 2020.3)
    • IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.3
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart

[√] VS Code (version 1.59.0)
    • VS Code at C:\Users\danya\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.25.0

[√] Connected device (4 available)
    • Redmi Note 5 (mobile)   • 40c9f14       • android-arm64  • Android 9 (API 28)
    • sdk gphone x86 (mobile) • emulator-5554 • android-x86    • Android 11 (API 30) (emulator)
    • Windows (desktop)       • windows       • windows-x64    • Microsoft Windows [Version 10.0.19041.1110]
    • Chrome (web)            • chrome        • web-javascript • Google Chrome 92.0.4515.131
    • Edge (web)              • edge          • web-javascript • Microsoft Edge 92.0.902.67

! Doctor found issues in 1 category.

Metadata

Metadata

Assignees

Labels

a: error messageError messages from the Flutter frameworkc: crashStack traces logged to the consolef: material designflutter/packages/flutter/material repository.found in release: 2.2Found to occur in 2.2found in release: 2.5Found to occur in 2.5frameworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onr: fixedIssue is closed as already fixed in a newer version

Type

No type

Projects

Status

Done (PR merged)

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions