flutter/flutter

Updated layout information required for RenderIndexedSemantics#1efe6 relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT to calculate semantics.

LukyGithub opened this issue · 3 comments

Updated layout information required for RenderIndexedSemantics#1efe6 relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT to calculate semantics.
'package:flutter/src/rendering/object.dart':
Failed assertion: line 3620 pos 12: '!_needsLayout'

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

When the exception was thrown, this was the stack:
#2      RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3620:12)
object.dart:3620
#3      RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#4      ContainerRenderObjectMixin.visitChildren (package:flutter/src/rendering/object.dart:4343:14)
object.dart:4343
#5      RenderSliverMultiBoxAdaptor.visitChildrenForSemantics (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:400:11)
sliver_multi_box_adaptor.dart:400
#6      RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#7      RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#8      RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#9      RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#10     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#11     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#12     Iterable.forEach (dart:core/iterable.dart:347:35)#13     RenderViewportBase.visitChildrenForSemantics (package:flutter/src/rendering/viewport.dart:314:10)
#13     RenderViewportBase.visitChildrenForSemantics (package:flutter/src/rendering/viewport.dart:314:10)
#14     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#15     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#16     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#17     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#18     RenderIgnorePointer.visitChildrenForSemantics (package:flutter/src/rendering/proxy_box.dart:3599:11)
proxy_box.dart:3599
#19     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#20     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
#21     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
#22     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#23     RenderSemanticsAnnotations.visitChildrenForSemantics (package:flutter/src/rendering/proxy_box.dart:4267:11)
proxy_box.dart:4267
#24     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#25     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#26     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#27     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#28     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#29     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#30     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#31     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#32     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#33     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#34     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#35     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#36     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#37     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#38     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#39     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#40     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#41     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#42     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#43     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#44     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#45     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#46     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#47     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#48     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#49     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#50     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#51     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#52     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#53     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#54     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#55     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#56     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#57     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#58     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#59     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#60     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#61     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#62     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)
object.dart:4052
#63     RenderObject.visitChildrenForSemantics (package:flutter/src/rendering/object.dart:3777:5)
object.dart:3777
#64     RenderObject._getSemanticsForParent (package:flutter/src/rendering/object.dart:3634:5)
object.dart:3634
#65     RenderObject._getSemanticsForParent.<anonymous closure> (package:flutter/src/rendering/object.dart:3636:61)
object.dart:3636
#66     RenderObjectWithChildMixin.visitChildren (package:flutter/src/rendering/object.dart:4052:14)


as much as i could paste... The issue seems to only appear on windows native. No idea where this comes from.
The full build method. I know the issue is from here, none of the dependencies cause it.

@override
  Widget build(BuildContext context) {
    final taskKeeper = LiveTaskHolder.taskKeeper;
    final windowSize = MediaQuery.of(context).size;
    final theme = Theme.of(context);
    final finishedTasksHeadline = theme.textTheme.headlineSmall;
    final buttonStyle = IconButton.styleFrom(iconSize: kMinInteractiveDimension*0.4, padding: const EdgeInsets.all(0), tapTargetSize: MaterialTapTargetSize.shrinkWrap, enableFeedback: true,);
    int freeIndex = 0;
    final iconButtonTheme = IconButton.styleFrom(backgroundColor: theme.colorScheme.surfaceVariant, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(kMinInteractiveDimension*0.2)));
    final deleteIconButtonTheme = IconButton.styleFrom(backgroundColor: Colors.redAccent, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(kMinInteractiveDimension*0.2)));

    int getFreeIndex(){
      freeIndex+=1;
      return freeIndex-1;
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text("Any %"),
        centerTitle: true,
        actions: [
          IconButton(onPressed: () => {Navigator.push(context, MaterialPageRoute(builder: (context) => const CalendarPage()))}, icon: const Icon(Icons.calendar_month_outlined)),
          IconButton(onPressed: () => {Navigator.push(context, MaterialPageRoute(builder: (context) => const SettingsPage()))}, icon: const Icon(Icons.settings_outlined)),
          const SizedBox(width: 20),
        ],),
      body: SafeArea(
        child: Center(
          child: ListenableBuilder(listenable: taskKeeper, builder: (BuildContext context, Widget? child){
            return ReorderableListView.builder(
              buildDefaultDragHandles: false,
              onReorder: (currentIndex, newIndex) {taskKeeper.changeIndex(currentIndex, newIndex);freeIndex=0;},
              itemCount: taskKeeper.tasks.length+2,
              itemBuilder: (context, index) {
                if(index < taskKeeper.tasks.length){
                  Task task = taskKeeper.tasks[index];
                  final taskNameTheme = theme.textTheme.headlineSmall?.copyWith(fontSize: max(25.0-task.taskName.length*0.001*windowSize.width, 15));
                  return Card(
                    key: Key(task.taskName + task.taskId.toString()),
                    child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: [
                        SizedBox(
                          width: windowSize.width - (windowSize.width*0.333 + 45 + kMinInteractiveDimension*1.1),
                          height: 50,
                          child: Row(
                            children: [
                              DropdownButton<int>(
                                focusColor: Colors.white,
                                underline: const SizedBox(),
                                padding: EdgeInsets.zero,
                                iconSize: 0,
                                isDense: false,
                                itemHeight: 60,
                                value: task.taskImportance,
                                items: importanceLevels.map((value) => DropdownMenuItem<int>(value: value, child: Container(
                                  width: kMinInteractiveDimension, 
                                  height: kMinInteractiveDimension,
                                  decoration: BoxDecoration(
                                    borderRadius: const BorderRadius.all(Radius.circular(10)),
                                    color: Task.importanceColorSwatches[importanceLevels.indexOf(value)],
                                  ),)
                                )).toList(),
                                onChanged: (index) => taskKeeper.changeValue(task.taskId, 4, index.toString()),
                              ),
                              const Padding(padding: EdgeInsets.all(8),),
                              Flexible(child: GestureDetector(
                                onTap: () => {
                                  Navigator.push(context, MaterialPageRoute(builder: (context) => TaskPage(selectedTask: task,)))
                                },
                                child: Container(
                                  width: windowSize.width - (windowSize.width*0.3 + 34 + kMinInteractiveDimension*1.5),
                                  height: kMinInteractiveDimension,
                                  alignment: windowSize.width > 800 ? Alignment.center : Alignment.centerLeft,
                                  child: ReorderableDragStartListener(
                                    enabled: false, //TODO: Add settings option to toggle sort modes
                                    index: getFreeIndex(),
                                    child: AutoSizeText(task.taskName, style: taskNameTheme, overflow: TextOverflow.ellipsis, maxLines: 2, minFontSize: 15,)
                                  ),
                                ),
                              ),
                              ),
                            ],
                          ),
                        ),
                        Expanded(child: 
                          Align(
                            alignment: Alignment.centerRight,
                            child: GestureDetector(
                              onTapDown: (TapDownDetails tapDetails) {
                                if(tapDetails.localPosition.dx > windowSize.width*0.15){
                                  taskKeeper.changeValue(task.taskId, 3, (taskKeeper.getTask(task.taskId).taskPercentage + 10).toString());
                                  HapticFeedback.mediumImpact();
                                }
                                else{
                                  taskKeeper.changeValue(task.taskId, 3, (taskKeeper.getTask(task.taskId).taskPercentage - 10).toString());
                                  HapticFeedback.mediumImpact();
                                }
                              },
                              child: Container(
                                alignment: windowSize.width > 800 ? Alignment.center : Alignment.centerRight,
                                height: kMinInteractiveDimension,
                                width: windowSize.width*0.3 + 56,
                                decoration: BoxDecoration(
                                  borderRadius: BorderRadius.circular(10),
                                  color: theme.colorScheme.background,
                                ),
                                child: Row(
                                  mainAxisAlignment: MainAxisAlignment.center,
                                  children: [
                                    IconButton(
                                      color: theme.colorScheme.onBackground,
                                      enableFeedback: true,
                                      onPressed:() {
                                        taskKeeper.changeValue(task.taskId, 3, (taskKeeper.getTask(task.taskId).taskPercentage - 10).toString());
                                        HapticFeedback.mediumImpact();
                                      },  //TODO: Add to settings default change rate
                                      icon: const Icon(Icons.remove), 
                                      style: buttonStyle,
                                      constraints: const BoxConstraints(minWidth: kMinInteractiveDimension*0.5, maxWidth: kMinInteractiveDimension*0.5, minHeight: kMinInteractiveDimension, maxHeight: kMinInteractiveDimension),
                                    ),
                                    const Padding(padding: EdgeInsets.all(2)),
                                    RoundedProgressBar(percent: task.taskPercentage, color: theme.colorScheme.onInverseSurface, height: kMinInteractiveDimension, width: windowSize.width*0.3,), 
                                    const Padding(padding: EdgeInsets.all(2)),
                                    IconButton(
                                      color: theme.colorScheme.onBackground,
                                      enableFeedback: true,
                                      onPressed:() {
                                        taskKeeper.changeValue(task.taskId, 3, (taskKeeper.getTask(task.taskId).taskPercentage + 10).toString());
                                        HapticFeedback.mediumImpact();
                                      }, 
                                      icon: const Icon(Icons.add), 
                                      style: buttonStyle, 
                                      constraints: const BoxConstraints(minWidth: kMinInteractiveDimension*0.5, maxWidth: kMinInteractiveDimension*0.5, minHeight: kMinInteractiveDimension, maxHeight: kMinInteractiveDimension)
                                    ),
                                  ],
                                ),
                              ),
                            )
                          )
                        ),
                      ]),
                    ),
                  );
                }
                else if(index == taskKeeper.tasks.length) {
                  if(taskKeeper.finishedTasks.isNotEmpty){  
                    return ReorderableDragStartListener(
                      index: -1,
                      key: const Key("finishedTasks"),
                      enabled: false,
                      child: Theme(
                        data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
                        child: ExpansionTile(
                          childrenPadding: const EdgeInsets.fromLTRB(0, 10, 0, 10),
                          title: Row(
                            children: [
                              const Icon(Icons.done, color: Colors.black87,),
                              const Padding(padding: EdgeInsets.all(8)),
                              Text("Finished tasks", style: finishedTasksHeadline,),
                            ]
                          ),
                          children: [
                            ColumnBuilder(
                              itemCount: taskKeeper.finishedTasks.length,
                              itemBuilder: (context, index) {
                              Task task = taskKeeper.finishedTasks[index];
                              return GestureDetector(
                                onTap: () => {
                                  Navigator.push(context, MaterialPageRoute(builder: (context) => TaskPage(selectedTask: task,)))
                                },
                                child: Card(
                                  // key: Key(task.taskName+task.taskId.toString()),
                                  child: Padding(padding: const EdgeInsets.fromLTRB(20, 8, 20, 8),
                                  child: Row(
                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                    children: [
                                      Container(
                                        alignment: Alignment.centerLeft,
                                        width: windowSize.width - 150,
                                        height: kMinInteractiveDimension,
                                        child: AutoSizeText(task.taskName, style: theme.textTheme.headlineSmall, overflow: TextOverflow.ellipsis, maxLines: 2, minFontSize: 15,) //?.copyWith(fontSize: max(30.0-task.taskName.length*0.0007*windowSize.width, 15))
                                      ),
                                      Row(
                                        children: [
                                          IconButton(onPressed: () {taskKeeper.changeValue(task.taskId, 3, "0");}, icon: const Icon(Icons.upgrade_sharp), style: iconButtonTheme,), //MaterialPageRoute(builder: (context) => EditPage(selectedTask: selectedTaskLive,))
                                          IconButton(onPressed: () {taskKeeper.deleteTask(task.taskId);}, icon: const Icon(Icons.delete), style: deleteIconButtonTheme, color: Colors.white,),
                                        ],
                                      ),
                                    ]
                                  ),),
                                ),
                              );}
                            ),
                          ],
                        ), //return Text("No finished tasks right now", style: taskNameTheme,);
                      )
                    );
                  }
                  else{
                    return const SizedBox(key: Key("NoFinTasks"),);
                  }
                }
                else{
                  return const SizedBox(key: Key("BottomPadding"), height: 80,);
                }
            });
          }),
        ),
      ),
      floatingActionButton: Padding(
        padding: const EdgeInsets.all(10.0),
        child: SizedBox(
          height: 70,
          width: 70,
          child: ElevatedButton(onPressed: () => {Navigator.push(context, MaterialPageRoute(builder: (context) => const AddPage()))}, child: const Icon(Icons.add))
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
    );
  }
}

Thanks for the report @LukyGithub
In order to properly address the issue, please provide us flutter doctor -v and a complete but minimal runnable reproducible code sample without third party package implementation that still triggers the reported error.

I fixed this. The error was in one of the tasks, which was corrupted. Doesn't change that the debug info it gave was super vague... After deleting all the tasks I had it started working again. The problem was in the end in two objects, which somehow had same Keys. So in the end the error was completely mine and not the engine's. But again it could give a bit more info, like it does on android and other platforms.
Edit: The reason it worked on other platforms was, that there were no duplicate tasks