Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exception on ExpansionPanel toggle due to Duplicate Global Keys #13780

Closed
Monotoba opened this issue Dec 28, 2017 · 32 comments · Fixed by #31228
Closed

Exception on ExpansionPanel toggle due to Duplicate Global Keys #13780

Monotoba opened this issue Dec 28, 2017 · 32 comments · Fixed by #31228
Labels
c: crash Stack traces logged to the console f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.

Comments

@Monotoba
Copy link

Monotoba commented Dec 28, 2017

This most likely is me doing something wrong. However, I thought I had this working... I get this error when trying to add a column with content to an ExpansionPanel. The error only occurs at runtime when I try to expand more than one panel at a time. The app is a simple one inspired by the holidays. It is a simple Holiday Shopping List. It contains an image and text in the top 40% of the page. In the remaining 60% or so, it contains a ListView with a Container ->Column>Row->Columns. The app is laid out as a dynamically generated list of Giftees (people we are shopping for), each contains a sub-list of gifts (gift we may purchase. I want to embed an few IconButtons but the Panel header can't handle that. It runs out of room. So I removed them.

If you need the code for this. let me know.

[+12406 ms] I/flutter (23691): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
[   +4 ms] I/flutter (23691): The following assertion was thrown building ExpansionPanelList:
[        ] I/flutter (23691): 'package:flutter/src/material/mergeable_material.dart': Failed assertion: line 441: '_children[j] is
[        ] I/flutter (23691): MaterialGap': is not true.
[  +12 ms] I/flutter (23691):
[        ] I/flutter (23691): Either the assertion indicates an error in the framework itself, or we should provide substantially
[        ] I/flutter (23691): more information in this error message to help you determine and fix the underlying cause.
[        ] I/flutter (23691): In either case, please report this assertion by filing a bug on GitHub:
[        ] I/flutter (23691):   https://github.com/flutter/flutter/issues/new
[        ] I/flutter (23691):
[        ] I/flutter (23691): When the exception was thrown, this was the stack:
[  +10 ms] I/flutter (23691): #2      _MergeableMaterialState.didUpdateWidget (package:flutter/src/material/mergeable_material.dart:441)
[        ] I/flutter (23691): #3      StatefulElement.update (package:flutter/src/widgets/framework.dart:3677)
[        ] I/flutter (23691): #4      Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #6      Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #7      StatelessElement.update (package:flutter/src/widgets/framework.dart:3606)
[        ] I/flutter (23691): #8      Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #9      SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #10     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #11     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #12     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #13     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #14     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #15     StatelessElement.update (package:flutter/src/widgets/framework.dart:3606)
[        ] I/flutter (23691): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #18     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #19     ProxyElement.update (package:flutter/src/widgets/framework.dart:3791)
[        ] I/flutter (23691): #20     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #22     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #23     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
[        ] I/flutter (23691): #24     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #25     SliverMultiBoxAdaptorElement.performRebuild (package:flutter/src/widgets/sliver.dart:696)
[        ] I/flutter (23691): #26     SliverMultiBoxAdaptorElement.update (package:flutter/src/widgets/sliver.dart:665)
[        ] I/flutter (23691): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #29     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #30     ProxyElement.update (package:flutter/src/widgets/framework.dart:3791)
[        ] I/flutter (23691): #31     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #32     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #33     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #34     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4261)
[        ] I/flutter (23691): #35     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4647)
[        ] I/flutter (23691): #36     _ViewportElement.update (package:flutter/src/widgets/viewport.dart:182)
[        ] I/flutter (23691): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #39     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #40     ProxyElement.update (package:flutter/src/widgets/framework.dart:3791)
[        ] I/flutter (23691): #41     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #42     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #44     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #45     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #46     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #47     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #48     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #49     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #50     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
[        ] I/flutter (23691): #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #52     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #53     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #54     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #56     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4539)
[        ] I/flutter (23691): #57     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #58     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[   +1 ms] I/flutter (23691): #59     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #60     StatelessElement.update (package:flutter/src/widgets/framework.dart:3606)
[        ] I/flutter (23691): #61     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #62     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #63     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #64     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
[        ] I/flutter (23691): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #66     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #67     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #68     StatefulElement.update (package:flutter/src/widgets/framework.dart:3681)
[        ] I/flutter (23691): #69     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #70     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #71     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #72     ProxyElement.update (package:flutter/src/widgets/framework.dart:3791)
[        ] I/flutter (23691): #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #74     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #75     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #76     StatelessElement.update (package:flutter/src/widgets/framework.dart:3606)
[        ] I/flutter (23691): #77     Element.updateChild (package:flutter/src/widgets/framework.dart:2649)
[        ] I/flutter (23691): #78     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3556)
[        ] I/flutter (23691): #79     Element.rebuild (package:flutter/src/widgets/framework.dart:3445)
[        ] I/flutter (23691): #80     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2193)
[   +2 ms] I/flutter (23691): #81     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:611)
[        ] I/flutter (23691): #82     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:203)
[        ] I/flutter (23691): #83     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:916)
[        ] I/flutter (23691): #84     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:856)
[        ] I/flutter (23691): #85     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:768)
[        ] I/flutter (23691): #86     _invoke (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:113)
[        ] I/flutter (23691): #87     _drawFrame (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:102)
[   +5 ms] I/flutter (23691): (elided 2 frames from class _AssertionError)
[        ] I/flutter (23691): ════════════════════════════════════════════════════════════════════════════════════════════════════

Steps to Reproduce

Please tell us what you were doing and what went wrong. If you are running flutter tools from the command line, please try adding the -v or --verbose option to gather more information.

If the problem is with your application's rendering, please attach a screenshot and any relevant source code.
If you are getting an exception in the logs, and your code is implicated in the first few frames, then please include the source code for the functions involved.

Logs

Run your application with flutter run and attach all the log output.

Run flutter analyze and attach any output of that command also.

dev:~/projects/flutter/holiday_shoping_list$ flutter analyze
Analyzing /home/projects/flutter/holiday_shoping_list...
No issues found!Ran in 4.9s

Flutter Doctor

Paste the output of running flutter doctor here.

$ flutter doctor[✓] Flutter (on Linux, locale en_US.UTF-8, channel alpha)
    • Flutter at /home/randy/flutter    • Framework revision 8f65fec5f5 (2 weeks ago), 2017-12-12 09:50:14 -0800
    • Engine revision edaecdc8b8    • Tools Dart version 1.25.0-dev.11.0
    • Engine Dart version 2.0.0-edge.d8ae797298c3a6cf8dc9f4558707bd2672224d3e
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.1)
    • Android SDK at /home/randy/Android/Sdk
    • Android NDK at /home/randy/Android/Sdk/ndk-bundle
    • Platform android-27, build-tools 27.0.1
    • Java binary at: /opt/android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)

[✓] Android Studio (version 3.0)
    • Android Studio at /opt/android-studio
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)

[-] IntelliJ IDEA Community Edition (version 15)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • For information about installing plugins, see
      https://flutter.io/intellij-setup/#installing-the-plugins
    ✗ This install is older than the minimum recommended version of 2017.1.0.

[-] IntelliJ IDEA Community Edition (version 13)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
    • For information about installing plugins, see
      https://flutter.io/intellij-setup/#installing-the-plugins
    ✗ This install is older than the minimum recommended version of 2017.1.0.

[✓] IntelliJ IDEA Community Edition (version 2017.2)
    • Flutter plugin version 19.1
    • Dart plugin version 172.4343.25

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

For more information about diagnosing and reporting Flutter bugs, please see https://flutter.io/bug-reports/.

@lejard-h
Copy link

I had the same issue today with ExpansionPanel, it seems to happen when ExpansionPanel.isExpanded == true during the first build

@lejard-h
Copy link

lejard-h commented Mar 14, 2018

I am also getting this

+329 ms] I/flutter (10245): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
[   +1 ms] I/flutter (10245): The following assertion was thrown while finalizing the widget tree:
[        ] I/flutter (10245): Duplicate GlobalKeys detected in widget tree.
[        ] I/flutter (10245): The following GlobalKeys were specified multiple times in the widget tree. This will lead to parts
[        ] I/flutter (10245): of the widget tree being truncated unexpectedly, because the second time a key is seen, the previous
[        ] I/flutter (10245): instance is moved to the new location. The keys were:
[        ] I/flutter (10245): - _MergeableMaterialSliceKey([<ExpansionPanelList> <2>])
[        ] I/flutter (10245):   _MergeableMaterialSliceKey([<ExpansionPanelList> <0>])
[        ] I/flutter (10245):   _MergeableMaterialSliceKey([<ExpansionPanelList> <4>])
[        ] I/flutter (10245): This was determined by noticing that after widgets with the above global keys were moved out of
[        ] I/flutter (10245): their previous parent, that previous parent never updated during this frame, meaning that it either
[        ] I/flutter (10245): did not update at all or updated before the widgets were moved, in either case implying that it
[        ] I/flutter (10245): still thinks that it should have a child with those global keys.
[        ] I/flutter (10245): The specific parent that did not update after having one or more children forcibly removed due to
[        ] I/flutter (10245): GlobalKey reparenting is:
[        ] I/flutter (10245): - DefaultTextStyle(debugLabel: (englishLike body1).merge(blackMountainView body1), inherit: false,
[        ] I/flutter (10245):   color: Color(0xdd000000), family: Roboto, size: 14.0, weight: 400, baseline: alphabetic,
[        ] I/flutter (10245):   decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip) (3 different
[        ] I/flutter (10245):   affected elements had this toString representation)
[        ] I/flutter (10245): A GlobalKey can only be specified on one widget at a time in the widget tree.
[   +3 ms] I/flutter (10245): 
[        ] I/flutter (10245): When the exception was thrown, this was the stack:
[        ] I/flutter (10245): #0      BuildOwner.finalizeTree.<anonymous closure> (package:flutter/src/widgets/framework.dart:2369:15)
[        ] I/flutter (10245): #1      BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:2390:8)
[        ] I/flutter (10245): #2      BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:623:18)
[        ] I/flutter (10245): #3      BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208:5)
[   +1 ms] I/flutter (10245): #4      BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
[        ] I/flutter (10245): #5      BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
[        ] I/flutter (10245): #6      BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:751:7)
[        ] I/flutter (10245): #8      _Timer._runTimers (dart:isolate-patch/dart:isolate/timer_impl.dart:382)
[        ] I/flutter (10245): #9      _Timer._handleMessage (dart:isolate-patch/dart:isolate/timer_impl.dart:416)
[        ] I/flutter (10245): #10     _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:165)
[        ] I/flutter (10245): (elided one frame from package dart:async-patch)
[        ] I/flutter (10245): ════════════════════════════════════════════════════════════════════════════════════════════════════
[   +1 ms] ext.ui.window.scheduleFrame: {isolateId: isolates/1052237255}

Adding my own key to the ExpansionPanelList seems to solve the issue

@Hixie Hixie added c: crash Stack traces logged to the console framework flutter/packages/flutter repository. See also f: labels. f: material design flutter/packages/flutter/material repository. labels Jun 11, 2018
@Hixie Hixie added this to the Goals milestone Jun 11, 2018
@FlutterIODev
Copy link

FlutterIODev commented Oct 16, 2018

Today I faced the same error:

package:flutter/src/material/mergeable_material.dart': _children[j] is MaterialGap : is not true.

When I investigate more in my code, I found the reason for this error:

I have items list in a shared class across my app.

In the build method of the first page in my app, I fill the list with the required elements ( before return the MaterialApp ).

In the home of the MaterialApp I have a stateful widget that has a ListView and inside this ListView I have a ExpansionPanelList that use my shared item list in order to create the children of the ExpansionPanelList.

When running the application for the first time there is no issue, but when I click hot reload, my list item filled again (this is my bug, I moved the filling code to the initState method) and then when flutter trying to recreate the ExpansionPanelList I got this error ( _children[j] is MaterialGap : is not true.).

I just shared what's happening to me, in order if you can take advantages from it.

Thanks.

Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel dev, v0.8.2, on Microsoft Windows [Version 10.0.17134.345], locale ar-SA)
[√] Android toolchain - develop for Android devices (Android SDK 28.0.2)
[√] Android Studio (version 3.1)
[√] IntelliJ IDEA Community Edition (version 2018.2)
[!] VS Code, 64-bit edition (version 1.27.2)
[√] Connected devices (1 available)

! Doctor found issues in 1 category.

@zoechi
Copy link
Contributor

zoechi commented Oct 16, 2018

@FlutterIODev Can you please create a runnable minimal production (main.dart)?

@FlutterIODev
Copy link

Of course I will create a runnable example ASAP.

@FlutterIODev
Copy link

FlutterIODev commented Oct 17, 2018

@FlutterIODev Can you please create a runnable minimal production (main.dart)?

@zoechi , Here a small example that describes the error when happening to me.

After starting the program try to press hot reload and then expand and collapse the panels.

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    title: "test",
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Item> items = [];

  Widget _buildPanel() {
    return ExpansionPanelList(
      children: _buildLevelsPanels(),
      expansionCallback: (int panelIndex, bool isExpanded) {
        bool newValue = !items[panelIndex].isExpanded;
        items[panelIndex].isExpanded = newValue;
        setState(() {
          isExpanded = newValue;
        });
      },
    );
  }

  List<ExpansionPanel> _buildLevelsPanels() {
    List<ExpansionPanel> result = [];
    items.forEach((Item item) {
      result.add(ExpansionPanel(
          headerBuilder: (BuildContext context, bool isExpanded) => ListTile(
                title: Text(
                  item.id.toString(),
                  textAlign: TextAlign.center,
                ),
                onTap: () {
                  setState(() {
                    item.isExpanded = !item.isExpanded;
                  });
                },
              ),
          body: Text("Hello"),
          isExpanded: item.isExpanded));
    });
    return result;
  }

  @override
  Widget build(BuildContext context) {
    items.addAll(List.generate(5, (int index) => Item(index)));

    return Scaffold(
      appBar: AppBar(),
      body: ListView(
        children: [
          _buildPanel(),
        ],
      ),
    );
  }
}

class Item {
  final int id;
  bool isExpanded = true;
  Item(this.id);
}

@vipinagrahari
Copy link

Any updates on this? I am also facing same issue.

@zoechi
Copy link
Contributor

zoechi commented Jan 31, 2019

I'm not sure what exactly causes the issue but having this line in build()

items.addAll(List.generate(5, (int index) => Item(index)));

looks like a really bad idea
and removing that line and moving it to initState() for example fixes the issue.

Build is called frequently and adding items when build happens doesn't make sense.
It's also in general a bad idea doing stuff in build() other than building the widget tree.

@zoechi
Copy link
Contributor

zoechi commented Jan 31, 2019

I closed #24210 as duplicate because this has more upvotes but #24210 has a good reproduction example like #24210 (comment)

@jmeberst
Copy link

jmeberst commented Feb 2, 2019

I had the same issue today with ExpansionPanel, it seems to happen when ExpansionPanel.isExpanded == true during the first build

I'm seeing the exact same thing, if I leave the initial state of all my Expansion Panels to false everything is fine. If I set any of them to true I get the exception when opening the collapsed panel.

@kuprel
Copy link

kuprel commented Feb 11, 2019

I had the same problem using MergeableMaterial and was able to get it working by having a different key for a prepended MaterialGap vs. an appended MaterialGap. The ExpansionPanel widget has the same key for both a prepended and appended MaterialGap.

bool shouldAppendGap(Panel item) =>
    item != visibleItems.last && item.isExpanded;

bool shouldPrependGap(Panel item) =>
    item != visibleItems.first && item.isExpanded;

MaterialGap appendGap(Panel item) => MaterialGap(
      key: ValueKey<int>(context.hashCode ^ item.hashCode ^ 'post'.hashCode),
    );

MaterialGap prependGap(Panel item) => MaterialGap(
      key: ValueKey<int>(context.hashCode ^ item.hashCode ^ 'pre'.hashCode),
    );

Iterable<MergeableMaterialItem> buildItems(Panel item) => item.isVisible
    ? <MergeableMaterialItem>[
        shouldPrependGap(item) && !shouldAppendGap(prev(item))
            ? prependGap(item)
            : null,
        buildItem(item),
        shouldAppendGap(item) ? appendGap(item) : null
      ].whereType<MergeableMaterialItem>()
    : const <MergeableMaterialItem>[];

@override
MergeableMaterial build(BuildContext context) => MergeableMaterial(
      hasDividers: true,
      children:
          widget.children.expand<MergeableMaterialItem>(buildItems).toList(),
    );

@HustLion
Copy link

It seems changing the number of children of ExpansionPanelList using state change would cause this error. A workaround that suits my use case for now is prepopulating the desired number of children for the ExpansionPanelList.

@shihaohong shihaohong self-assigned this Mar 30, 2019
@shihaohong
Copy link
Contributor

shihaohong commented Apr 1, 2019

As far as I can tell, it appears that issue may be arising from misusing the ExpansionPanelList and ExpansionPanel widgets.

@Monotoba could you please share some code to reproduce your error?
@FlutterIODev your issue seems to be appearing from adding to your item list in your build method, as zoechi previously described. The logic in your setState function is not necessary, since your state update was made in the lines preceding it:

        bool newValue = !items[panelIndex].isExpanded;
        items[panelIndex].isExpanded = newValue;
        setState(() {
          isExpanded = newValue; // this line is not necessary
        });

My current goal would be to update the API docs to have a clear example on how to use ExpansionPanel, and also link it to the example app in flutter_gallery.

@hawkinsjb1
Copy link

I am getting the same thing using a Streambuilder to provide the List data for the expansion list. I want to add a new item to the ExpansionPanel children list and also have it expanded, the new widget is rendered correctly and expanded, but the next time setState() is called for any reason, I get
The following assertion was thrown building ExpansionPanelList(dependencies: [_InheritedTheme,_LocalizationsScope-[GlobalKey#1f7b1]], state: _ExpansionPanelListState#2ee0d): 'package:flutter/src/material/mergeable_material.dart': Failed assertion: line 443 pos 18: '_children[j] is MaterialGap': is not true.

After collapsing the new child, or calling setState() again, the error disappears.

I can also avoid the error completely if I collapse the new child before calling setState().

It feels like dynamically adding expanded items to a pre-existing ExpansionPanelList children doesn't work properly, is there any clarification regarding this? I am following the samples closely apart from having a StreamBuilder that feeds the list

@shihaohong
Copy link
Contributor

@hawkinsjb1 Could you share a minimal code sample where I can reproduce the problem?

@HansMuller HansMuller added the waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds label Apr 3, 2019
@krooq
Copy link

krooq commented Apr 7, 2019

@hawkinsjb1 I have the exact same issue.
Using expansion panel list radio inside a stream builder.

If another panel is expanded and a new item is added to the list adjacent to the expanded panel, attempting to expand the new item causes this error.

It appears when the framework attempts to layout the list it expects there to be a gap above and below the currently expanded item, however adding the item to the list doesn't rebuild the ExpansionPanelList, you should be able to see that there will be no gap between your dynamically added item and the expanded panel.

I worked around this by providing a ValueKey that was the length of the list, e.g.
ExpansionPanelList.radio(key: ValueKey(listData.length), ...)

@shihaohong
Copy link
Contributor

@krooq Could you share a code sample that reproduces the problem?

@ehhc
Copy link

ehhc commented Apr 9, 2019

Hi together,
i fear i have the same problem and am clueless what i am doing wrong.. You'll find my code following. To reproduce the error, simply quickly close & re-open the first panel.

I'm aware that my code looks a bit strange (e.g. not using a FutureBuilde) but that's monestly because i tried to delete everything not needed to reproduce the error..

I would be thankful for every help :)

Code:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: EmergencyViewPage(),
    );
  }
}

class EmergencyViewPage extends StatefulWidget {
  @override
  EmergencyViewPageState createState() {
    return EmergencyViewPageState();
  }
}

class EmergencyViewPageState extends State<EmergencyViewPage> {
  String _emergency;

  List _panelExpansionState = [
    true,
    false,
    false,
  ];

  @override
  void initState() {
    // this is only a dummy replacement for loading the emergency from the server
    Future.delayed(Duration(seconds: 2), () {
      setState(() {
        _emergency = "Test";
      });
    });
    super.initState();
  }

  _tapHeader(int index) {
    setState(() {
      _panelExpansionState[index] = !_panelExpansionState[index];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: LayoutBuilder(
        builder: (context, snapshot) {
          if (_emergency != null) {
            return Scrollbar(
              child: SingleChildScrollView(
                padding: EdgeInsets.all(10),
                child: ExpansionPanelList(
                  expansionCallback: (index, _) => _tapHeader(index),
                  children: [
                    ExpansionPanel(
                      isExpanded: _panelExpansionState[0],
                      headerBuilder: (c, v) {
                        return ListTile(
                          title: Text(
                            "0",
                            style: TextStyle(fontWeight: FontWeight.bold),
                          ),
                          // onTap: () => _tapHeader(0),
                        );
                      },
                      body: Text("0"),
                    ),
                    ExpansionPanel(
                      isExpanded: _panelExpansionState[1],
                      headerBuilder: (c, v) {
                        return ListTile(
                          title: Text(
                            "1",
                            style: TextStyle(fontWeight: FontWeight.bold)),
                          // onTap: () => _tapHeader(1),
                        );
                      },
                      body: Text("1"),
                    ),
                    ExpansionPanel(
                      isExpanded: _panelExpansionState[2],
                      headerBuilder: (c, v) {
                        return ListTile(
                          title: Text(
                            "2",
                            style: TextStyle(fontWeight: FontWeight.bold)),
                          // onTap: () => _tapHeader(2),
                        );
                      },
                      body: Text("2"),
                    ),
                  ],
                ),
              ),
            );
          } else {
            return Center(
              child: new Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  new CircularProgressIndicator(),
                  new Text("Loading..."),
                ],
              ),
            );
          }
        },
      ),
    );
  }
}

Error:

I/flutter (21453): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (21453): The following assertion was thrown building DefaultTextStyle(debugLabel: (englishLike body1
I/flutter (21453): 2014).merge(blackMountainView body1), inherit: false, color: Color(0xdd000000), family: Roboto,
I/flutter (21453): size: 14.0, weight: 400, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping
I/flutter (21453): at box width, overflow: clip):
I/flutter (21453): Multiple widgets used the same GlobalKey.
I/flutter (21453): The key _MergeableMaterialSliceKey([<ExpansionPanelList(state: _ExpansionPanelListState#de622)>
I/flutter (21453): <2>]) was used by multiple widgets. The parents of those widgets were different widgets that both
I/flutter (21453): had the following description:
I/flutter (21453):   DefaultTextStyle(debugLabel: (englishLike body1 2014).merge(blackMountainView body1), inherit:
I/flutter (21453):   false, color: Color(0xdd000000), family: Roboto, size: 14.0, weight: 400, baseline: alphabetic,
I/flutter (21453):   decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)
I/flutter (21453): A GlobalKey can only be specified on one widget at a time in the widget tree.
I/flutter (21453): 
I/flutter (21453): When the exception was thrown, this was the stack:
I/flutter (21453): #0      GlobalKey._debugReserveFor.<anonymous closure> (package:flutter/src/widgets/framework.dart:190:9)
I/flutter (21453): #1      GlobalKey._debugReserveFor (package:flutter/src/widgets/framework.dart:200:6)
I/flutter (21453): #2      Element.updateChild.<anonymous closure> (package:flutter/src/widgets/framework.dart:2730:13)
I/flutter (21453): #3      Element.updateChild (package:flutter/src/widgets/framework.dart:2733:6)
I/flutter (21453): #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #5      Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #7      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #8      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #10     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #11     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #12     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #13     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3864:11)
I/flutter (21453): #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #17     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
I/flutter (21453): #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #21     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #22     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #23     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #25     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #26     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
I/flutter (21453): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #30     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #31     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #32     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #36     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #38     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3864:11)
I/flutter (21453): #39     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #40     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #41     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4982:32)
I/flutter (21453): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
I/flutter (21453): #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #46     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #48     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
I/flutter (21453): #50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
I/flutter (21453): #51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
I/flutter (21453): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
I/flutter (21453): #53     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4659:32)
I/flutter (21453): #54     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4992:17)
I/flutter (21453): #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #56     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #57     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #58     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #59     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #61     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #62     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #64     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #66     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #68     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #69     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #70     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #71     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #72     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #74     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #75     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #77     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #78     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #79     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #80     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #81     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #82     ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
I/flutter (21453): #83     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #84     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #86     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #87     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #88     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #90     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #91     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #92     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #93     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #94     StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
I/flutter (21453): #95     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #96     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #97     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #98     StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #99     Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #100    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #101    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #102    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #103    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #104    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #105    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #106    ProxyElement.update (package:flutter/src/widgets/framework.dart:4006:5)
I/flutter (21453): #107    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #108    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #109    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #110    StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
I/flutter (21453): #111    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #112    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #113    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #114    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #115    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #116    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4883:14)
I/flutter (21453): #117    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #119    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #120    StatelessElement.update (package:flutter/src/widgets/framework.dart:3796:5)
I/flutter (21453): #121    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #122    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
I/flutter (21453): #123    Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
I/flutter (21453): #124    StatefulElement.update (package:flutter/src/widgets/framework.dart:3894:5)
I/flutter (21453): #125    Element.updateChild (package:flutter/src/widgets/framework.dart:2748:15)
I/flutter (21453): #126    _LayoutBuilderElement._layout.<anonymous closure> (package:flutter/src/widgets/layout_builder.dart:118:18)
I/flutter (21453): #127    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2253:19)
I/flutter (21453): #128    _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:107:11)
I/flutter (21453): #129    RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1728:58)
I/flutter (21453): #130    PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:797:15)
I/flutter (21453): #131    RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1728:13)
I/flutter (21453): #132    _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:205:5)
I/flutter (21453): #133    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter (21453): #134    MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:142:11)
I/flutter (21453): #135    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:350:7)
I/flutter (21453): #136    MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:212:7)
I/flutter (21453): #137    RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:356:14)
I/flutter (21453): #138    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1507:7)
I/flutter (21453): #139    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:766:18)
I/flutter (21453): #140    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:329:19)
I/flutter (21453): #141    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (21453): #142    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:268:5)
I/flutter (21453): #143    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:988:15)
I/flutter (21453): #144    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:928:9)
I/flutter (21453): #145    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:840:5)
I/flutter (21453): #149    _invoke (dart:ui/hooks.dart:209:10)
I/flutter (21453): #150    _drawFrame (dart:ui/hooks.dart:168:3)
I/flutter (21453): (elided 3 frames from package dart:async)
I/flutter (21453): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter (21453): Another exception was thrown: Multiple widgets used the same GlobalKey.

flutter doctor

flutter doctor -v
[√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 10.0.17763.379], locale de-DE)
    • Flutter version 1.2.1 at C:\Dev\flutter
    • Framework revision 8661d8aecd (8 weeks ago), 2019-02-14 19:19:53 -0800
    • Engine revision 3757390fa4
    • Dart version 2.1.2 (build 2.1.2-dev.0.0 0a7dcf17eb)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at C:\Users\c\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
    • All Android licenses accepted.

[√] Android Studio (version 3.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 34.0.1
    • Dart plugin version 182.5215
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)


[√] Connected device (1 available)
    • Nexus 5X • 00f989de5e434b0b • android-arm64 • Android 8.1.0 (API 27)

@shihaohong
Copy link
Contributor

shihaohong commented Apr 9, 2019

@ehhc Thank you for providing a code sample, stack trace and the output of flutter doctor -v. I'll start looking into it. This looks like a different, yet somewhat related issue to the original issue based on the error on the stack trace.

I cleaned up the indentations a little and added some more boilerplate so that it's easily reproducible, in case anybody else wants to take a stab at it as well.

@shihaohong shihaohong removed the waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds label Apr 9, 2019
@ehhc
Copy link

ehhc commented Apr 9, 2019

@shihaohong thanks :) yeah, i think, it's more related to #24210, which in turns was closed as a duplicated of this issue. Therefore, i posted here.. :)

@shihaohong shihaohong changed the title When using list view, _chldren[j] is not MaterialGap Exception on ExpansionPanel toggle due to Duplicate Global Keys Apr 10, 2019
@ehhc
Copy link

ehhc commented Apr 17, 2019

@shihaohong did you already have time to look into it? Do you have any idea what i can do to avoid the error? I really like the collapsible panels, but if i can't avoid the problem, i might have to replace them with something else ( :( )

@shihaohong
Copy link
Contributor

shihaohong commented Apr 17, 2019

@ehhc I'm still trying to come up with a robust solution, but I've already somewhat identified the cause of the problem.

It seems like #19624 introduced the issue while implementing ExpansionPanelList.radio as a feature. Since setState is called within _handlePressed, it attempts to rebuild ExpansionPanelList while LayoutBuilder is laying itself out, causing duplicate keys. If you move this line into the if statement right above it, it resolves the issue, but only for ExpansionPanelList, not ExpansionPanelList.radio.

I assume that this error occurs whenever unique layout situations occur, such as when using LayoutBuilder or StreamBuilder.

@ehhc
Copy link

ehhc commented Apr 18, 2019

@shihaohong thanks for your quick reply and for looking into it. I think modifying sdk-code (even as a workaround) for my real application can't be a good solution, can it?
I guess, i can wait a few more weeks and hope that you'll come up with a robust solution so that i simply can update flutter.

Anyway: thanks a lot for your help!

@ehhc
Copy link

ehhc commented Jun 4, 2019

@shihaohong i fear the issue is still not solved. I tried to reproduce it with the example app i posted above (this one: #13780 (comment)).

If i do the following:

  • close the first panel
  • open the third panel
  • rapidely open and close the second panel

after a while the following error occurs:

I/flutter (10937): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (10937): The following assertion was thrown building DefaultTextStyle(debugLabel: (englishLike body1
I/flutter (10937): 2014).merge(blackMountainView body1), inherit: false, color: Color(0xdd000000), family: Roboto,
I/flutter (10937): size: 14.0, weight: 400, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping
I/flutter (10937): at box width, overflow: clip):
I/flutter (10937): Multiple widgets used the same GlobalKey.
I/flutter (10937): The key _MergeableMaterialSliceKey([<ExpansionPanelList(state: _ExpansionPanelListState#71935)>
I/flutter (10937): <4>]) was used by multiple widgets. The parents of those widgets were different widgets that both
I/flutter (10937): had the following description:
I/flutter (10937):   DefaultTextStyle(debugLabel: (englishLike body1 2014).merge(blackMountainView body1), inherit:
I/flutter (10937): false, color: Color(0xdd000000), family: Roboto, size: 14.0, weight: 400, baseline: alphabetic,
I/flutter (10937): decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)
I/flutter (10937): A GlobalKey can only be specified on one widget at a time in the widget tree.
I/flutter (10937): 
I/flutter (10937): When the exception was thrown, this was the stack:
I/flutter (10937): #0      GlobalKey._debugReserveFor.<anonymous closure> (package:flutter/src/widgets/framework.dart:175:9)
I/flutter (10937): #1      GlobalKey._debugReserveFor (package:flutter/src/widgets/framework.dart:185:6)
I/flutter (10937): #2      Element.updateChild.<anonymous closure> (package:flutter/src/widgets/framework.dart:2826:13)
I/flutter (10937): #3      Element.updateChild (package:flutter/src/widgets/framework.dart:2829:6)
I/flutter (10937): #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #5      Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #7      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #8      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #10     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #11     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #12     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #13     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3960:11)
I/flutter (10937): #14     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #17     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4972:14)
I/flutter (10937): #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #21     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #22     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #23     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #24     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #25     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #26     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4972:14)
I/flutter (10937): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #29     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #30     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #31     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #32     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #36     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #38     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3960:11)
I/flutter (10937): #39     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #40     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #41     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5078:32)
I/flutter (10937): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4972:14)
I/flutter (10937): #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #46     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #48     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3818:5)
I/flutter (10937): #50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3813:5)
I/flutter (10937): #51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3052:14)
I/flutter (10937): #52     Element.updateChild (package:flutter/src/widgets/framework.dart:2855:12)
I/flutter (10937): #53     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4755:32)
I/flutter (10937): #54     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5088:17)
I/flutter (10937): #55     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #56     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #57     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #58     StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #59     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #61     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #62     StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #64     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #65     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #66     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #68     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #69     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #70     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #71     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #72     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #73     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #74     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #75     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #76     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #77     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #78     StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #79     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #80     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #81     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #82     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #83     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #84     ProxyElement.update (package:flutter/src/widgets/framework.dart:4102:5)
I/flutter (10937): #85     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #86     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #87     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #88     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #89     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #90     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #91     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #92     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #93     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #94     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #95     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #96     StatelessElement.update (package:flutter/src/widgets/framework.dart:3892:5)
I/flutter (10937): #97     Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #98     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #99     Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #100    StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #101    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #102    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #103    Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #104    StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #105    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #106    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #107    Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #108    ProxyElement.update (package:flutter/src/widgets/framework.dart:4102:5)
I/flutter (10937): #109    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #110    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #111    Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #112    StatelessElement.update (package:flutter/src/widgets/framework.dart:3892:5)
I/flutter (10937): #113    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #114    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #115    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #116    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #117    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #118    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4979:14)
I/flutter (10937): #119    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #120    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #121    Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #122    StatelessElement.update (package:flutter/src/widgets/framework.dart:3892:5)
I/flutter (10937): #123    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #124    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3846:16)
I/flutter (10937): #125    Element.rebuild (package:flutter/src/widgets/framework.dart:3656:5)
I/flutter (10937): #126    StatefulElement.update (package:flutter/src/widgets/framework.dart:3990:5)
I/flutter (10937): #127    Element.updateChild (package:flutter/src/widgets/framework.dart:2844:15)
I/flutter (10937): #128    _LayoutBuilderElement._layout.<anonymous closure> (package:flutter/src/widgets/layout_builder.dart:120:18)
I/flutter (10937): #129    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2294:19)
I/flutter (10937): #130    _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:109:11)
I/flutter (10937): #131    RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1716:58)
I/flutter (10937): #132    PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:797:15)
I/flutter (10937): #133    RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1716:13)
I/flutter (10937): #134    _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:207:5)
I/flutter (10937): #135    RenderObject.layout (package:flutter/src/rendering/object.dart:1620:7)
I/flutter (10937): #136    MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:142:11)
I/flutter (10937): #137    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:443:7)
I/flutter (10937): #138    MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:212:7)
I/flutter (10937): #139    RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:356:14)
I/flutter (10937): #140    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1497:7)
I/flutter (10937): #141    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:766:18)
I/flutter (10937): #142    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:346:19)
I/flutter (10937): #143    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter (10937): #144    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter (10937): #145    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1012:15)
I/flutter (10937): #146    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:952:9)
I/flutter (10937): #147    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:864:5)
I/flutter (10937): #151    _invoke (dart:ui/hooks.dart:220:10)
I/flutter (10937): #152    _drawFrame (dart:ui/hooks.dart:178:3)
I/flutter (10937): (elided 3 frames from package dart:async)
I/flutter (10937): ════════════════════════════════════════════════════════════════════════════════════════════════════

I think your patch made the error happen less reproducable and it happens less often, but it still happens... :(

flutter --version:

Flutter 1.6.3 • channel beta • https://github.com/flutter/flutter.git
Framework • revision bc7bc94083 (12 days ago) • 2019-05-23 10:29:07 -0700
Engine • revision 8dc3a4cde2
Tools • Dart 2.3.2 (build 2.3.2-dev.0.0 e3edfd36b2)

flutter doctor:

Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, v1.6.3, on Microsoft Windows [Version 10.0.17763.503], locale de-DE)

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[√] Android Studio (version 3.4)
[!] IntelliJ IDEA Ultimate Edition (version 2017.3)
    X Flutter plugin not installed; this adds Flutter specific functionality.
    X Dart plugin not installed; this adds Dart specific functionality.
[√] IntelliJ IDEA Ultimate Edition (version 2019.1)
[√] Connected device (1 available)

! Doctor found issues in 1 category.

@ehhc
Copy link

ehhc commented Jun 4, 2019

@shihaohong is this the right place for the issue or should i create a new issue?

@shihaohong
Copy link
Contributor

@ehhc I've just reproduced the error. Lets reopen this issue and we can investigate this further. Thanks for bringing this up and having a detailed steps to reproduce the error!

@shihaohong shihaohong reopened this Jun 4, 2019
@shihaohong shihaohong removed their assignment Jul 15, 2019
@Kropie
Copy link

Kropie commented Jan 19, 2020

I found a fix that involves using Keys. When the list that backs my ExpansionPanelList changes in size, I generate a new key and provide that to the ExpansionPanelList.

Looks like the following:

    if (_previousList.length != _currentList.length) {
      key = Key("${++count}");
    }
    _previousList = List.of(_currentList);

    var expansionList = ExpansionPanelList(
      key: key,
      expansionCallback: _doExpansion,
      children: childPanels,
    );

@JonathanGuo
Copy link

I found a fix that involves using Keys. When the list that backs my ExpansionPanelList changes in size, I generate a new key and provide that to the ExpansionPanelList.

Looks like the following:

    if (_previousList.length != _currentList.length) {
      key = Key("${++count}");
    }
    _previousList = List.of(_currentList);

    var expansionList = ExpansionPanelList(
      key: key,
      expansionCallback: _doExpansion,
      children: childPanels,
    );

Thanks @Kropie 's solution. I think by giving a new key when rebuilding the ExpansionPanelList can avoid the issue.

if this is not a bug, I think it would be good to be noted in documentation.

@shihaohong
Copy link
Contributor

I believe this has been fixed with #49896 (more info in #43780). It turns out that this was a result of a problem with the GlobalKey detection algorithm.

I tested it in stable and was able to reproduce the error, but it seems to be okay in master. I will close the issue for now, but if it still occurs in master, please feel free to re-open the issue!

@omidraha
Copy link

omidraha commented Aug 29, 2020

I have the same issue.
Here is sample code and sample project.
Note: I use this sliding_panel package. (I also report here.)

Trackback:

I/flutter ( 4618): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 4618): The following StateError was thrown building NotificationListener<KeepAliveNotification>:
I/flutter ( 4618): Bad state: Stream has already been listened to.
I/flutter ( 4618): The relevant error-causing widget was:
I/flutter ( 4618):   SliverList
I/flutter ( 4618):   file:///sdk/flutter/.pub-cache/hosted/pub.dartlang.org/sliding_panel-1.3.1/lib/src/panel.dart:1004:27
I/flutter ( 4618): When the exception was thrown, this was the stack:
I/flutter ( 4618): #3      _StreamBuilderBaseState._subscribe (package:flutter/src/widgets/async.dart:139:37)
I/flutter ( 4618): #4      _StreamBuilderBaseState.initState (package:flutter/src/widgets/async.dart:113:5)
I/flutter ( 4618): #5      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4697:58)
I/flutter ( 4618): #6      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4533:5)
I/flutter ( 4618): ...     Normal element mounting (33 frames)
I/flutter ( 4618): #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3503:14)
I/flutter ( 4618): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:3262:18)
I/flutter ( 4618): #41     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1157:36)
I/flutter ( 4618): #42     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1142:20)
I/flutter ( 4618): #43     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2622:19)
I/flutter ( 4618): #44     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1135:11)
I/flutter ( 4618): #45     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:356:23)
I/flutter ( 4618): #46     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1879:58)
I/flutter ( 4618): #47     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:927:15)
I/flutter ( 4618): #48     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1879:13)
I/flutter ( 4618): #49     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:345:5)
I/flutter ( 4618): #50     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:429:5)
I/flutter ( 4618): #51     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:81:12)
I/flutter ( 4618): #52     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #53     RenderProxySliver.performLayout (package:flutter/src/rendering/proxy_sliver.dart:54:11)
I/flutter ( 4618): #54     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #55     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:471:13)
I/flutter ( 4618): #56     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1466:12)
I/flutter ( 4618): #57     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1375:20)
I/flutter ( 4618): #58     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #59     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #60     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #61     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #62     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #63     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #64     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #65     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #66     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #67     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #68     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #69     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #70     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #71     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #72     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #73     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #74     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #75     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #76     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #77     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #78     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #79     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #80     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #81     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:562:15)
I/flutter ( 4618): #82     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #83     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #84     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #85     RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:270:13)
I/flutter ( 4618): #86     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #87     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:209:11)
I/flutter ( 4618): #88     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #89     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:562:15)
I/flutter ( 4618): #90     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #91     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #92     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #93     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #94     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #95     _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:304:13)
I/flutter ( 4618): #96     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #97     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #98     RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #99     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #100    RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #101    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #102    RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #104    RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #105    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #106    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3263:13)
I/flutter ( 4618): #107    RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #108    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:13)
I/flutter ( 4618): #109    RenderObject.layout (package:flutter/src/rendering/object.dart:1776:7)
I/flutter ( 4618): #110    _RenderTheatre.performLayout (package:flutter/src/widgets/overlay.dart:702:15)
I/flutter ( 4618): #111    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1639:7)
I/flutter ( 4618): #112    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:896:18)
I/flutter ( 4618): #113    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:404:19)
I/flutter ( 4618): #114    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:881:13)
I/flutter ( 4618): #115    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
I/flutter ( 4618): #116    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1114:15)
I/flutter ( 4618): #117    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1053:9)
I/flutter ( 4618): #118    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:969:5)
I/flutter ( 4618): #122    _invoke (dart:ui/hooks.dart:253:10)
I/flutter ( 4618): #123    _drawFrame (dart:ui/hooks.dart:211:3)
I/flutter ( 4618): (elided 6 frames from dart:async)
I/flutter ( 4618): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 265 pos 16: 'child == null || indexOf(child) > index': is not true.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 265 pos 16: 'child == null || indexOf(child) > index': is not true.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 265 pos 16: 'child == null || indexOf(child) > index': is not true.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 2626 pos 20: '_debugCurrentBuildTarget == context': is not true.
I/flutter ( 4618): Another exception was thrown: NoSuchMethodError: The method 'debugAssertIsValid' was called on null.
I/flutter ( 4618): Another exception was thrown: NoSuchMethodError: The method 'debugAssertIsValid' was called on null.
I/flutter ( 4618): Another exception was thrown: NoSuchMethodError: The getter 'visible' was called on null.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 265 pos 16: 'child == null || indexOf(child) > index': is not true.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/rendering/sliver_multi_box_adaptor.dart': Failed assertion: line 265 pos 16: 'child == null || indexOf(child) > index': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.
I/flutter ( 4618): Another exception was thrown: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 5879 pos 12: 'child == _child': is not true.
I/flutter ( 4618): Another exception was thrown: Duplicate GlobalKey detected in widget tree.

Info:

$ flutter -v doctor
[✓] Flutter (Channel master, 1.21.0-7.0.pre, on Linux, locale en_US.UTF-8)
    • Flutter version 1.21.0-7.0.pre at /sdk/flutter
    • Framework revision e64fe11542 (5 weeks ago), 2020-07-23 18:11:17 -0700
    • Engine revision 626244a72c
    • Dart version 2.9.0 (build 2.9.0-21.0.dev a3815b6590)

 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /sdk/android/
    • Platform android-29, build-tools 29.0.3
    • ANDROID_HOME = /sdk/android/
    • Java binary at: /android-studio/jre/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Android Studio (version 4.0)
    • Android Studio at /android-studio
    • Flutter plugin version 48.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)

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

• No issues found!

@sjsam
Copy link

sjsam commented Sep 22, 2020

In my case, where I feed a stream to ExpansionPanelList, providing a UniqueKey to the ExpansionPanelListfixed the issue

@github-actions
Copy link

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.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Aug 12, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
c: crash Stack traces logged to the console f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.
Projects
None yet
Development

Successfully merging a pull request may close this issue.