【发布时间】:2019-09-11 05:18:02
【问题描述】:
我有这个 Future 函数,它需要很长时间才能加载,它的工作原理基本上类似于视频渲染(它执行某些步骤 100 次)。
有没有办法可以在小部件中显示进度?
我尝试在 MyApp() 中设置一个全局变量,例如对应于框架的 int 并通过setState() 我尝试重建小部件,但它不起作用,应用程序冻结并且小部件没有得到更新。
这是函数:
int _progress = 0;
Future _cycleGame() async {
await game.cycle((int value) {
print(value);
setState(() {
_progress = value;
});
}).whenComplete(() {
setState(() {});
});
}
game.cycle() 是循环 50 次的 Future 函数。
game.cycle() 函数供参考:
Future cycle(Function cBack) async {
for (int i in Range(50)) {
if (!shouldFinish) {
cBack(i);
///Does things.
到目前为止,我只是在屏幕上使用一个文本到 _progress 值。
vlaue 正确打印(每次打印一个),但显示 _progress 的文本仅在函数结束时更新。我做错了什么?
我尝试用谷歌搜索如何做到这一点,但我一无所获。这可能吗?
编辑 1。 使用 Rémi Rousselet 提供的答案,我仍然无法让代码工作。小部件仅在流结束时更新。
这是代码。
import 'dart:io';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Foo(),
);
}
}
class Foo extends StatefulWidget {
@override
_FooState createState() => _FooState();
}
class _FooState extends State<Foo> {
Stream<int> _cycleStream;
@override
void initState() {
super.initState();
_cycleStream = cycle();
}
Stream<int> cycle() async* {
for (int i = 0; i <= 50; i++) {
sleep(Duration(milliseconds: 100));
yield i;
this.setState(() {
});
// does things
}
}
@override
Widget build(BuildContext context) {
return StreamBuilder<int>(
stream: _cycleStream,
initialData: 0,
builder: (context, snapshot) {
return Center(
child: Text(snapshot.data.toString())
);
},
);
}
}
颤振医生
[√] Flutter (Channel beta, v1.5.4-hotfix.2, on Microsoft Windows [Versione 10.0.17134.706], locale it-IT)
• Flutter version 1.5.4-hotfix.2 at
• Framework revision 7a4c33425d (8 days ago), 2019-04-29 11:05:24 -0700
• Engine revision 52c7a1e849
• Dart version 2.3.0 (build 2.3.0-dev.0.5 a1668566e5)
【问题讨论】:
-
你可以让那个长时间运行的函数接受一个回调,它可以定期调用它来提供进度信息。然后,调用者可以提供一个回调,使用报告的进度调用
setState。 -
当您有一组要观察的事件(中间步骤)时,请考虑使用 Stream 而不是 Future。
-
@jamesdlin 我尝试将一个函数传递给这种类型为
(value) {_progress = value; setState(() {});}.的长期运行函数,但布局只会在函数结束时更新。 -
@Luksprog 关于如何做到这一点的任何线索?
-
@fabriziog 您的长时间运行的函数可能不会产生(例如通过使用
await)。