Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

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

Closed
LukyGithub opened this issue May 16, 2024 · 3 comments
Labels
r: invalid Issue is closed as not valid

Comments

@LukyGithub
Copy link

LukyGithub commented May 16, 2024

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,
    );
  }
}
@darshankawar darshankawar added the in triage Presently being triaged by the triage team label May 17, 2024
@darshankawar
Copy link
Member

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.

@darshankawar darshankawar added the waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds label May 17, 2024
@LukyGithub
Copy link
Author

LukyGithub commented May 17, 2024

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

@github-actions github-actions bot removed the waiting for customer response The Flutter team cannot make further progress on this issue until the original reporter responds label May 17, 2024
@darshankawar
Copy link
Member

Good to know you resolved the issue. Closing as such.

@darshankawar darshankawar closed this as not planned Won't fix, can't repro, duplicate, stale May 20, 2024
@darshankawar darshankawar added r: invalid Issue is closed as not valid and removed in triage Presently being triaged by the triage team labels May 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
r: invalid Issue is closed as not valid
Projects
None yet
Development

No branches or pull requests

2 participants