Repository navigation
FormField with Sliver causes exception #173912
Description
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:
- Create a custom FormField by extending FormField
- In the builder method return a SliverList.
- See exception is thrown.
Expected results
The form fields should not error out.
Actual results
Exception is throw by the framework.
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
darshankawar commentedon Aug 18, 2025
@CodeMinion Please check if this helps further in your case or not.
CodeMinion commentedon Aug 18, 2025
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.
darshankawar commentedon Aug 19, 2025
Thanks for the update. I do see the same reported exception on latest versions.
I will try to check from which version it started to throw the error. Labeling for team's tracking for now.
CodeMinion commentedon Aug 19, 2025
Thanks for looking into this @darshankawar, really appreciate yours and the teams effort in tracking this down.
3 remaining items
darshankawar commentedon Aug 27, 2025
@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.
darshankawar commentedon Sep 3, 2025
@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
Formfield, 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 wrapFormwidget withSliverToBoxAdapter.CodeMinion commentedon Sep 3, 2025
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
Formwidget 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 theFormas 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
Formwidget. However looking that the code change it seems this change was a bit overzealous and also wrapped everyFormFieldwidget 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-L788victorsanni commentedon Apr 20, 2026
Hi @CodeMinion, I agree, this crash is happening because
Semanticsis incompatible with slivers. Because we can't tell at build time whether a FormField descendant is a sliver, the options here are: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?
Add SliverFormField for sliver-typed FormField builders
Add SliverFormField for sliver-typed FormField builders
Add SliverFormField for sliver-typed FormField builders
Add SliverFormField for sliver-typed FormField builders
Add SliverFormField for sliver-typed FormField builders
justinmc commentedon May 5, 2026
CC @Renzo-Olivares from triage.
Add SliverFormField for sliver-typed FormField builders
Add SliverFormField for sliver-typed FormField builders
Refactor FormField build wrappers (flutter#185795)