Skip to content

markNeedsCompositingBitsUpdate fails after re-attaching a RepaintBoundary #24029

Description

@jamesderlin

I am able to trigger a reproducible assertion when adding (or removing) a padding argument to a Container and doing a hot-reload. Note that the assertion happens only during a hot-reload, not during a hot-restart nor when doing the initial flutter run.

I've tried to distill the reproduction case to be as small as possible. Note that the use of a GlobalKey, a GridView, and the BoxConstraints all seem to be relevant.

The failure

$ flutter run
Using hardware rendering with device Android SDK built for x86. If you get graphics artifacts, consider enabling software rendering with "--enable-software-rendering".
Launching lib/main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...                                           0.7s
Resolving dependencies...                                        1.8s
Gradle task 'assembleDebug'...                                   3.8s
Built build/app/outputs/apk/debug/app-debug.apk.
Installing build/app/outputs/apk/app.apk...                      0.8s
Syncing files to device Android SDK built for x86...
D/        (16785): HostConnection::get() New Host Connection established 0xde8a9fc0, tid 16811
D/EGL_emulation(16785): eglMakeCurrent: 0xe1205ca0: ver 2 0 (tinfo 0xcd0cf9e0)
 2.5s

🔥  To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R".
An Observatory debugger and profiler on Android SDK built for x86 is available at: http://127.0.0.1:46673/
For a more detailed help message, press "h". To detach, press "d"; to quit, press "q".

Initializing hot reload...                                      I/flutter (16785): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (16785): The following assertion was thrown building Container(constraints: BoxConstraints(0.0<=w<=Infinity,
I/flutter (16785): h=200.0)):
I/flutter (16785): 'package:flutter/src/rendering/object.dart': Failed assertion: line 1854 pos 12: '() {
I/flutter (16785):       final AbstractNode parent = this.parent;
I/flutter (16785):       if (parent is RenderObject)
I/flutter (16785):         return parent._needsCompositing;
I/flutter (16785):       return true;
I/flutter (16785):     }()': is not true.
I/flutter (16785):
I/flutter (16785): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter (16785): more information in this error message to help you determine and fix the underlying cause.
I/flutter (16785): In either case, please report this assertion by filing a bug on GitHub:
I/flutter (16785):   https://github.com/flutter/flutter/issues/new
I/flutter (16785):
I/flutter (16785): When the exception was thrown, this was the stack:
I/flutter (16785): #2      RenderObject.markNeedsCompositingBitsUpdate (package:flutter/src/rendering/object.dart:1854:12)
I/flutter (16785): #3      RenderObject.attach (package:flutter/src/rendering/object.dart:1294:7)
I/flutter (16785): #4      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin.attach (package:flutter/src/rendering/object.dart:2720:11)
I/flutter (16785): #5      AbstractNode.adoptChild (package:flutter/src/foundation/node.dart:132:13)
I/flutter (16785): #6      RenderObject.adoptChild (package:flutter/src/rendering/object.dart:1139:11)
I/flutter (16785): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin.child= (package:flutter/src/rendering/object.dart:2715:7)
I/flutter (16785): #8      SingleChildRenderObjectElement.insertChildRenderObject (package:flutter/src/widgets/framework.dart:4815:18)
I/flutter (16785): #9      RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:4659:35)
I/flutter (16785): #10     Element.attachRenderObject.<anonymous closure> (package:flutter/src/widgets/framework.dart:2856:13)
I/flutter (16785): #11     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3716:14)
I/flutter (16785): #12     Element.attachRenderObject (package:flutter/src/widgets/framework.dart:2855:5)
I/flutter (16785): #13     Element.attachRenderObject.<anonymous closure> (package:flutter/src/widgets/framework.dart:2856:13)
I/flutter (16785): #14     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3716:14)
I/flutter (16785): #15     Element.attachRenderObject (package:flutter/src/widgets/framework.dart:2855:5)
I/flutter (16785): #16     Element.attachRenderObject.<anonymous closure> (package:flutter/src/widgets/framework.dart:2856:13)
I/flutter (16785): #17     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3716:14)
I/flutter (16785): #18     Element.attachRenderObject (package:flutter/src/widgets/framework.dart:2855:5)
I/flutter (16785): #19     Element.attachRenderObject.<anonymous closure> (package:flutter/src/widgets/framework.dart:2856:13)
I/flutter (16785): #20     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3716:14)
I/flutter (16785): #21     Element.attachRenderObject (package:flutter/src/widgets/framework.dart:2855:5)
I/flutter (16785): #22     Element.attachRenderObject.<anonymous closure> (package:flutter/src/widgets/framework.dart:2856:13)
I/flutter (16785): #23     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3716:14)
I/flutter (16785): #24     Element.attachRenderObject (package:flutter/src/widgets/framework.dart:2855:5)
I/flutter (16785): #25     Element._activateWithParent (package:flutter/src/widgets/framework.dart:3003:5)
I/flutter (16785): #26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2928:18)
I/flutter (16785): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2739:12)
I/flutter (16785): #28     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4800:14)
I/flutter (16785): #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2936:14)
I/flutter (16785): #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2739:12)
I/flutter (16785): #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3662:5)
I/flutter (16785): #34     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3657:5)
I/flutter (16785): #35     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2936:14)
I/flutter (16785): #36     Element.updateChild (package:flutter/src/widgets/framework.dart:2739:12)
I/flutter (16785): #37     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4800:14)
I/flutter (16785): #38     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2936:14)
I/flutter (16785): #39     Element.updateChild (package:flutter/src/widgets/framework.dart:2739:12)
I/flutter (16785): #40     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #41     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #42     StatelessElement.update (package:flutter/src/widgets/framework.dart:3742:5)
I/flutter (16785): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #44     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #45     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #46     StatelessElement.update (package:flutter/src/widgets/framework.dart:3742:5)
I/flutter (16785): #47     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #48     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #49     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #50     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #51     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #52     StatelessElement.update (package:flutter/src/widgets/framework.dart:3742:5)
I/flutter (16785): #53     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #54     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #56     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #57     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #58     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #59     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #60     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #61     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #62     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #63     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #64     StatefulElement.update (package:flutter/src/widgets/framework.dart:3839:5)
I/flutter (16785): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #66     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #67     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #68     StatelessElement.update (package:flutter/src/widgets/framework.dart:3742:5)
I/flutter (16785): #69     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #70     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #71     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #72     StatefulElement.update (package:flutter/src/widgets/framework.dart:3839:5)
I/flutter (16785): #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #74     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #75     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #77     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #78     ProxyElement.update (package:flutter/src/widgets/framework.dart:3951:5)
I/flutter (16785): #79     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #80     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #81     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #82     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #83     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #84     StatefulElement.update (package:flutter/src/widgets/framework.dart:3839:5)
I/flutter (16785): #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #86     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #87     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #88     StatelessElement.update (package:flutter/src/widgets/framework.dart:3742:5)
I/flutter (16785): #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #90     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4807:14)
I/flutter (16785): #91     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #92     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #93     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #94     ProxyElement.update (package:flutter/src/widgets/framework.dart:3951:5)
I/flutter (16785): #95     Element.updateChild (package:flutter/src/widgets/framework.dart:2728:15)
I/flutter (16785): #96     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3693:16)
I/flutter (16785): #97     Element.rebuild (package:flutter/src/widgets/framework.dart:3530:5)
I/flutter (16785): #98     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2272:33)
I/flutter (16785): #99     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:673:20)
I/flutter (16785): #100    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:219:5)
I/flutter (16785): #101    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
I/flutter (16785): #102    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
I/flutter (16785): #103    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:751:7)
I/flutter (16785): #105    _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:382:19)
I/flutter (16785): #106    _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5)
I/flutter (16785): #107    _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
I/flutter (16785): (elided 3 frames from class _AssertionError and package dart:async)
I/flutter (16785): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1153 pos 12: 'child.parentData != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1153 pos 12: 'child.parentData != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1153 pos 12: 'child.parentData != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/foundation/node.dart': Failed assertion: line 106 pos 12: '_owner != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1153 pos 12: 'child.parentData != null': is not true.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 3532 pos 14: 'owner._debugCurrentBuildTarget == this': is not true.

Reloaded 1 of 416 libraries in 674ms.
I/flutter (16785): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 3532 pos 14: 'owner._debugCurrentBuildTarget == this': is not true.
I/flutter (16785): Another exception was thrown: NoSuchMethodError: The method '_enableMutationsToDirtySubtrees' was called on null.
I/flutter (16785): Another exception was thrown: NoSuchMethodError: The setter 'offset=' was called on null.
I/flutter (16785): Another exception was thrown: RenderBox was not laid out: RenderPadding#3ac5e NEEDS-PAINT DETACHED
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/box.dart': Failed assertion: line 1493 pos 18: 'debugDoingThisResize || debugDoingThisLayout ||
I/chatty  (16785): uid=10080(com.example.visibilitydetectorsample) Thread-2 identical 2 lines
I/flutter (16785): Another exception was thrown: 'package:flutter/src/rendering/box.dart': Failed assertion: line 1493 pos 18: 'debugDoingThisResize || debugDoingThisLayout ||
I/flutter (16785): Another exception was thrown: NoSuchMethodError: The getter 'offset' was called on null.

Application finished.

The code

import 'package:flutter/material.dart';

void main() {
  return runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      // XXX: Removing (or adding) the following line and doing a hot-reload
      //      triggers a framework assertion.  Hot restart is fine.
      padding: const EdgeInsets.all(5),
      child: Container(
        constraints: const BoxConstraints(minHeight: 200, maxHeight: 200),
        child: GridView.count(
          key: _myKey,
          crossAxisCount: 2,
          children: <Widget>[Placeholder(), Placeholder()],
        ),
      ),
    );
  }
}

final _myKey = LabeledGlobalKey('MyKey');

Doctor

$ flutter doctor -v

[✓] Flutter (Channel unknown, v0.10.2-pre.81, on Linux, locale en_US.UTF-8)
    • Flutter version 0.10.2-pre.81 at /home/jamesdlin/git/flutter/flutter
    • Framework revision 26131d917a (2 weeks ago), 2018-10-23 17:36:25 -0700
    • Engine revision 3236b49cea
    • Dart version 2.1.0 (build 2.1.0-dev.8.0 bf26f760b1)

[✓] Android toolchain - develop for Android devices (Android SDK 28.0.3)
    • Android SDK at /home/jamesdlin/Android/Sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /home/jamesdlin/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
    • All Android licenses accepted.

[✓] Android Studio (version 3.2)
    • Android Studio at /home/jamesdlin/android-studio
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)

[✓] VS Code (version 1.28.1)
    • VS Code at /usr/share/code
    • Flutter extension version 2.19.0

[✓] Connected device (1 available)
    • Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.1.0 (API 27) (emulator)

• No issues found!

Activity

  1. added
    c: crashStack traces logged to the console
    frameworkflutter/packages/flutter repository. See also f: labels.
    t: hot reloadReloading code during "flutter run"
    on Nov 9, 2018
  2. added this to the milestone on Nov 9, 2018
  3. goderbauer commented on Dec 4, 2018

    @goderbauer
    Member

    The example can be reduced to:

    import 'package:flutter/material.dart';
    
    void main() {
      return runApp(MyHomePage());
    }
    
    class MyHomePage extends StatelessWidget {
      MyHomePage({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          // XXX: Adding the following line and doing a hot-reload
          //      triggers a framework assertion.  Hot restart is fine.
          // padding: const EdgeInsets.all(50),
          child: Container(
            child: RepaintBoundary(
              key: _myKey,
            ),
          ),
        );
      }
    }
    
    final _myKey = LabeledGlobalKey('MyKey');
  4. self-assigned this
    on Dec 5, 2018
  5. goderbauer commented on Dec 5, 2018

    @goderbauer
    Member

    Notes from debugging this:

    Explanation of why the assert is throwing: The hot reload calls reassemble on all RenderObjects in the old pre-reload tree (here: RenderView and RenderRepaintBoundary). This sets _needsCompositingBitsUpdate to true on the RenderRepaintBoundary. After that, RenderRepaintBoundary is detached from the RenderView via dropChild and a new RenderPadding is adopted by the RenderView via adoptChild. Because RenderPadding is a new object it has neither needsCompositing nor _needsCompositingBitsUpdate set to true. Last, but not least, we re-attach the existing RenderRepaintBoundary to the new RenderPadding via adoptChild, which indirectly in [1] calls markNeedsCompositingBitsUpdate on the RenderRepaintBoundary. Because it's a repaint boundary and because the newly inserted parent RenderPadding doesn't have needsCompositing nor _needsCompositingBitsUpdate set to true the assert in there [2] fails.

    After adopting RenderRepaintBoundary as a child and thus after what's described above RenderPadding actually marks itself as needing a compositing bits update in the adoptChild [3] method, but at that point it's too late for the assert. (The fatal call to RenderRepaintBoundary.markNeedsCompositingBitsUpdate() occurs before this in the super.adoptChild of [3]).

    A test case that implements this failure case is posted below.

    [1]

    if (_needsCompositingBitsUpdate) {
    _needsCompositingBitsUpdate = false;
    markNeedsCompositingBitsUpdate();
    }

    [2]
    assert(() {
    final AbstractNode parent = this.parent;
    if (parent is RenderObject)
    return parent._needsCompositing;
    return true;
    }());

    [3]
    void adoptChild(RenderObject child) {
    assert(_debugCanPerformMutations);
    assert(child != null);
    setupParentData(child);
    super.adoptChild(child);
    markNeedsLayout();
    markNeedsCompositingBitsUpdate();
    markNeedsSemanticsUpdate();
    }

    Test case that currently fails because of this:

    test('Repaint boundary can get new parent after markNeedsCompositingBitsUpdate', () {
        // Regression test for https://github.com/flutter/flutter/issues/24029.
        final RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary();
        layout(repaintBoundary, phase: EnginePhase.flushSemantics);
    
        repaintBoundary.markNeedsCompositingBitsUpdate();
    
        renderer.renderView.child = null;
        final RenderPadding padding = RenderPadding(
          padding: const EdgeInsets.all(50),
        );
        renderer.renderView.child = padding;
        padding.child = repaintBoundary;
        pumpFrame(phase: EnginePhase.flushSemantics);
      });
  6. goderbauer commented on Dec 5, 2018

    @goderbauer
    Member

    One way to fix this would be to change the order in adoptChild [1] to call markNeedsCompositeBitsUpdate (and markNeedsLayout and markNeedsSemanticsUpdate?) before super.adoptChild to ensure that the markNeedsCompositeBitsUpdate on the Child (executed within super.adoptChild) finds an up to date parent. With that change all tests are still passing.

    Alternatively, we could change [2] line 1851 to also call parent.markNeedsCompositeBitsUpdate if we are a RepaintBoundary, but our parent has not yet set _needsCompositingBitsUpdate to true:

    if ((!isRepaintBoundary || !parent._needsCompositingBitsUpdate) && !parent.isRepaintBoundary) {
      parent.markNeedsCompositingBitsUpdate();
      return;
    }

    [1]

    void adoptChild(RenderObject child) {
    assert(_debugCanPerformMutations);
    assert(child != null);
    setupParentData(child);
    super.adoptChild(child);
    markNeedsLayout();
    markNeedsCompositingBitsUpdate();
    markNeedsSemanticsUpdate();
    }

    [2]

    void markNeedsCompositingBitsUpdate() {
    if (_needsCompositingBitsUpdate)
    return;
    _needsCompositingBitsUpdate = true;
    if (parent is RenderObject) {
    final RenderObject parent = this.parent;
    if (parent._needsCompositingBitsUpdate)
    return;
    if (!isRepaintBoundary && !parent.isRepaintBoundary) {
    parent.markNeedsCompositingBitsUpdate();
    return;
    }
    }
    assert(() {
    final AbstractNode parent = this.parent;
    if (parent is RenderObject)
    return parent._needsCompositing;
    return true;
    }());
    // parent is fine (or there isn't one), but we are dirty
    if (owner != null)
    owner._nodesNeedingCompositingBitsUpdate.add(this);
    }

  7. changed the title [-]"'package:flutter/src/rendering/object.dart': Failed assertion: line 1854 pos 12" when doing a hot reload[/-] [+]markNeedsCompositingBitsUpdate fails after re-attaching a RepaintBoundary[/+] on Dec 11, 2018
  8. added
    customer: crowdAffects or could affect many people, though not necessarily a specific customer.
    on Dec 11, 2018
  9. jamesderlin commented on Dec 14, 2018

    @jamesderlin
    ContributorAuthor

    I'm reopening since #25239 was reverted by #25382.

  10. github-actions commented on Aug 14, 2021

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  11. locked as resolved and limited conversation to collaborators on Aug 14, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

c: crashStack traces logged to the consolecustomer: crowdAffects or could affect many people, though not necessarily a specific customer.frameworkflutter/packages/flutter repository. See also f: labels.t: hot reloadReloading code during "flutter run"

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions