AbdulRahmanAlHamali / flutter_pagewise

A library for widgets that load their content one page (or batch) at a time.
BSD 2-Clause "Simplified" License
231 stars 68 forks source link

widget cannot be marked as needing to build because the framework is already in the process of building widgets #63

Open shuat opened 5 years ago

shuat commented 5 years ago

I get the following exception when trying to implement your example in my app

I/flutter (14463): ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
I/flutter (14463): The following assertion was thrown while dispatching notifications for
I/flutter (14463): PagewiseLoadController<dynamic>:
I/flutter (14463): setState() or markNeedsBuild() called during build.
I/flutter (14463): This PagewiseListView<dynamic> widget cannot be marked as needing to build because the framework is
I/flutter (14463): already in the process of building widgets. A widget can be marked as needing to be built during the
I/flutter (14463): build phase only if one of its ancestors is currently building. This exception is allowed because
I/flutter (14463): the framework builds parent widgets before children, which means a dirty descendant will always be
I/flutter (14463): built. Otherwise, the framework might not visit this widget during this build phase.
I/flutter (14463): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (14463):   PagewiseListView<dynamic>(state: PagewiseState<dynamic>#dafc8)
sjmcdowall commented 5 years ago

Need more of the stack trace and more code for your app (or the example) ... the below general is a logic error in your code ..

On May 13, 2019, at 11:29 PM, shua Talansky notifications@github.com wrote:

I get the following exception when trying to implement your example in my app

I/flutter (14463): ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════ I/flutter (14463): The following assertion was thrown while dispatching notifications for I/flutter (14463): PagewiseLoadController: I/flutter (14463): setState() or markNeedsBuild() called during build. I/flutter (14463): This PagewiseListView widget cannot be marked as needing to build because the framework is I/flutter (14463): already in the process of building widgets. A widget can be marked as needing to be built during the I/flutter (14463): build phase only if one of its ancestors is currently building. This exception is allowed because I/flutter (14463): the framework builds parent widgets before children, which means a dirty descendant will always be I/flutter (14463): built. Otherwise, the framework might not visit this widget during this build phase. I/flutter (14463): The widget on which setState() or markNeedsBuild() was called was: I/flutter (14463): PagewiseListView(state: PagewiseState#dafc8) — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/AbdulRahmanAlHamali/flutter_pagewise/issues/63?email_source=notifications&email_token=AAPQZ3LGEX34SSNU4F6D7ALPVIW3NA5CNFSM4HMVDKV2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4GTSHFOQ, or mute the thread https://github.com/notifications/unsubscribe-auth/AAPQZ3PCV3QXNPOXB2E53ULPVIW3NANCNFSM4HMVDKVQ.

mohisham commented 5 years ago

I too get a similar error. My code actually works fine, but the pageFuture keeps firing even if I make slight changes to what's displayed on the screen. I am trying to add a AsyncMemoizer (as described in this article: https://medium.com/saugo360/flutter-my-futurebuilder-keeps-firing-6e774830bc2) which is causing the error below:

I/flutter ( 6677): ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
I/flutter ( 6677): The following assertion was thrown while dispatching notifications for
I/flutter ( 6677): PagewiseLoadController<dynamic>:
I/flutter ( 6677): setState() or markNeedsBuild() called during build.
I/flutter ( 6677): This PagewiseListView<dynamic> widget cannot be marked as needing to build because the framework is
I/flutter ( 6677): already in the process of building widgets. A widget can be marked as needing to be built during the
I/flutter ( 6677): build phase only if one of its ancestors is currently building. This exception is allowed because
I/flutter ( 6677): the framework builds parent widgets before children, which means a dirty descendant will always be
I/flutter ( 6677): built. Otherwise, the framework might not visit this widget during this build phase.
I/flutter ( 6677): The widget on which setState() or markNeedsBuild() was called was:
I/flutter ( 6677):   PagewiseListView<dynamic>(state: PagewiseState<dynamic>#daaf9)
I/flutter ( 6677): The widget which was currently being built when the offending call was made was:
I/flutter ( 6677):   SliverList(delegate: SliverChildBuilderDelegate#c5427(estimated child count: 1), renderObject:
I/flutter ( 6677):   RenderSliverList#67457 relayoutBoundary=up2 NEEDS-LAYOUT NEEDS-PAINT)
I/flutter ( 6677): 
I/flutter ( 6677): When the exception was thrown, this was the stack:
I/flutter ( 6677): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3497:11)
I/flutter ( 6677): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3523:6)
I/flutter ( 6677): #2      State.setState (package:flutter/src/widgets/framework.dart:1138:14)
I/flutter ( 6677): #3      PagewiseState.initState.<anonymous closure> (package:flutter_pagewise/flutter_pagewise.dart:202:7)
I/flutter ( 6677): #4      ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:206:21)
I/flutter ( 6677): #5      PagewiseLoadController.fetchNewPage (package:flutter_pagewise/flutter_pagewise.dart:471:14)
I/flutter ( 6677): #7      PagewiseLoadController.fetchNewPage (package:flutter_pagewise/flutter_pagewise.dart:460:28)
I/flutter ( 6677): #8      PagewiseState._itemBuilder (package:flutter_pagewise/flutter_pagewise.dart:270:35)
I/flutter ( 6677): #9      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:398:15)
I/flutter ( 6677): #10     SliverMultiBoxAdaptorElement._build.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1002:67)
I/flutter ( 6677): #11     _HashMap.putIfAbsent (dart:collection/runtime/libcollection_patch.dart:137:29)
I/flutter ( 6677): #12     SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1002:26)
I/flutter ( 6677): #13     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1015:55)
I/flutter ( 6677): #14     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2253:19)
I/flutter ( 6677): #15     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1008:11)
I/flutter ( 6677): #16     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:274:23)
I/flutter ( 6677): #17     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1728:58)
I/flutter ( 6677): #18     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:797:15)
I/flutter ( 6677): #19     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1728:13)
I/flutter ( 6677): #20     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:263:5)
I/flutter ( 6677): #21     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:347:5)
I/flutter ( 6677): #22     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:78:12)
I/flutter ( 6677): #23     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #24     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
I/flutter ( 6677): #25     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #26     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:407:13)
I/flutter ( 6677): #27     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1322:12)
I/flutter ( 6677): #28     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1240:20)
I/flutter ( 6677): #29     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #30     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #31     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #32     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #33     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #34     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #35     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #36     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #37     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #38     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #39     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #40     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #41     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #42     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #43     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #44     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #45     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #46     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:142:11)
I/flutter ( 6677): #47     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:350:7)
I/flutter ( 6677): #48     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:212:7)
I/flutter ( 6677): #49     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:356:14)
I/flutter ( 6677): #50     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #51     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #52     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #53     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #54     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1206:11)
I/flutter ( 6677): #55     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #56     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #57     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #58     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #59     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #60     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #61     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #62     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #63     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #64     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
I/flutter ( 6677): #65     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #66     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3030:14)
I/flutter ( 6677): #67     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
I/flutter ( 6677): #68     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
I/flutter ( 6677): #69     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1507:7)
I/flutter ( 6677): #70     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:766:18)
I/flutter ( 6677): #71     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:329:19)
I/flutter ( 6677): #72     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
I/flutter ( 6677): #73     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:268:5)
I/flutter ( 6677): #74     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:988:15)
I/flutter ( 6677): #75     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:928:9)
I/flutter ( 6677): #76     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:840:5)
I/flutter ( 6677): #80     _invoke (dart:ui/hooks.dart:209:10)
I/flutter ( 6677): #81     _drawFrame (dart:ui/hooks.dart:168:3)
I/flutter ( 6677): (elided 4 frames from package dart:async)
I/flutter ( 6677): 
I/flutter ( 6677): The PagewiseLoadController<dynamic> sending notification was:
I/flutter ( 6677):   Instance of 'PagewiseLoadController<dynamic>'
wyxcoder commented 5 years ago

Any followup on this? I am having the issue and cannot figure out why. If I put this to test in pageFuture, it works fine

return Future.delayed(Duration(seconds: 10), () => [{'a':'Large Latte'}]);

But if I use http to get from my server, It gives the error

var response = await http.get ....

The following assertion was thrown while dispatching notifications for PagewiseLoadController: setState() or markNeedsBuild() called during build.

huhuang03 commented 4 years ago

Any followup on this? I am having the issue and cannot figure out why. If I put this to test in pageFuture, it works fine

return Future.delayed(Duration(seconds: 10), () => [{'a':'Large Latte'}]);

But if I use http to get from my server, It gives the error

var response = await http.get ....

The following assertion was thrown while dispatching notifications for PagewiseLoadController: setState() or markNeedsBuild() called during build.

In my situation. After some debug, I found the real issue is the code like this: The right way:

onTap: () => so_something_that_create_widget

Mistake wrong way:

onTap: so_something_that_create_widget
Cinux-Chosan commented 3 years ago

same error!

Cinux-Chosan commented 3 years ago

This is my pageFuture: pageFuture: (pageIndex) => _loadData(pageIndex, pageSize)

I get this error when the return type of _loadData is dynamic:

error:

  _loadData(int? page, int? size) async {
    return  [1, 2, 3];
  }

when I give the _loadData a return type will work fine for me:

right:

  Future<List<dynamic>> _loadData(int? page, int? size) async {
    return  [1, 2, 3];
  }
agil3st commented 2 years ago

If you guys use GetX, this issue solved for me by adding these lines on initState()

Future.delayed(Duration.zero, () { // <-- add this
  _controller.attachments.clear(); // obx variable
  _controller.commentRefresher.value = RefreshController(); // obx variable
});