卡在 FutureBuilder 中的加载程序
Stuck Loader in FutureBuilder
总的来说,我是 Flutter 和 Dart 的新手,我试图在页面加载期间进行扩展计算,但是当我尝试执行以下操作时加载程序卡住了:
body: Center(
child:FutureBuilder(
future: _lorem()
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done){
print("loader");
return Center(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).primaryColor)
);
}
[...]
Future<void> _lorem() async {
//there is not a request to service, there is a more than one filter on map and some lists. I set the for loop for example of a local computation
return Future(() {
for (int i = 0; i < 50000; i++){
print(i);
}
}
);
}
我认为更简单的实现方法是在 Completer
类型的小部件中使用一个字段,例如 Completer calc
。你可以在你的小部件初始化中开始你昂贵的计算(永远不会在你的构建函数中),当计算完成时你 complete
通过调用 calc.complete()
.
Completer
在您的小部件的 FutureBuilder
中,您应该通过包含 future: calc.future
而不是您的 future: _lorem()
.
来聆听 calc 的未来
有关此 UI 范例的示例,请参阅 FutureBuilder。
用 Future 和计算解决。
详细内容:
Future<List<CustomObject>> _retrieveCustomObjects() async {
SourceData data = SourceData(CustomSourceData());
return compute(getFilteredClients, data);
}
List<CustomObject> computeCustomObject(SourceData data) {
List<CustomObject> list = [];
// expensive logic on data, not only network call
return list;
}
class LoremIpsumClass {
// use where you need `List<CustomObject> value = await _retrieveFilteredClient();`
}
总的来说,我是 Flutter 和 Dart 的新手,我试图在页面加载期间进行扩展计算,但是当我尝试执行以下操作时加载程序卡住了:
body: Center(
child:FutureBuilder(
future: _lorem()
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done){
print("loader");
return Center(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).primaryColor)
);
}
[...]
Future<void> _lorem() async {
//there is not a request to service, there is a more than one filter on map and some lists. I set the for loop for example of a local computation
return Future(() {
for (int i = 0; i < 50000; i++){
print(i);
}
}
);
}
我认为更简单的实现方法是在 Completer
类型的小部件中使用一个字段,例如 Completer calc
。你可以在你的小部件初始化中开始你昂贵的计算(永远不会在你的构建函数中),当计算完成时你 complete
通过调用 calc.complete()
.
Completer
在您的小部件的 FutureBuilder
中,您应该通过包含 future: calc.future
而不是您的 future: _lorem()
.
有关此 UI 范例的示例,请参阅 FutureBuilder。
用 Future 和计算解决。
详细内容:
Future<List<CustomObject>> _retrieveCustomObjects() async {
SourceData data = SourceData(CustomSourceData());
return compute(getFilteredClients, data);
}
List<CustomObject> computeCustomObject(SourceData data) {
List<CustomObject> list = [];
// expensive logic on data, not only network call
return list;
}
class LoremIpsumClass {
// use where you need `List<CustomObject> value = await _retrieveFilteredClient();`
}