Flutter 中是否有任何回调告诉我“构建”功能何时完成?

2023-11-22

我的屏幕上有一个 listView 。我已经给它附加了一个控制器。我能够调用我的端点,接收响应,解析它并插入行中。 ListView 应该自动滚动。确实如此,但不是以完美的方式。我总是落后一个项目。这是我的代码:

@override
  Widget build(BuildContext context) {
    // Scroll to the most recent item
    if (equationList.length > 0) {
      _toEnd();
    }

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: EquList(equationList, _scrollController),
      floatingActionButton: new FloatingActionButton(
        onPressed: onFabClick,
        tooltip: 'Fetch Post',
        child: new Icon(isLoading ? Icons.pause : Icons.play_arrow),
      ),
    );
  }

  void _toEnd() {
    _scrollController.animateTo(
      _scrollController.position.maxScrollExtent,
      duration: const Duration(milliseconds: 250),
      curve: Curves.ease,
    );
  }

问题是,我正在打电话_toEnd()最后一项插入列表之前的函数。所以,我正在寻找一个回调(如果有的话)来告诉我build()已经完成了。然后我打电话给我的_toEnd()功能。

在这种情况下,最佳做法是什么?


通用解决方案

澄清一下,我没想到这个问题会引起如此多的关注。因此,我只回答这个非常具体的案例。
As 另一个答案中解释过 WidgetsBinding提供了一种添加方法one time 柱架callback.

WidgetsBinding.instance!.addPostFrameCallback((_) {
  // executes after build
})

因为这个回调将只被调用一次,您将需要在每次构建时添加它:

@override
Widget build(BuildContext context) {
  WidgetsBinding.instance!.addPostFrameCallback((_) => afterBuild);
  return Container(); // widget tree
}

void afterBuild() {
  // executes after build is done
}

具体(异步)

详细阐述Günter's评论:

@override
Widget build(BuildContext context) {
  executeAfterBuild();
  return Container();
}

Future<void> executeAfterBuild() async {
  await Future.delayed(Duration.zero);
  // this code will get executed after the build method
  // because of the way async functions are scheduled
}

有一个很好的例子说明这种效果 here.
有关的广泛信息Dart 中的调度 可以在这里找到.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter 中是否有任何回调告诉我“构建”功能何时完成? 的相关文章

随机推荐

  • delete[] 如何“知道”操作数数组的大小?

    Foo set new Foo 100 delete set 您没有将数组的边界传递给delete 但这些信息存储在哪里 是否标准化 当您在堆上分配内存时 分配器将跟踪您分配了多少内存 它通常存储在您分配的内存之前的 头 段中 这样 当需要
  • 编写一个有 2 个线程交替打印的程序

    我最近在接受采访时被问到这个问题 编写一个具有两个线程 A 和 B 的程序 其中 A 打印 1 B 打印 2 依此类推 直到达到 50 我们该如何去做呢 分配的本质是演示一个线程如何向另一个线程发出信号 最常见的方法是使用阻塞队列 但这里信
  • 在Python 2.7中模拟按键事件

    我想要做的是在 Windows 上按 Python 脚本级别的任意键盘键 我尝试过 SendKeys 但它仅适用于 python 2 6 我尝试过的其他方法包括 import win32com client win32com client
  • 来自 ADFS 服务器的 URL 重定向

    我在 ASP net Web 应用程序中使用 ADFS 进行身份验证 STS服务器将浏览器重定向到https test contoso com 首先将客户端重定向到 STS 时 STS 不允许任何返回 URL 参数 是否可以将浏览器重定向到
  • 整数除法的行为是什么?

    例如 int result result 125 100 or result 43 100 结果总是分区的底线吗 定义的行为是什么 结果总是分区的底线吗 定义的行为是什么 不完全的 它向 0 舍入 而不是向下舍入 6 5 5 乘法运算符 6
  • Java 的“Parallel.For”?

    我想知道是否有并行 For相当于 Java 的 net 版本吗 如果有人可以提供一个例子吗 谢谢 我想最接近的事情是 ExecutorService exec Executors newFixedThreadPool SOME NUM OF
  • jquery 中的按钮文本切换

    当我单击 pushme 按钮时 它会将其文本变为 不要推我 当再次单击按钮时 我想再次将文本变为 推我 我怎样才能做到这一点
  • 避免应用程序激活并在单击其上的按钮时集中注意力 - Windows API 或 Qt

    情况 无边框 QDialog 成功地保持在其他应用程序之上 问题是当单击此始终位于顶部的应用程序窗口时 会发生以下情况 单击的始终位于顶部的应用程序被激活 单击的始终位于顶部的应用程序窗口会窃取先前活动 聚焦的应用程序的焦点 是否有可能当单
  • YouTube API loadVideoById startSeconds 不起作用

    我为我嵌入的一些 YouTube 视频创建了一个章节选择器 此方法曾经有效 但最近已停止 我不明白发生了什么事 我使用他们推荐的格式 但使用 loadVideoById 来显示每一章 div class wrapper div div di
  • 具有 MVVM 模式的数字文本框

    我见过数字的实现TextBox后面的代码WPF 我们如何做到这一点MVVM图案 在 WPF 中 如果将 TextBox 绑定到 Decimal 或 Int 属性 它将仅接受该 int 或decimal 否则它将显示红色边框 表明它在绑定中没
  • 什么是真与假?它与 True 和 False 有何不同?

    我刚刚了解到有truthy and falsypython 中的值与正常值不同True and False 有人可以深入解释一下什么吗truthy and falsy价值观是 我应该在哪里使用它们 有什么区别truthy and True价
  • 为什么 ${basedir} NLog 配置不起作用?

    为什么我无法在生产服务器中使用 basedir nlog config 如果我使用fileName basedir logs shortdate log nlog 不记录消息信息 但是如果我更改为类似的内容fileName C logs s
  • dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口有什么关系?

    dockerfile中的EXPOSE和服务YAML中的TARGETPORT与Pod中实际运行的端口有什么关系 在我的 dockerfile 中 expose 8080 在我的部署中 ports containerPort 8080 在我的服
  • fork() 后 libCurl SSL 错误

    我正在开发一个 FUSE 驱动程序 当我将其作为守护进程运行时 没有 f 或 d 标志 通过 libcurl 发出的所有 https 请求都会失败 我能够通过发出 https 请求 分叉并返回父进程 然后从新进程发出第二个请求来重现该错误
  • 查找关联记录存在的位置

    如何仅选择那些具有关联标签记录的员工 换句话说 仅选择具有一个或多个与其关联的标签记录的员工记录 class Employee lt ActiveRecord Base has and belongs to many tags end cl
  • 在 ASP.NET 中正确执行锁定

    我有一个 ASP NET 站点 其搜索功能相当慢 我想通过使用查询作为缓存键将结果添加到缓存一小时来提高性能 using System using System Web using System Web Caching public cla
  • Spring Boot应用程序立即退出

    当我运行我的spring bootapplication 它立即退出 与exit code 0 有了这个 Spring Boot v2 1 0 RELEASE 2018 11 27 14 08 31 219 INFO 94920 resta
  • iOS 检测蓝牙连接/断开

    即使我的应用程序处于后台 当蓝牙设备与 iOS 连接或断开连接时 是否可以收到通知 在 Android 上 我使用ACTION ACL CONNECTED and ACTION ACL DISCONNECTED事件 但我找不到 iOS 的等
  • Chrome 特定的 CSS 问题将表格单元格设置为显示:块

    I found 这个问题那似乎有我想要的 我正在使用 chrome 32 0 1700 102 甚至fiddle第一个答案对我来说效果很好 但是 当我将以下 html 放入新文件并在 chrome 中打开它时 tds 的 计算样式 选项卡仍
  • Flutter 中是否有任何回调告诉我“构建”功能何时完成?

    我的屏幕上有一个 listView 我已经给它附加了一个控制器 我能够调用我的端点 接收响应 解析它并插入行中 ListView 应该自动滚动 确实如此 但不是以完美的方式 我总是落后一个项目 这是我的代码 override Widget