卡在 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();`
}