oi-narendra / multiselect-dropdown

Streamlined Flutter widget for versatile multi-selection with extensive customization.
https://pub.dev/packages/multi_dropdown
GNU General Public License v3.0
73 stars 84 forks source link

3.x.x: Wrapping in InputDecorator breaks layout #154

Open divan opened 2 months ago

divan commented 2 months ago

After upgrading to 3.x.x there is no way to achieve consistent field look&feel throught default Flutter's InputDecoration. Many people have code that provides InputDecoration to their fields' widgets. 3.x.x update removed this possibility.

Related issues: https://github.com/oi-narendra/multiselect-dropdown/issues/144 https://github.com/oi-narendra/multiselect-dropdown/issues/150

One of the solutions in these cases is to use InputDecorator widget and wrap field into it(removing all decoration in the child).

However, wrapping into InputDecorator somehow throws hard to decipher error.

Code to reproduce:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:multi_dropdown/multi_dropdown.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.router(
      title: 'Multiselect dropdown demo',
      debugShowCheckedModeBanner: false,
      themeMode: ThemeMode.dark,
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      routerConfig: GoRouter(routes: [
        GoRoute(
          path: '/',
          builder: (context, state) {
            return const MyHomePage();
          },
        ),
      ]),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class User {
  final String name;
  final int id;

  User({required this.name, required this.id});

  @override
  String toString() {
    return 'User(name: $name, id: $id)';
  }
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();

  final controller = MultiSelectController<User>();

  @override
  Widget build(BuildContext context) {
    var items = [
      DropdownItem(label: 'Nepal', value: User(name: 'Nepal', id: 1)),
      DropdownItem(label: 'Australia', value: User(name: 'Australia', id: 6)),
      DropdownItem(label: 'India', value: User(name: 'India', id: 2)),
      DropdownItem(label: 'China', value: User(name: 'China', id: 3)),
      DropdownItem(label: 'USA', value: User(name: 'USA', id: 4)),
      DropdownItem(label: 'UK', value: User(name: 'UK', id: 5)),
      DropdownItem(label: 'Germany', value: User(name: 'Germany', id: 7)),
      DropdownItem(label: 'France', value: User(name: 'France', id: 8)),
    ];
    return Scaffold(
        backgroundColor: Colors.white,
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: SingleChildScrollView(
              physics: const AlwaysScrollableScrollPhysics(),
              child: SizedBox(
                width: double.infinity,
                height: MediaQuery.of(context).size.height,
                child: Form(
                  key: _formKey,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisSize: MainAxisSize.max,
                    children: [
                      const SizedBox(
                        height: 4,
                      ),
                      InputDecorator(
                        decoration: const InputDecoration(),
                        child: MultiDropdown<User>(
                          items: items,
                          controller: controller,
                          enabled: true,
                          searchEnabled: true,
                          chipDecoration: const ChipDecoration(
                            backgroundColor: Colors.yellow,
                            wrap: true,
                            runSpacing: 2,
                            spacing: 10,
                          ),
                          fieldDecoration: FieldDecoration(
                            hintText: 'Countries',
                            hintStyle: const TextStyle(color: Colors.black87),
                            prefixIcon: const Icon(CupertinoIcons.flag),
                            showClearIcon: false,
                            border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(12),
                              borderSide: const BorderSide(color: Colors.grey),
                            ),
                            focusedBorder: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(12),
                              borderSide: const BorderSide(
                                color: Colors.black87,
                              ),
                            ),
                          ),
                          dropdownDecoration: const DropdownDecoration(
                            marginTop: 2,
                            maxHeight: 500,
                            header: Padding(
                              padding: EdgeInsets.all(8),
                              child: Text(
                                'Select countries from the list',
                                textAlign: TextAlign.start,
                                style: TextStyle(
                                  fontSize: 16,
                                  fontWeight: FontWeight.bold,
                                ),
                              ),
                            ),
                          ),
                          dropdownItemDecoration: DropdownItemDecoration(
                            selectedIcon: const Icon(Icons.check_box,
                                color: Colors.green),
                            disabledIcon:
                                Icon(Icons.lock, color: Colors.grey.shade300),
                          ),
                          validator: (value) {
                            if (value == null || value.isEmpty) {
                              return 'Please select a country';
                            }
                            return null;
                          },
                          onSelectionChange: (selectedItems) {
                            debugPrint("OnSelectionChange: $selectedItems");
                          },
                        ),
                      ),
                      const SizedBox(height: 12),
                      Wrap(
                        spacing: 8,
                        children: [
                          ElevatedButton(
                            onPressed: () {
                              if (_formKey.currentState?.validate() ?? false) {
                                final selectedItems = controller.selectedItems;

                                debugPrint(selectedItems.toString());
                              }
                            },
                            child: const Text('Submit'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.selectAll();
                            },
                            child: const Text('Select All'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.clearAll();
                            },
                            child: const Text('Unselect All'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.addItems([
                                DropdownItem(
                                    label: 'France',
                                    value: User(name: 'France', id: 8)),
                              ]);
                            },
                            child: const Text('Add Items'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.selectWhere((element) =>
                                  element.value.id == 1 ||
                                  element.value.id == 2 ||
                                  element.value.id == 3);
                            },
                            child: const Text('Select Where'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.selectAtIndex(0);
                            },
                            child: const Text('Select At Index'),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              controller.openDropdown();
                            },
                            child: const Text('Open/Close dropdown'),
                          ),
                        ],
                      )
                    ],
                  ),
                ),
              ),
            ),
          ),
        ));
  }
}

Output:


Performing hot restart...
Restarted application in 304ms.

══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during performLayout():
RenderBox.size accessed beyond the scope of resize, layout, or permitted parent access. RenderBox
can always access its own size, otherwise, the only object that is allowed to read RenderBox.size is
its parent, if they have said they will. It you hit this assert trying to access a child's size,
pass "parentUsesSize: true" to that child's layout() in RenderConstrainedBox.performLayout.
'package:flutter/src/rendering/box.dart':
Failed assertion: line 2178 pos 16: 'sizeAccessAllowed'

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

The relevant error-causing widget was:
  InputDecorator InputDecorator:file:///private/tmp/multidemo/lib/main.dart:90:23

When the exception was thrown, this was the stack:
#2      RenderBox.size.<anonymous closure> (package:flutter/src/rendering/box.dart:2178:16)
#3      RenderBox.size (package:flutter/src/rendering/box.dart:2199:6)
#4      _RenderDecoration.computeDistanceToActualBaseline (package:flutter/src/material/input_decorator.dart:1262:100)
#5      RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#6      _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#7      _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#8      _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#9      RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#10     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#11     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#12     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#13     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#14     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#15     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#16     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#17     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#18     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#19     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#20     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#21     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#22     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#23     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#24     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#25     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#26     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#27     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#28     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#29     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#30     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#31     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#32     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#33     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#34     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#35     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#36     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#37     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#38     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#39     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#40     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#41     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#42     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#43     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#44     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#45     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#46     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#47     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#48     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#49     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#50     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#51     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#52     RenderProxyBoxMixin.computeDistanceToActualBaseline (package:flutter/src/rendering/proxy_box.dart:93:19)
#53     RenderBox.getDistanceToActualBaseline.<anonymous closure> (package:flutter/src/rendering/box.dart:2384:63)
#54     _Baseline.memoize.ifAbsent (package:flutter/src/rendering/box.dart:1029:42)
#55     _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#56     _Baseline.memoize (package:flutter/src/rendering/box.dart:1030:18)
#57     RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#58     RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
#59     RenderBox.getDistanceToActualBaseline (package:flutter/src/rendering/box.dart:2381:12)
#60     RenderBox.getDistanceToBaseline (package:flutter/src/rendering/box.dart:2362:16)
#61     ChildLayoutHelper.getBaseline (package:flutter/src/rendering/layout_helper.dart:76:18)
#62     _RenderDecoration._getBaseline (package:flutter/src/material/input_decorator.dart:910:30)
#63     _RenderDecoration._layout (package:flutter/src/material/input_decorator.dart:1038:67)
#64     _RenderDecoration.performLayout (package:flutter/src/material/input_decorator.dart:1299:44)
#65     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#66     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:61:11)
#67     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:985:73)
#68     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:1051:32)
#69     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#70     RenderConstrainedBox.performLayout (package:flutter/src/rendering/proxy_box.dart:291:14)
#71     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#72     _RenderSingleChildViewport.performLayout (package:flutter/src/widgets/single_child_scroll_view.dart:483:14)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#74     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#75     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#76     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#85     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#86     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#87     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#88     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#89     RenderCustomPaint.performLayout (package:flutter/src/rendering/custom_paint.dart:569:11)
#90     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#91     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#92     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#93     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#94     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#95     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#96     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#97     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#98     RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#99     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#100    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#101    RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:234:12)
#102    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#103    RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:234:12)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#105    MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:173:12)
#106    _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1092:7)
#107    MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:237:7)
#108    RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:404:14)
#109    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#110    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#111    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#112    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#113    _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1448:11)
#114    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#115    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#116    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#117    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#118    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#119    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#120    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#121    ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:61:11)
#122    RenderStack._computeSize (package:flutter/src/rendering/stack.dart:595:43)
#123    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:622:12)
#124    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#125    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#126    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#127    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#128    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#129    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#130    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#131    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#132    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#133    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#134    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#135    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#136    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3728:13)
#137    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#138    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#139    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#140    _RenderTheaterMixin.layoutChild (package:flutter/src/widgets/overlay.dart:1002:13)
#141    _RenderTheater.performLayout (package:flutter/src/widgets/overlay.dart:1311:9)
#142    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#143    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#144    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#145    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#146    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#147    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#148    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#149    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#150    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#151    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#152    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#153    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#154    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#155    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#156    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#157    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#158    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#159    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:111:21)
#160    RenderObject.layout (package:flutter/src/rendering/object.dart:2608:7)
#161    RenderView.performLayout (package:flutter/src/rendering/view.dart:281:14)
#162    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2446:7)
#163    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1052:18)
#164    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1065:15)
#165    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:602:23)
#166    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1164:13)
#167    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:468:5)
#168    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1397:15)
#169    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1318:9)
#170    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:1040:9)
#171    PlatformDispatcher.scheduleWarmUpFrame.<anonymous closure> (dart:ui/platform_dispatcher.dart:837:16)
#175    _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
(elided 5 frames from class _AssertionError, class _Timer, and dart:async-patch)

The following RenderObject was being processed when the exception was fired: _RenderDecoration#c72f0 relayoutBoundary=up1 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE:
  creator: _Decorator ← InputDecorator ← Column ← _FormScope ← WillPopScope ←
    Form-[LabeledGlobalKey<FormState>#a7c7b] ← SizedBox ← _SingleChildViewport ←
    IgnorePointer-[GlobalKey#63fc0] ← Semantics ← Listener ← _GestureSemantics ← ⋯
  parentData: offset=Offset(0.0, 0.0); flex=null; fit=null (can use size)
  constraints: BoxConstraints(0.0<=w<=768.0, 0.0<=h<=Infinity)
  size: MISSING
This RenderObject had the following descendants (showing up to depth 5):
    input: _RenderLayoutSurrogateProxyBox#ca764 relayoutBoundary=up2 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
      child: RenderLeaderLayer#e84cd relayoutBoundary=up3 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
        child: RenderSemanticsAnnotations#3e591 relayoutBoundary=up4 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
          child: RenderMouseRegion#35c3d relayoutBoundary=up5 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
            child: RenderSemanticsAnnotations#a33d4 relayoutBoundary=up6 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
    helperError: RenderConstrainedBox#70726 relayoutBoundary=up2 NEEDS-PAINT
    container: RenderCustomPaint#6b6e4 NEEDS-LAYOUT NEEDS-PAINT
════════════════════════════════════════════════════════════════════════════════════════════════════

Another exception was thrown: RenderBox was not laid out: _RenderDecoration#c72f0 relayoutBoundary=up1 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderFlex#0f513 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderConstrainedBox#40f27 relayoutBoundary=up17 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: _RenderSingleChildViewport#fef6e relayoutBoundary=up16 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderIgnorePointer#3d171 relayoutBoundary=up15 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderSemanticsAnnotations#52c86 relayoutBoundary=up14 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPointerListener#3a4b2 relayoutBoundary=up13 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#9aec4 relayoutBoundary=up12 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPointerListener#a8481 relayoutBoundary=up11 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: _RenderScrollSemantics#5fddd relayoutBoundary=up10 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderRepaintBoundary#03cf1 relayoutBoundary=up9 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderCustomPaint#5cb1d relayoutBoundary=up8 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderMouseRegion#25089 relayoutBoundary=up7 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPointerListener#5ad61 relayoutBoundary=up6 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderSemanticsGestureHandler#7dfaa relayoutBoundary=up5 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPointerListener#18e0b relayoutBoundary=up4 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderRepaintBoundary#84b90 relayoutBoundary=up3 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPadding#2cb7f relayoutBoundary=up2 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderPadding#8de36 relayoutBoundary=up1 NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
Another exception was thrown: RenderBox was not laid out: RenderRepaintBoundary#84b90 relayoutBoundary=up3 NEEDS-PAINT