如果我使用刷新指示器或按钮点击,此代码将完全正常工作。
但是,如果在SliverAppBar for onStretchTrigger function中使用它,则无法工作。
onStretchTrigger: () async {
setState(() {
myVariable = myFutureData();
});
},我所犯的错误:
I/颤振(31102):在帧内计划构建。
I/颤振(31102):在构建、布局和绘制小部件树时,计划使用一个新的框架来重新构建小部件树。
I/颤振(31102):这可能是因为setState()是从布局或画图回调调用的。如果需要对小部件树进行更改,则应该在构建该树时应用它。相反,为后续帧安排更改会导致接口滞后于一个帧。如果这样做是为了使您的构建依赖于在布局时测量的大小,请考虑使用LayoutBuilder、CustomSingleChildLayout或CustomMultiChildLayout。
另一方面,如果一个帧延迟是想要的效果,例如,因为这是一个动画,那么考虑使用SchedulerBinding.addPostFrameCallback或使用AnimationController来触发动画,在帧后回调中调度帧。I/颤振(31102):I/颤振(31102):#0
WidgetsBinding._handleBuildScheduled。包装:颤振/…/widget/binding.dart:747
I/颤振(31102):#1 WidgetsBinding._handleBuildScheduled包:颤振/…/widget/binding.dart:770
I/颤振(31102):#2 BuildOwner.scheduleBuildFor软件包:颤振/…/widgets/Frawork.DAT:2476
I/颤振(31102):#3 Element.markNeedsBuild包:颤振/…/widgets/Frawork.DAT:4324
I/颤振(31102):#4 State.setState软件包:颤振/…/widgets/Frawork.DAT:1108
I/颤振(31102):#5 _HomeScreenState.build。包装:fesale/显示屏/屏幕_fesale。省:197
I/颤振(31102):#6 _HomeScreenState.build。包装:fesale/显示屏/屏幕_fesale。省:195
I/颤振(31102):#7 RenderSliverPersistentHeader.layoutChild包:颤振/…/渲染/条子_持久的头文件:257
I/颤振(31102):#8
RenderSliverFloatingPersistentHeader.performLayout包:颤振/…/渲染/条子_持久的头文件:708
I/颤振(31102):#9 RenderObject.layout包:颤振/…/渲染/Object.Dart:1858年
I/颤振(31102):#10 RenderViewportBase.layoutChildSeq
请帮助找不到任何解决办法:
发布于 2021-09-24 09:50:50
初始:首先:您不需要在其中放置async,因为您没有使用await关键字,它只是一个函数调用,返回值被分配给您的变量。
UPDATE:onStretchTrigger实际上需要一个AsyncCallback,所以对于这个用例,必须使用async关键字-对不起!
第二:您的错误消息说明了造成这种情况的原因,并提供了几种解决方案:
...这可能是因为setState()是从布局或画图回调调用的。..。考虑使用SchedulerBinding.addPostFrameCallback在帧后回调中调度帧.
所以现在你可以:
SchedulerBinding.instance?.addPostFrameCallback((_) {
setState(() => myVariable = myFutureData());
});https://stackoverflow.com/questions/69312675
复制相似问题