Skip to content

FormField with Sliver causes exception #173912

Open

Description

@CodeMinion

Steps to reproduce

When extending FormField if the builder returns a Sliver an exception is thrown by the framework.

It's not clear what the cause is but removing the following from the FormField build method made the exception go away and produced the expected results.

Source: https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/form.dart#L783

final Widget child = Semantics(
      validationResult: hasError
          ? SemanticsValidationResult.invalid
          : SemanticsValidationResult.valid,
      child: widget.builder(this),
    );

Error:

The following assertion was thrown building MtgRadioGroupSliver(state: _MtgRadioGroupStateSliver#b279d):
A RenderSemanticsAnnotations expected a child of type RenderBox but received a child of type RenderSliverList.

RenderObjects expect specific types of children because they coordinate with their children during layout and paint. For example, a RenderSliver cannot be the child of a RenderBox because a RenderSliver does not understand the RenderBox layout protocol.
The RenderSemanticsAnnotations that expected a RenderBox child was created by: Semantics ← MtgRadioGroupFormField ← SliverToBoxAdapter ← ShrinkWrappingViewport ← IgnorePointer-[GlobalKey#45e78] ← Semantics ← Listener ← _GestureSemantics ←

Steps:

  1. Create a custom FormField by extending FormField
  2. In the builder method return a SliverList.
  3. See exception is thrown.

Expected results

The form fields should not error out.

Image

Actual results

Exception is throw by the framework.

Image

Code sample

Code sample
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}


class SliverFormField<T extends Object> extends FormField<T> {

  SliverFormField({super.key,
    //super.validator,
    super.autovalidateMode,
    super.enabled,
    super.forceErrorText,
    super.initialValue,
    super.onSaved,
    super.restorationId,
    })
      :super(builder: (FormFieldState<T?> field) {
    return SliverList.list(children: []);
  });
  }

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Form(child: CustomScrollView(
          slivers: [SliverFormField()],
        )),
      ),

    );
  }
}

Screenshots or Video

Screenshots / Video demonstration

[Upload media here]

Logs

Logs
Performing hot restart...
Syncing files to device macOS...
Restarted application in 394ms.

======== Exception caught by widgets library =======================================================
The following assertion was thrown building SliverFormField<Object>(dependencies: [UnmanagedRestorationScope, _FormScope], state: FormFieldState<Object>#5f240):
A RenderViewport expected a child of type RenderSliver but received a child of type RenderSemanticsAnnotations.

RenderObjects expect specific types of children because they coordinate with their children during layout and paint. For example, a RenderSliver cannot be the child of a RenderBox because a RenderSliver does not understand the RenderBox layout protocol.
The RenderViewport that expected a RenderSliver child was created by: Viewport ← IgnorePointer-[GlobalKey#bc1e6] ← Semantics ← Listener ← _GestureSemantics ← RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216] ← Listener ← _ScrollableScope ← _ScrollSemantics-[GlobalKey#2a5f9] ← NotificationListener<ScrollMetricsNotification> ← RepaintBoundary ← CustomPaint-[GlobalKey#dbb9e] ← ⋯
The RenderSemanticsAnnotations that did not match the expected child type was created by: Semantics ← SliverFormField<Object> ← Viewport ← IgnorePointer-[GlobalKey#bc1e6] ← Semantics ← Listener ← _GestureSemantics ← RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216] ← Listener ← _ScrollableScope ← _ScrollSemantics-[GlobalKey#2a5f9] ← NotificationListener<ScrollMetricsNotification> ← ⋯
The relevant error-causing widget was: 
  SliverFormField<Object> SliverFormField:file:///Users/codeminion/Projects/FlutterProjects/sliver_form_field_crash_sample/lib/main.dart:59:21
When the exception was thrown, this was the stack: 
#0      ContainerRenderObjectMixin.debugValidateChild.<anonymous closure> (package:flutter/src/rendering/object.dart:4268:9)
#1      ContainerRenderObjectMixin.debugValidateChild (package:flutter/src/rendering/object.dart:4295:6)
#2      MultiChildRenderObjectElement.insertRenderObjectChild (package:flutter/src/widgets/framework.dart:7097:25)
#3      _ViewportElement.insertRenderObjectChild (package:flutter/src/widgets/viewport.dart:295:11)
#4      RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:6844:35)
#5      RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6706:5)
#6      SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7017:11)
...     Normal element mounting (9 frames)
#15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#16     MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#17     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
#18     _ViewportElement.mount (package:flutter/src/widgets/viewport.dart:254:11)
...     Normal element mounting (160 frames)
#178    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#179    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#180    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (136 frames)
#316    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#317    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#318    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (188 frames)
#506    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#507    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#508    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (558 frames)
#1066   Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#1067   Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
#1068   _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16)
#1069   _RawViewElement.mount (package:flutter/src/widgets/view.dart:504:5)
...     Normal element mounting (15 frames)
#1084   Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#1085   Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
#1086   RootElement._rebuild (package:flutter/src/widgets/binding.dart:1716:16)
#1087   RootElement.mount (package:flutter/src/widgets/binding.dart:1685:5)
#1088   RootWidget.attach.<anonymous closure> (package:flutter/src/widgets/binding.dart:1638:18)
#1089   BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3046:19)
#1090   RootWidget.attach (package:flutter/src/widgets/binding.dart:1637:13)
#1091   WidgetsBinding.attachToBuildOwner (package:flutter/src/widgets/binding.dart:1376:27)
#1092   WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:1361:5)
#1093   WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:1347:7)
#1097   _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 3 frames from class _Timer and dart:async-patch)
====================================================================================================

======== Exception caught by widgets library =======================================================
The following assertion was thrown building RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216](state: RawGestureDetectorState#ce572(gestures: <none>, behavior: opaque)):
A RenderViewport expected a child of type RenderSliver but received a child of type RenderErrorBox.

RenderObjects expect specific types of children because they coordinate with their children during layout and paint. For example, a RenderSliver cannot be the child of a RenderBox because a RenderSliver does not understand the RenderBox layout protocol.
The RenderViewport that expected a RenderSliver child was created by: Viewport ← IgnorePointer-[GlobalKey#bc1e6] ← Semantics ← Listener ← _GestureSemantics ← RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216] ← Listener ← _ScrollableScope ← _ScrollSemantics-[GlobalKey#2a5f9] ← NotificationListener<ScrollMetricsNotification> ← RepaintBoundary ← CustomPaint-[GlobalKey#dbb9e] ← ⋯
The RenderErrorBox that did not match the expected child type was created by: ErrorWidget-[#6ad5f] ← SliverFormField<Object> ← Viewport ← IgnorePointer-[GlobalKey#bc1e6] ← Semantics ← Listener ← _GestureSemantics ← RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216] ← Listener ← _ScrollableScope ← _ScrollSemantics-[GlobalKey#2a5f9] ← NotificationListener<ScrollMetricsNotification> ← ⋯
The relevant error-causing widget was: 
  CustomScrollView CustomScrollView:file:///Users/codeminion/Projects/FlutterProjects/sliver_form_field_crash_sample/lib/main.dart:58:28
When the exception was thrown, this was the stack: 
#0      ContainerRenderObjectMixin.debugValidateChild.<anonymous closure> (package:flutter/src/rendering/object.dart:4268:9)
#1      ContainerRenderObjectMixin.debugValidateChild (package:flutter/src/rendering/object.dart:4295:6)
#2      MultiChildRenderObjectElement.insertRenderObjectChild (package:flutter/src/widgets/framework.dart:7097:25)
#3      _ViewportElement.insertRenderObjectChild (package:flutter/src/widgets/viewport.dart:295:11)
#4      RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:6844:35)
#5      RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6706:5)
...     Normal element mounting (9 frames)
#14     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#15     MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#16     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
#17     _ViewportElement.mount (package:flutter/src/widgets/viewport.dart:254:11)
...     Normal element mounting (160 frames)
#177    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#178    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#179    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (136 frames)
#315    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#316    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#317    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (188 frames)
#505    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#506    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7169:36)
#507    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7185:32)
...     Normal element mounting (558 frames)
#1065   Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#1066   Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
#1067   _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:481:16)
#1068   _RawViewElement.mount (package:flutter/src/widgets/view.dart:504:5)
...     Normal element mounting (15 frames)
#1083   Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#1084   Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
#1085   RootElement._rebuild (package:flutter/src/widgets/binding.dart:1716:16)
#1086   RootElement.mount (package:flutter/src/widgets/binding.dart:1685:5)
#1087   RootWidget.attach.<anonymous closure> (package:flutter/src/widgets/binding.dart:1638:18)
#1088   BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3046:19)
#1089   RootWidget.attach (package:flutter/src/widgets/binding.dart:1637:13)
#1090   WidgetsBinding.attachToBuildOwner (package:flutter/src/widgets/binding.dart:1376:27)
#1091   WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:1361:5)
#1092   WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:1347:7)
#1096   _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 3 frames from class _Timer and dart:async-patch)
====================================================================================================

======== Exception caught by widgets library =======================================================
The following assertion was thrown building RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#ba216](state: RawGestureDetectorState#ce572(gestures: <none>, behavior: opaque)):
'package:flutter/src/widgets/framework.dart': Failed assertion: line 7010 pos 12: 'child == _child': is not true.


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

The relevant error-causing widget was: 
  CustomScrollView CustomScrollView:file:///Users/codeminion/Projects/FlutterProjects/sliver_form_field_crash_sample/lib/main.dart:58:28
When the exception was thrown, this was the stack: 
#2      SingleChildRenderObjectElement.forgetChild (package:flutter/src/widgets/framework.dart:7010:12)
#3      Element._retakeInactiveElement (package:flutter/src/widgets/framework.dart:4476:14)
...     Normal element mounting (10 frames)
#13     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4548:16)
#14     Element.updateChild (package:flutter/src/widgets/framework.dart:3998:20)
#15     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#16     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#18     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#19     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#20     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#21     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#23     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#24     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#25     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#26     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#29     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#30     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#31     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#32     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#33     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#34     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#35     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#36     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#37     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#38     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#39     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#40     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#42     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#43     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#44     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#45     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#46     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#47     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#48     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#49     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#50     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#51     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#52     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#53     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#54     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#55     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#56     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#57     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#59     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#60     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#61     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#62     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#63     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#64     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#65     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#66     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#67     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#69     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#70     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#71     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#72     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#73     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#74     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#75     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#76     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#77     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#78     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#79     ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#80     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#81     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#82     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#83     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#84     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#85     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#86     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#87     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#88     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#89     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#90     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#91     StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#92     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#93     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#94     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#95     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#96     Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#97     StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#98     Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#99     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#100    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#101    StatelessElement.update (package:flutter/src/widgets/framework.dart:5797:5)
#102    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#103    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#104    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#105    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#106    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#107    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#108    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#109    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#110    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#111    Element.updateChildren (package:flutter/src/widgets/framework.dart:4139:32)
#112    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7202:17)
#113    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#114    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#115    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#116    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#117    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#118    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#119    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#120    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#121    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#122    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#123    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#124    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#125    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#126    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#127    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#128    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#129    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#130    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#131    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#132    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#133    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#134    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#135    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#136    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#137    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#138    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#139    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#140    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#141    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#142    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#143    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7025:14)
#144    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#145    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#146    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#147    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#148    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#149    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#150    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#151    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#152    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#153    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#154    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#155    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#156    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#157    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#158    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#159    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#160    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#161    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#162    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#163    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#164    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#165    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#166    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#167    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#168    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#169    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#170    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#171    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#172    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#173    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#174    ProxyElement.update (package:flutter/src/widgets/framework.dart:6051:5)
#175    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#176    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#177    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#178    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#179    StatefulElement.update (package:flutter/src/widgets/framework.dart:5909:5)
#180    Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
#181    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5747:16)
#182    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5884:11)
#183    Element.rebuild (package:flutter/src/widgets/framework.dart:5435:7)
#184    BuildScope._tryRebuild (package:flutter/src/widgets/framework.dart:2695:15)
#185    BuildScope._flushDirtyElements (package:flutter/src/widgets/framework.dart:2752:11)
#186    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3056:18)
#187    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1259:21)
#188    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#189    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15)
#190    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9)
#191    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1057:9)
#192    PlatformDispatcher.scheduleWarmUpFrame.<anonymous closure> (dart:ui/platform_dispatcher.dart:886:16)
#196    _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 5 frames from class _AssertionError, class _Timer, and dart:async-patch)
====================================================================================================

======== Exception caught by widgets library =======================================================
The following assertion was thrown while finalizing the widget tree:
Duplicate GlobalKey detected in widget tree.

The following GlobalKey was specified multiple times in the widget tree. This will lead to parts of the widget tree being truncated unexpectedly, because the second time a key is seen, the previous instance is moved to the new location. The key was:
- [GlobalKey#bc1e6]
This was determined by noticing that after the widget with the above global key was moved out of its previous parent, that previous parent never updated during this frame, meaning that it either did not update at all or updated before the widget was moved, in either case implying that it still thinks that it should have a child with that global key.
The specific parent that did not update after having one or more children forcibly removed due to GlobalKey reparenting is:
- Semantics(container: false, properties: SemanticsProperties, renderObject: RenderSemanticsAnnotations#d7bc1 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE DETACHED)
A GlobalKey can only be specified on one widget at a time in the widget tree.
When the exception was thrown, this was the stack: 
#0      BuildOwner.finalizeTree.<anonymous closure> (package:flutter/src/widgets/framework.dart:3354:15)
#1      BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:3379:8)
#2      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1266:19)
#3      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
#4      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1434:15)
#5      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1347:9)
#6      SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1057:9)
#7      PlatformDispatcher.scheduleWarmUpFrame.<anonymous closure> (dart:ui/platform_dispatcher.dart:886:16)
#11     _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:193:12)
(elided 3 frames from class _Timer and dart:async-patch)
====================================================================================================

Flutter Doctor output

Doctor output
[✓] Flutter (Channel stable, 3.35.1, on macOS 15.5 24F74 darwin-arm64, locale en-US) [552ms]
    • Flutter version 3.35.1 on channel stable at /Users/codeminion/development/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision 20f8274939 (2 days ago), 2025-08-14 10:53:09 -0700
    • Engine revision 1e9a811bf8
    • Dart version 3.9.0
    • DevTools version 2.48.0
    • Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations,
      enable-lldb-debugging

[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0) [2.5s]
    • Android SDK at /Users/codeminion/Library/Android/sdk
    • Emulator version 31.2.10.0 (build_id 8420304) (CL:N/A)
    • Platform android-35, build-tools 34.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
      This is the JDK bundled with the latest Android Studio installation on this machine.
      To manually set the JDK path, use: `flutter config --jdk-dir="path/to/jdk"`.
    • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11)
    ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses

[!] Xcode - develop for iOS and macOS (Xcode 16.3) [1,286ms]
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 16E140
    ! CocoaPods 1.11.3 out of date (1.16.2 is recommended).
        CocoaPods is a package manager for iOS or macOS platform code.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/to/platform-plugins
      To update CocoaPods, see https://guides.cocoapods.org/using/getting-started.html#updating-cocoapods

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

[✓] Android Studio (version 2024.2) [28ms]
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 21.0.3+-79915917-b509.11)

[✓] IntelliJ IDEA Community Edition (version 2021.3.1) [27ms]
    • IntelliJ at /Applications/IntelliJ IDEA CE.app
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart

[✓] VS Code (version 1.101.1) [8ms]
    • VS Code at /Users/codeminion/Downloads/Visual Studio Code.app/Contents
    • Flutter extension can be installed from:
      🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (2 available) [7.5s]
    • macOS (desktop) • macos  • darwin-arm64   • macOS 15.5 24F74 darwin-arm64
    • Chrome (web)    • chrome • web-javascript • Google Chrome 139.0.7258.128

[✓] Network resources [225ms]
    • All expected network resources are available.

! Doctor found issues in 2 categories.

Activity

  1. darshankawar commented on Aug 18, 2025

    @darshankawar
    Member

    @CodeMinion Please check if this helps further in your case or not.

  2. added
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Aug 18, 2025
  3. CodeMinion commented on Aug 18, 2025

    @CodeMinion
    Author

    Thanks for the link @darshankawar .

    The error reported on this issue was not present in earlier versions of the Flutter framework and it is something that started failing after updating to version 3.35.1. Unfortunately I did not record the version I was on prior to upgrading to 3.35.1, but I believe it around 3.20~.

    Commenting the following section in the framework produces the proper behavior we were getting prior to the update: https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/form.dart#L783-L788

    It seems that code was added as part of this commit: fbbe0f9

    Hope this helps but please don't hesitate to reach out if there is anything else I can help with.

  4. removed
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Aug 18, 2025
  5. darshankawar commented on Aug 19, 2025

    @darshankawar
    Member

    Thanks for the update. I do see the same reported exception on latest versions.

    I was on prior to upgrading to 3.35.1, but I believe it around 3.20~.

    I will try to check from which version it started to throw the error. Labeling for team's tracking for now.

    stable : 3.35.1
    master : 3.33.0-1.0.pre-1457
    
  6. added
    has reproducible stepsThe issue has been confirmed reproducible and is ready to work on
    a: error messageError messages from the Flutter framework
    frameworkflutter/packages/flutter repository. See also f: labels.
    and removed
    in triagePresently being triaged by the triage team
    on Aug 19, 2025
  7. CodeMinion commented on Aug 19, 2025

    @CodeMinion
    Author

    Thanks for looking into this @darshankawar, really appreciate yours and the teams effort in tracking this down.

  8. added
    P2Important issues not at the top of the work list
    on Aug 26, 2025
  9. 3 remaining items

  10. darshankawar commented on Aug 27, 2025

    @darshankawar
    Member

    @darshankawar please let us know if you are able to bisect this, I think it would be helpful!

    @justinmc Sure, I'll try. Per OP, it worked until 3.20.x which is old version. I'll first try to find exact version till which it worked and then share my findings here.

  11. darshankawar commented on Sep 3, 2025

    @darshankawar
    Member

    @CodeMinion I verified that the given code sample works properly in 3.29.3 in which it doesn't throw the reported error.
    Since the given code uses Form field, I came across https://docs.flutter.dev/release/breaking-changes/form-semantics which might be related to the implementation. Please check if the migration guide helps further in your case or not that tells to wrap Form widget with SliverToBoxAdapter.

  12. added
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Sep 3, 2025
  13. CodeMinion commented on Sep 3, 2025

    @CodeMinion
    Author

    Thanks for the information @darshankawar , the version you point out as the last working version (3.29.3) sounds about right to me.

    Thank you also for the link https://docs.flutter.dev/release/breaking-changes/form-semantics it however describes how the Form widget no longer supports being a sliver, which is a different case from what we have here.

    The case we are facing is with the widgets that extend FormField. As you'll notice from the sample code it does not use the Form as a sliver and the error is present.

    From the link you provided (https://docs.flutter.dev/release/breaking-changes/form-semantics) it seems this change came as part of issue (#161628) which called for adding semantics to the Form widget. However looking that the code change it seems this change was a bit overzealous and also wrapped every FormField widget with a semantic widget and that seems the root of the current issue https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/form.dart#L783-L788

  14. removed
    waiting for responseThe Flutter team cannot make further progress on this issue until the original reporter responds
    on Sep 3, 2025
  15. victorsanni commented on Apr 20, 2026

    @victorsanni
    Contributor

    Hi @CodeMinion, I agree, this crash is happening because Semantics is incompatible with slivers. Because we can't tell at build time whether a FormField descendant is a sliver, the options here are:

    1. A new SliverFormField widget which uses SliverSemantics under the hood, or
    2. An opt-in flag (e.g isSliver) which allows FormField to wrap its child in a SliverSemantics instead of a Semantics widget.

    I prefer option 1 since there are many parallels in the framework. But either way fixing this issue will regress #165935, which we don't want to do.

    What do you think?

  16. justinmc commented on May 5, 2026

    @justinmc
    Contributor

    CC @Renzo-Olivares from triage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important issues not at the top of the work lista: error messageError messages from the Flutter frameworkc: regressionIt was better in the past than it is nowfound in release: 3.33Found to occur in 3.33found in release: 3.35Found to occur in 3.35frameworkflutter/packages/flutter repository. See also f: labels.has reproducible stepsThe issue has been confirmed reproducible and is ready to work onteam-frameworkOwned by Framework teamtriaged-frameworkTriaged by Framework team

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions