【问题标题】:Flutter onStretchTrigger not working. Build scheduled during frame颤振 onStretchTrigger 不起作用。在框架期间计划构建
【发布时间】:2021-11-17 14:24:10
【问题描述】:

如果我使用 刷新指示器或按钮点击,此代码将完全正常工作。

但是如果在 SliverAppBar 中使用它来实现 onStretchTrigger 功能将不起作用。

onStretchTrigger: () async {
 setState(() {
 myVariable = myFutureData();
 });
},

我得到的错误:

I/flutter (31102):在帧期间计划构建。

I/flutter (31102):在构建、布局小部件树时, 并绘制后,安排了一个新框架来重建小部件树。

I/flutter (31102):这可能是因为 setState() 是从 布局或绘制回调。如果需要对小部件树进行更改,它 应该在构建树时应用。安排更改 后续帧反而会导致界面滞后 一帧。如果这样做是为了使您的构建依赖于大小 在布局时测量,考虑使用 LayoutBuilder, CustomSingleChildLayout 或 CustomMultiChildLayout。

另一方面,如果一帧延迟是所需的效果,则 例如,因为这是一个动画,请考虑将帧安排在 使用 SchedulerBinding.addPostFrameCallback 或 使用 AnimationController 来触发动画。我/颤动 (31102):我/颤振(31102):#0
WidgetsBinding._handleBuildScheduled。 包:flutter/…/widgets/binding.dart:747

I/flutter (31102):#1 WidgetsBinding._handleBuildScheduled 包:flutter/…/widgets/binding.dart:770

I/flutter (31102):#2 BuildOwner.scheduleBuildFor 包:flutter/…/widgets/framework.dart:2476

I/flutter (31102):#3 Element.markNeedsBuild 包:flutter/…/widgets/framework.dart:4324

I/flutter (31102): #4 State.setState 包:flutter/…/widgets/framework.dart:1108

I/flutter (31102):#5 _HomeScreenState.build。 包:fesale/screens/screen_home.dart:197

I/flutter (31102):#6 _HomeScreenState.build。 包:fesale/screens/screen_home.dart:195

I/flutter (31102): #7 RenderSliv​​erPersistentHeader.layoutChild 包:flutter/…/rendering/sliver_persistent_header.dart:257

我/颤振 (31102):#8
RenderSliv​​erFloatingPersistentHeader.performLayout 包:flutter/…/rendering/sliver_persistent_header.dart:708

I/flutter (31102): #9 RenderObject.layout 包:flutter/…/rendering/object.dart:1858

I/flutter (31102): #10 RenderViewportBase.layoutChildSeq

请帮助找不到任何解决方案:(

【问题讨论】:

    标签: flutter flutter-layout flutter-dependencies flutter-web flutter-animation


    【解决方案1】:

    INITIAL:首先:你不需要把async放在那里,因为你没有使用await关键字,它只是一个函数调用,返回值为被分配给你的变量。

    更新:onStretchTrigger 实际上需要 AsyncCallback,因此对于这个用例,必须使用 async 关键字 - 抱歉!


    第二:您的错误消息说明了导致此问题的原因并提供了几种解决方案:

    [...] 这可能是因为 setState() 是从布局或绘制回调中调用的。 [...] 考虑使用 SchedulerBinding.addPostFrameCallback 在帧后回调中调度帧 [...]

    所以现在你可以这样做:

    SchedulerBinding.instance?.addPostFrameCallback((_) {
      setState(() => myVariable = myFutureData());
    });
    

    【讨论】:

    • 如果我删除异步我需要返回一些东西否则我会得到这个错误 => 正文可能会正常完成,导致返回“null”,但返回类型可能是不可为空的类型.尝试在末尾添加 return 或 throw 语句。
    • 你是对的!刚刚查看了文档,onStretchTrigger 期望 AsyncCallback,所以在这种情况下实际上需要异步,抱歉!
    猜你喜欢
    • 2021-11-23
    • 1970-01-01
    • 2019-01-05
    • 2021-02-14
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多