Flutter - 如何在不阻止UI的情况下计算包含未来的繁重任务?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter - 如何在不阻止UI的情况下计算包含未来的繁重任务?相关的知识,希望对你有一定的参考价值。

我正在创建一个应用程序,以json的形式从互联网上获取帖子。我使用工厂将json解析为Post对象。 Post对象包括标题,正文和图像。我使用listview构建器在列表视图中显示这些帖子。繁重的任务是我从图像中计算出两种主色,以设置为后期项目的背景渐变。为此,我使用:https://pub.dartlang.org/packages/palette_generator

我在json解析器工厂中计算了两种主色,因为那时我有一个完整的Post对象和所需的信息。这样我在渲染Post对象时也不必计算颜色。我使用以下代码执行此操作:

Future<List> _getColors() async {
  Color gradientOne, gradientTwo;
  String imageUrl = json['image'];

  paletteGenerator = await PaletteGenerator.fromImageProvider(
      CachedNetworkImageProvider(imageUrl));

  gradientOne = paletteGenerator.colors.toList()[0];
  gradientTwo = paletteGenerator.colors.toList()[1];

  return [gradientOne, gradientTwo];
}

我将此添加到Post对象和渲染中我等待这个未来:

post.gradientColors
    .then((result) => {
          gradient = result,
          this.setState(() {
                  loading = false;
                })
        })

在主UI中,我显示了一个加载指标,直到所有期货都得到解决。为此,我使用以下代码:

List<Future> futures = [];

  for (var post in tmpList) {
    futures.add(post.gradientColors);
  }
  await Future.wait(futures)
      .then((result) => {list.addAll(tmpList)});
}

除了获取新帖子时的滞后UI之外,这种方式正常。经过一些阅读后,我发现我可以在Flutter中使用Isolates。所以我改变了我的解析功能,如下所述:https://flutter.io/docs/cookbook/networking/background-parsing

这完美无缺,我的应用程序运行没有任何滞后,缺点是我的颜色不计算。出于某种原因,当我使用compute()时,我的Future永远不会产生结果。

是否可以在这种情况下使用计算机,或者有更好的方法来计算颜色而不会导致我的UI出现延迟?

编辑

我尝试编写一个没有计算的Isolate,但颜色未来仍然没有加载。这是我使用的代码:

ReceivePort receivePort = ReceivePort();
Isolate isolate = await Isolate.spawn(getMorePosts, receivePort.sendPort);
receivePort.listen((data) {
  list.addAll(data);
});

我确实收到了所有的数据,但我的期货再次没有完成。

答案

不幸的是compute()只支持同步结果。

compute()很简单,只是一个包装器,可以更容易启动隔离。

您可以使用自定义代码启动其他隔离并获得更多功能。

https://api.dartlang.org/stable/2.1.1/dart-isolate/dart-isolate-library.html

isolate包提供了一些便利功能,使其更容易使用隔离。

以上是关于Flutter - 如何在不阻止UI的情况下计算包含未来的繁重任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不阻止UI的情况下暂停指定时间的Java? [重复]

如何在不阻塞 UI 的情况下创建 UIView

如何在不破坏 UI 的情况下将搜索放在另一个线程中?

Flutter:如何在 webview 中阻止全屏视频?

在不禁用用户交互的情况下阻止 UIWebView 输入显示 UIKeyboard

如何在不使用包的情况下将BERT模型下载到本地?