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的情况下计算包含未来的繁重任务?的主要内容,如果未能解决你的问题,请参考以下文章