FutureBuilder 使我的应用程序冻结,因为它在构建之前等待文件加载

2024-04-22

我正在编写一个非常基本的 flutter 应用程序,用于阅读公共领域的书籍。我在应用程序的资产中包含了一个包含一本书的 .txt 文件。因为一本书很长并且需要时间来加载,所以我尝试使用 FutureBuilder,它会在加载书籍时显示圆形进度指示器,但是,当我单击按钮打开书籍时,应用程序会冻结,直到书籍已加载,而不是按照我的意愿转换到图书页面并在加载图书时显示进度指示器。

我检查了一个较小的文件,它没有冻结。我试图告诉 FutureBuilder 显示进度指示器,但它并没有冻结。

FutureBuilder(
                  future: text, //Future<String>
                  builder: (context,snapshot) {
                    if (snapshot.connectionState==ConnectionState.done) {
                      return Text(
                        snapshot.data,
                        style: TextStyle(fontSize: 20),);
                    }
                    else {
                      return CircularProgressIndicator();
                    }
                  },

                )

看起来 FutureBuilder 只是尝试使用文本进行构建,而不是在没有文本的情况下进行构建,然后像应该做的那样稍后添加它。我如何告诉它这样做?


Dart 大多是单线程的。因此,当您阅读文本时,它是在与 UI 相同的线程中执行的,这就是它减慢速度的原因。使用 future 意味着调用可以委托给稍后的时间(取决于您如何安排它),但它仍然在同一个线程中运行。

你想做的是使用Isolate https://api.dartlang.org/stable/2.3.1/dart-isolate/dart-isolate-library.html,并在其中读取文件。一旦你有了文件(并做了任何你需要做的处理),你应该能够将它传递回 Text 类,并且它应该更快 - 尽管如果你正在处理大量的文本,它可能仍然有点口吃,因为 Text 类仍然需要处理所有文本。如果确实出现卡顿,我建议将文本分成几部分(章节/段落?)并使用多个文本和/或富文本对象将其显示在列表中。

在 flutter 中使用 Isolate 最简单的方法是‘计算’函数 https://api.flutter.dev/flutter/foundation/compute.html.

那么你的未来将会是这样的:

await compute(readFile, <path to file>);

请注意,输入和输出compute有一些限制,因为它使用隔离的发送端口 https://api.flutter.dev/flutter/dart-isolate/SendPort/send.html在引擎盖下:

消息的内容可以是:原始值(null、num、bool、double、String)、SendPort 的实例以及其元素为其中任何一个的列表和映射。列表和映射也允许是循环的。

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

FutureBuilder 使我的应用程序冻结,因为它在构建之前等待文件加载 的相关文章

随机推荐

  • 检测跨域弹窗何时关闭

    我有一个 JavaScript 应用程序 位于domainA com 上 为了验证用户身份并设置 cookie 它会在 domainB com 上打开一个弹出窗口 这类似于 Twitter 的 anywhere 如何检测domainB co
  • 如何在 R 中绘制更平滑的曲线

    Using R 我画了一个阴影图 如果您看到曲线 它们并不平滑 如何让它们变得光滑 即使是 Excel 也能绘制出更加平滑的曲线 设备功能 Windows 7 屏幕分辨率 1366 x 768 最大 这是情节 以下代码用于绘制绘图 plot
  • 删除前 n 个单词并计数

    我有一个数据框对于文本列 我需要忽略或消除前 2 个单词并计算该列中的字符串数量 b lt data frame text c hello sunitha what can I do for you hi john what can I d
  • 从 std::heap 中间删除一个元素

    我使用优先级队列作为调度程序 但有一个额外的要求 我需要能够取消预定的项目 这相当于从优先级队列中间删除一个项目 我不能使用std priority queue因为对除顶部之外的任何元素的访问都受到保护 我正在尝试使用algorithm的堆
  • python 单元测试中的 Neo4j 临时数据库

    我正在尝试为将与 Neo4j 图形数据库交互的 python 项目创建单元测试 目前 我正在实现嵌入式图形数据库 但如果我选择将其部署到 Web 应用程序 我可能会迁移到 REST 接口 我已经安装了嵌入式 neo4j v1 9rc2pro
  • BeautifulSoup:AttributeError:“NavigableString”对象没有属性“name”

    你知道为什么 BeautifulSoup 教程中的第一个例子吗http www crummy com software BeautifulSoup documentation html QuickStart http www crummy
  • 将 WatiN 连接到 Firefox

    使用 WatiN 我面临一些问题 FireFox FF new FireFox http www google com FireFox 总是在此时崩溃 VS 报告 无法从传输中读取数据 连接 现有连接是 被远程主机强行关闭 知道为什么会发生
  • 获取剑道网格中的点击事件

    我正在尝试获取 Kendo Grid 的单击事件 以便我可以将内容绑定到 Shift 和 Ctrl 单击 我无法使用 Kendo 提供的固有多选功能 因为它不支持拖放 当我在 dataBound 事件之后创建函数时 我的函数会在单击时被调用
  • 当绘制的数据发生更改时,在 R 中更新绘图,无需重新创建小部件

    每次 R 在闪亮 或仅在 R 中创建一个绘图对象时 该小部件都会完全重新创建 对于小数据集 这不是问题 但我正在处理包含数千个散点的绘图 这使得在我的闪亮应用程序中重新创建绘图需要 10 20 秒 我正在寻找一种通过 JavaScript
  • 从 IIS 7/8 中的静态内容中删除服务器标头

    为了使我们的 API 和网站更加安全 我将删除那些泄露网站运行信息的标头 剥离标头之前的示例 HTTP 1 1 500 Internal Server Error Cache Control private Content Type tex
  • 使用 $.ajax 或 $.post 调用 MVC 5 控制器方法

    我正在尝试使用 JavaScript 设置从 MVC 页面到控制器的非常简单的调用 这是我的控制器 Imports System Web Mvc Namespace Controllers Public Class DataControll
  • 如何在 LaunchStoryboard 中显示 CFBundleShortVersionString?

    有没有办法在我的 LaunchStoryboard 中将 CFBundleShortVersionString 显示为 UILabel 文本 而无需在每次递增时手动输入它 我知道如何在代码中执行此操作 但在显示 LaunchStoryboa
  • 如何在 PHP CLI 中检测 STDOUT 重定向?

    我有一个 PHP CLI 脚本 它使用 shell 转义序列进行粗体显示 但我希望能够在脚本重定向 例如重定向到日志文件 时自动禁用这些序列 到目前为止 我可以找到在除 PHP 之外的所有内容中检测 STDOUT 重定向的方法 所以有人可以
  • Rmarkdown 到 Word 输出 - 在标题上方插入图像

    我有一个 Rmarkdown 文档 我正在将其输出到 Word 并且我正在尝试将公司徽标插入到页面顶部 位于包含标题和作者的标题上方 我还没有找到解决这个问题的办法 我尝试过使用pandoc args to include in heade
  • 更改 NuGet 包位置文件夹

    我想改变NuGet包文件夹 但它不会改变它 我所做的是创建文件nuget config
  • Java Try 和 Catch IOException 必须被捕获或声明为抛出

    我正在尝试使用我在底部找到的一些代码这一页 https stackoverflow com questions 453018 number of lines in a file in java 这是我为其创建的类中的代码 import ja
  • 为什么 DataBinding 没有传播到 UserControl

    今天早上我问了一个问题here https stackoverflow com questions 39835222 command binding is not propagating for control into a datatem
  • aspnet Identity 中的实体框架缓存

    我正在 EF6 和 aspnet Identity 中构建一个项目 我面临以下问题 如果我打电话 var account await FindByNameAsync userName account IsConfirmed true 我得到
  • ElasticSearch:对聚合键进行排序,不区分大小写,并保持键的大小写

    我想从汽车中获得不同的制造值 并且制造值应该不区分大小写地按升序排序 我使用的是elasticsearch版本2 4 4 颜色和制作字段的映射 color type string fields keyword type string ind
  • FutureBuilder 使我的应用程序冻结,因为它在构建之前等待文件加载

    我正在编写一个非常基本的 flutter 应用程序 用于阅读公共领域的书籍 我在应用程序的资产中包含了一个包含一本书的 txt 文件 因为一本书很长并且需要时间来加载 所以我尝试使用 FutureBuilder 它会在加载书籍时显示圆形进度