FutureBuilder 不会等到未来完成

问题描述

在我的应用程序中,我想在创建小部件之前初始化一些东西。我需要在 App 类中完全做到这一点,并为此目的尝试使用 FutureBuilder。但是,例如,_AppBlocProviderbuild 方法是在 initInjectionContainer() 之前调用的。我的存储库尚未在 injectionContainer 中初始化,但提供程序中的 Blocs 正在尝试访问它的实例。这段代码有什么问题?

https://docs.microsoft.com/en-us/office/vba/api/word.captionlabels

我也试过这个:

void main() {
  runApp(App());
}

class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  Future<bool>? _myFuture;

  Future<bool> _init() async {
    ...
    await initInjectionContainer();
    await sl<AudioManager>().preloadFiles();
    return false;
  }

  ...

  @override
  void initState() {
    super.initState();
    _myFuture = _init();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _myFuture,builder: (context,_) {
        return _BlocProvider(
          child: Builder(
            builder: (context) => MaterialApp(
              title: 'Flutter Demo',theme: ThemeData(
                primarySwatch: Colors.blue,),home: MainMenu(),);
      },);
  }
}

不起作用。

解决方法

from itertools import product i = 1 file_number = 0 numbers = ["0","1","2","3","4","5","6","7","8","9"] characters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] f = open("D:\wordlist" + str(file_number) + ".txt","w+") for a in product(characters,repeat=3): for b in product(numbers,repeat=2): for c in product(characters,repeat=3): word = "".join(a + b + c) f.write(word+"\n") i += 1 print(str(i)+"."+word) if i > 13824: f.close() file_number += 1 f = open("D:\wordlist" + str(file_number) + ".txt","w+") i = 1 continue f.close() 不只是自动阻止或显示加载屏幕或其他任何内容。它在初始化时构建一次,然后在未来完成后再次构建。您匿名的构建器中的第二个参数对于正确处理未来的状态并相应地构建至关重要。

FutureBuilder

话虽如此,如果您的整个应用程序需要初始化某些内容,您可以在调用 FutureBuilder( future: _someFuture(),builder: (context,snapshot) { if (snapshot.connectionState != ConnectionState.done) { // Future not done,return a temporary loading widget return CircularProgressIndicator(); } // Future is done,handle it properly return ... },), 之前从 main 调用它,以便它们成为运行时加载的一部分处理而不是强制小部件处理它:

runApp

现在说,如果这些过程可能需要一段时间,最好使用小部件处理它们,以便您可以向用户显示加载状态,以便他们知道应用程序没有' t 只是在启动时冻结。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...