Skip to content

Hot restart with multiple FlutterEngines and non-default text scale triggers layout errors #179559

@mengyanshou

Description

@mengyanshou

Steps to reproduce

  1. Create a new Flutter project with the default example code (no changes to Dart code):

    flutter create multi_engine
  2. On Android, define two activities MainActivity and SecondaryActivity, both extending FlutterActivity, and each providing its own FlutterEngine with the same Dart entrypoint (main). Example:

    class MainActivity : FlutterActivity() {
    
        override fun onCreate(savedInstanceState: android.os.Bundle?) {
            super.onCreate(savedInstanceState)
            // get display list
            val displayManager = getSystemService(Context.DISPLAY_SERVICE) as android.hardware.display.DisplayManager
            val displays = displayManager.displays
            for (display in displays) {
                android.util.Log.d("MainActivity", "Display ID: ${display.displayId}, Name: ${display.name}")
                if (display.displayId != 0) {
                    // launch secondary activity for this display
                    val intent = android.content.Intent(this, SecondaryActivity::class.java)
                    intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK)
                    val option = android.app.ActivityOptions.makeBasic()
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        option.launchDisplayId = display.displayId
                    }
                    startActivity(intent, option.toBundle())
                }
            }
        }
    
        override fun provideFlutterEngine(context: Context): FlutterEngine {
            val loader = FlutterInjector.instance().flutterLoader()
            loader.startInitialization(this)
            val entrypoint = DartExecutor.DartEntrypoint(
                loader.findAppBundlePath(),
                "main"
            )
            val engine = FlutterEngine(context, null, false).apply {
                dartExecutor.executeDartEntrypoint(entrypoint)
            }
            return engine
        }
    }
    
    class SecondaryActivity : FlutterActivity() {
    
        override fun provideFlutterEngine(context: Context): FlutterEngine {
            val loader = FlutterInjector.instance().flutterLoader()
            loader.startInitialization(this)
            val entrypoint = DartExecutor.DartEntrypoint(
                loader.findAppBundlePath(),
                "main"
            )
            val engine = FlutterEngine(context, null, false).apply {
                dartExecutor.executeDartEntrypoint(entrypoint)
            }
            return engine
        }
    }
  3. Prepare an Android device/emulator that has two displays (e.g. an emulator with a secondary display attached).

Image
  1. On the device, set the system font scale to a smaller value (i.e. change the default text size to be smaller in system settings).
Image
  1. Run the Flutter app so that: - MainActivity is shown on the primary display. - SecondaryActivity is launched on the secondary display via ActivityOptions#setLaunchDisplayId.
  2. Wait for both activities to finish starting and show their Flutter UI.
  3. Trigger a hot restart from Flutter tools (e.g. flutter run hot restart, or from the IDE).
  4. Observe what happens on the primary display (MainActivity).

Note: Based on the behavior, starting two FlutterEngines from the same activity but showing them on different displays should also be able to reproduce the issue, as long as there are multiple engines and multiple displays, and the system font scale is not the default.

Expected results

  • After hot restart, both Flutter engines/activities continue to work correctly on their respective displays.
  • No assertion error is thrown from PlatformDispatcher or platform_dispatcher.dart.
  • All text is rendered correctly; no text layout/painting failures occur.
  • Using multiple FlutterActivity instances, each with its own FlutterEngine, on multiple displays with non-default font scale should be supported.

Actual results

  • On the first run, everything works as expected: both MainActivity and SecondaryActivity render correctly on their respective displays.

  • After performing a hot restart, the FlutterActivity on the first / primary display (MainActivity) throws an assertion error and the UI breaks.

  • The error is:

    _AssertionError ('dart:ui/platform_dispatcher.dart': Failed assertion: line 1525 pos 16: '<optimized out>': Flutter Error: incorrect configuration id: -2147483648.)
    
  • The assertion is in:

    flutter/bin/cache/pkg/sky_engine/lib/ui/platform_dispatcher.dart

    Specifically in _scaleAndMemoize:

    double? _scaleAndMemoize(int unscaledFontSize) {
      final int? configurationId = _configuration.configurationId;
      if (configurationId == null) {
        // The platform uses linear scaling, or the platform hasn't sent us a
        // configuration yet.
        return null;
      }
      final double? cachedValue = _cachedFontSizes?[unscaledFontSize];
      if (cachedValue != null) {
        assert(cachedValue >= 0);
        return cachedValue;
      }
    
      final double unscaledFontSizeDouble = unscaledFontSize.toDouble();
      final double fontSize = PlatformDispatcher._getScaledFontSize(
        unscaledFontSizeDouble,
        configurationId,
      );
      if (fontSize >= 0) {
        return (_cachedFontSizes ??= <int, double>{})[unscaledFontSize] = fontSize;
      }
      return unscaledFontSize;
      switch (fontSize) {
        case -1:
          // Invalid configuration id. This error can be unrecoverable as the
          // _getScaledFontSize function can be destructive.
          assert(false, 'Flutter Error: incorrect configuration id: $configurationId.');
        case final double errorCode:
          assert(false, 'Unknown error: GetScaledFontSize failed with $errorCode.');
      }
      return null;
    }
  • When debugging this line:

    final double fontSize = PlatformDispatcher._getScaledFontSize(
      unscaledFontSizeDouble,
      configurationId,
    );

    fontSize returns -1, and although configurationId becomes -2147483648 (which is expected for this configuration), the engine still treats this as an invalid configuration id after performing a hot restart with multiple FlutterEngines on different displays.

  • As a result, all text rendering in the affected FlutterActivity breaks (any widget that relies on text layout/painting fails and the UI becomes unusable).

  • This problem only appears after hot restart; a clean start works fine.

Code sample

See Steps to reproduce

A minimal reproducible repository is available here:

https://github.com/mengyanshou/multi_engine

Screenshots or Video

Image

Logs

Logs
/SettingsChannel(26283): Cannot find config with generation: -2147483648, the oldest config is now: -2147483647
E/FlutterJNI(26283): getScaledFontSize called with configurationId -2147483648, which can't be found.
E/SettingsChannel(26283): Cannot find config with generation: -2147483648, the oldest config is now: -2147483647
E/FlutterJNI(26283): getScaledFontSize called with configurationId -2147483648, which can't be found.
E/SettingsChannel(26283): Cannot find config with generation: -2147483648, the oldest config is now: -2147483647
E/FlutterJNI(26283): getScaledFontSize called with configurationId -2147483648, which can't be found.
E/SettingsChannel(26283): Cannot find config with generation: -2147483648, the oldest config is now: -2147483647
E/FlutterJNI(26283): getScaledFontSize called with configurationId -2147483648, which can't be found.

════════ Exception caught by rendering library ═════════════════════════════════
The following assertion was thrown during performLayout():
Flutter Error: incorrect configuration id: -2147483648.
'dart:ui/platform_dispatcher.dart':
Failed assertion: line 1525 pos 16: '<optimized out>'

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=02_bug.yml

The relevant error-causing widget was:
    Text Text:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:86:16

When the exception was thrown, this was the stack:
#2      PlatformDispatcher._scaleAndMemoize (dart:ui/platform_dispatcher.dart:1525:16)
#3      PlatformDispatcher.scaleFontSize (dart:ui/platform_dispatcher.dart:1483:14)
#4      SystemTextScaler.scale (package:flutter/src/widgets/media_query.dart:2082:56)
#5      _ClampedTextScaler.scale (package:flutter/src/painting/text_scaler.dart:130:31)
#6      TextStyle.getParagraphStyle (package:flutter/src/painting/text_style.dart:1419:28)
#7      TextPainter._createParagraphStyle (package:flutter/src/painting/text_painter.dart:1090:22)
#8      TextPainter._createParagraph (package:flutter/src/painting/text_painter.dart:1202:61)
#9      TextPainter.layout (package:flutter/src/painting/text_painter.dart:1264:64)
#10     RenderParagraph._layoutTextWithConstraints (package:flutter/src/rendering/paragraph.dart:852:9)
#11     RenderParagraph.performLayout (package:flutter/src/rendering/paragraph.dart:915:5)
#12     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#13     _RenderAppBarTitleBox.performLayout (package:flutter/src/material/app_bar.dart:2232:12)
#14     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#15     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#16     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#17     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:180:12)
#18     _ToolbarLayout.performLayout (package:flutter/src/widgets/navigation_toolbar.dart:136:31)
#19     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:249:7)
#20     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:420:14)
#21     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#22     RenderCustomSingleChildLayoutBox.performLayout (package:flutter/src/rendering/shifted_box.dart:1464:14)
#23     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#24     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#25     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1481:11)
#26     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#27     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:243:12)
#28     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#29     RenderPositionedBox.performLayout (package:flutter/src/rendering/shifted_box.dart:465:14)
#30     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#31     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#32     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#33     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#34     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#35     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#36     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1481:11)
#37     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#38     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#39     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#40     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#41     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#42     RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:293:14)
#43     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#44     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:180:12)
#45     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1041:22)
#46     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:249:7)
#47     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:420:14)
#48     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#49     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#50     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#51     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#52     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1481:11)
#53     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#54     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#55     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#56     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#57     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#58     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#59     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#60     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#61     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#62     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#63     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#64     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#65     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#66     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#67     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#68     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#69     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#70     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#72     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#74     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#75     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#85     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3848:13)
#86     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#87     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#88     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#89     _RenderTheaterMixin.layoutChild (package:flutter/src/widgets/overlay.dart:1084:13)
#90     _RenderTheater.performLayout (package:flutter/src/widgets/overlay.dart:1429:9)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#92     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#93     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#94     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#98     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#99     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:574:11)
#100    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#101    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#102    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#105    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#106    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#107    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#108    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#109    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#110    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#111    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
#112    RenderObject.layout (package:flutter/src/rendering/object.dart:2775:7)
#113    RenderView.performLayout (package:flutter/src/rendering/view.dart:294:12)
#114    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2623:7)
#115    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1170:18)
#116    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1183:15)
#117    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:629:23)
#118    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1264:13)
#119    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#120    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15)
#121    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9)
#122    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1057:9)
#123    PlatformDispatcher.scheduleWarmUpFrame.<anonymous closure> (dart:ui/platform_dispatcher.dart:906:16)
#127    _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 5 frames from class _AssertionError, class _Timer, and dart:async-patch)

The following RenderObject was being processed when the exception was fired: RenderParagraph#f5122 relayoutBoundary=up14 NEEDS-LAYOUT NEEDS-PAINT
    parentData: offset=Offset(0.0, 0.0) (can use size)
    constraints: BoxConstraints(0.0<=w<=379.4, 0.0<=h<=Infinity)
    size: MISSING
    textAlign: start
    textDirection: ltr
    softWrap: no wrapping except at line break characters
    overflow: ellipsis
    textScaler: SystemTextScaler (0.85x) clamped [0.0, 1.34]
    locale: en_US
    maxLines: unlimited
    text: TextSpan
        debugLabel: ((englishLike titleLarge 2021).merge((blackMountainView titleLarge).apply)).copyWith
        inherit: false
        color: Color(alpha: 1.0000, red: 0.1137, green: 0.1059, blue: 0.1255, colorSpace: ColorSpace.sRGB)
        family: Roboto
        size: 22.0
        weight: 400
        letterSpacing: 0.0
        baseline: alphabetic
        height: 1.3x
        leadingDistribution: even
        decoration: Color(alpha: 1.0000, red: 0.1137, green: 0.1059, blue: 0.1255, colorSpace: ColorSpace.sRGB) TextDecoration.none
        "Flutter Demo Home Page"
RenderObject: RenderParagraph#f5122 relayoutBoundary=up14 NEEDS-LAYOUT NEEDS-PAINT
    parentData: offset=Offset(0.0, 0.0) (can use size)
    constraints: BoxConstraints(0.0<=w<=379.4, 0.0<=h<=Infinity)
    size: MISSING
    textAlign: start
    textDirection: ltr
    softWrap: no wrapping except at line break characters
    overflow: ellipsis
    textScaler: SystemTextScaler (0.85x) clamped [0.0, 1.34]
    locale: en_US
    maxLines: unlimited
    text: TextSpan
        debugLabel: ((englishLike titleLarge 2021).merge((blackMountainView titleLarge).apply)).copyWith
        inherit: false
        color: Color(alpha: 1.0000, red: 0.1137, green: 0.1059, blue: 0.1255, colorSpace: ColorSpace.sRGB)
        family: Roboto
        size: 22.0
        weight: 400
        letterSpacing: 0.0
        baseline: alphabetic
        height: 1.3x
        leadingDistribution: even
        decoration: Color(alpha: 1.0000, red: 0.1137, green: 0.1059, blue: 0.1255, colorSpace: ColorSpace.sRGB) TextDecoration.none
        "Flutter Demo Home Page"
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: RenderParagraph#f5122 relayoutBoundary=up14 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2251 pos 12: 'hasSize'
The relevant error-causing widget was:
    AppBar AppBar:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:79:15
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: _RenderAppBarTitleBox#28d0b relayoutBoundary=up13 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2251 pos 12: 'hasSize'
The relevant error-causing widget was:
    AppBar AppBar:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:79:15
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: RenderSemanticsAnnotations#86513 relayoutBoundary=up12 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2251 pos 12: 'hasSize'
The relevant error-causing widget was:
    AppBar AppBar:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:79:15
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
Flutter Error: incorrect configuration id: -2147483648.
'dart:ui/platform_dispatcher.dart':
Failed assertion: line 1525 pos 16: '<optimized out>'
The relevant error-causing widget was:
    Text Text:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:107:19
The following RenderObject was being processed when the exception was fired: RenderParagraph#162c2 relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT
RenderObject: RenderParagraph#162c2 relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
RenderBox was not laid out: RenderParagraph#162c2 relayoutBoundary=up3 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2251 pos 12: 'hasSize'
The relevant error-causing widget was:
    Column Column:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:91:16
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
'package:flutter/src/rendering/shifted_box.dart': Failed assertion: line 354 pos 12: 'child!.hasSize': is not true.
The relevant error-causing widget was:
    Center Center:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:88:13
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
Flutter Error: incorrect configuration id: -2147483648.
'dart:ui/platform_dispatcher.dart':
Failed assertion: line 1525 pos 16: '<optimized out>'
The relevant error-causing widget was:
    Text Text:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:107:19
The following RenderObject was being processed when the exception was fired: RenderParagraph#162c2 relayoutBoundary=up3
RenderObject: RenderParagraph#162c2 relayoutBoundary=up3
════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by rendering library ═════════════════════════════════
Flutter Error: incorrect configuration id: -2147483648.
'dart:ui/platform_dispatcher.dart':
Failed assertion: line 1525 pos 16: '<optimized out>'
The relevant error-causing widget was:
    Text Text:file:///Users/lori/Desktop/nightmare-app/multi_engine/lib/main.dart:86:16
The following RenderObject was being processed when the exception was fired: RenderParagraph#f5122 relayoutBoundary=up14
RenderObject: RenderParagraph#f5122 relayoutBoundary=up14
════════════════════════════════════════════════════════════════════════════════

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.38.4, on macOS 26.2 25C5048a darwin-arm64, locale zh-Hans-CN) [131ms]
    • Flutter version 3.38.4 on channel stable at /Users/lori/SDK/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 66dd93f9a2 (4 days ago), 2025-12-03 14:56:10 -0800
    • Engine revision a5cb96369e
    • Dart version 3.10.3
    • DevTools version 2.51.1
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android,
      enable-ios, cli-animations, enable-native-assets, omit-legacy-version-file, enable-lldb-debugging

[!] Android toolchain - develop for Android devices (Android SDK version 36.0.0) [366ms]
    • Android SDK at /Volumes/Mac/Android/sdk
    • Emulator version 35.4.9.0 (build_id 13025442) (CL:N/A)
    ✗ cmdline-tools component is missing.
      Try installing or updating Android Studio.
      Alternatively, download the tools from https://developer.android.com/studio#command-line-tools-only and make sure to set
      the ANDROID_HOME environment variable.
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/to/macos-android-setup for more details.

[!] Xcode - develop for iOS and macOS [641ms]
    ✗ Xcode installation is incomplete; a full installation is necessary for iOS and macOS development.
      Download at: https://developer.apple.com/xcode/
      Or install Xcode via the App Store.
      Once installed, run:
        sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
        sudo xcodebuild -runFirstLaunch
    • CocoaPods version 1.16.2

[✓] Chrome - develop for the web [29ms]
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[!] Proxy Configuration [29ms]
    • HTTP_PROXY is set
    ! NO_PROXY is not set

[✓] Connected device (5 available) [1,565ms]
    • OPD2413 (mobile)                     • 192.168.31.171:5555 • android-arm64  • Android 15 (API 35)
    • PLK110 (mobile)                      • 192.168.31.219:5555 • android-arm64  • Android 16 (API 36)
    • Android SDK built for arm64 (mobile) • emulator-5556       • android-arm64  • Android 15 (API 35) (emulator)
    • macOS (desktop)                      • macos               • darwin-arm64   • macOS 26.2 25C5048a darwin-arm64
    • Chrome (web)                         • chrome              • web-javascript • Google Chrome 142.0.7444.176

[✓] Network resources [3.7s]
    • All expected network resources are available.

! Doctor found issues in 3 categories.

Metadata

Metadata

Assignees

No one assigned

    Labels

    a: error messageError messages from the Flutter frameworkengineflutter/engine related. See also e: labels.found in release: 3.38Found to occur in 3.38found in release: 3.40Found to occur in 3.40has reproducible stepsThe issue has been confirmed reproducible and is ready to work onplatform-androidAndroid applications specificallyr: fixedIssue is closed as already fixed in a newer versiont: hot reloadReloading code during "flutter run"team-androidOwned by Android platform teamtoolAffects the "flutter" command-line tool. See also t: labels.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions