FutureBuilder 不会等到 future 完成
FutureBuilder doesn't wait until future completes
在我的应用程序中,我想在创建小部件之前初始化一些东西。我需要在 App
class 中完全做到这一点,并尝试为此目的使用 FutureBuilder。但是 _AppBlocProvider
的 build
方法在 initInjectionContainer()
之前被调用,例如。我的存储库尚未在 injectionContainer 中初始化,但提供者中的 Bloc 正在尝试访问它的实例。这段代码有什么问题?
我也试过这个:
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(),
),
),
);
},
);
}
}
无效。
FutureBuilder
不只是自动阻止或显示加载屏幕或其他内容。它在初始化时构建一次,然后在 future 完成后再次构建。您匿名化的生成器中的第二个参数对于正确处理未来状态并相应地进行构建至关重要。
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 ...
},
),
话虽这么说,如果您的整个应用程序需要初始化一些东西,您可以在调用 runApp
之前从 main
调用它,以便它们成为运行时加载过程而不是强制一个小部件来处理它:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initInjectionContainer();
await sl<AudioManager>().preloadFiles();
runApp(App());
}
既然 这么说,如果这些过程可能需要一段时间,最好用一个小部件来处理它们,这样您就可以向用户显示加载状态,以便他们知道该应用程序不仅在启动时冻结。
在我的应用程序中,我想在创建小部件之前初始化一些东西。我需要在 App
class 中完全做到这一点,并尝试为此目的使用 FutureBuilder。但是 _AppBlocProvider
的 build
方法在 initInjectionContainer()
之前被调用,例如。我的存储库尚未在 injectionContainer 中初始化,但提供者中的 Bloc 正在尝试访问它的实例。这段代码有什么问题?
我也试过这个:
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(),
),
),
);
},
);
}
}
无效。
FutureBuilder
不只是自动阻止或显示加载屏幕或其他内容。它在初始化时构建一次,然后在 future 完成后再次构建。您匿名化的生成器中的第二个参数对于正确处理未来状态并相应地进行构建至关重要。
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 ...
},
),
话虽这么说,如果您的整个应用程序需要初始化一些东西,您可以在调用 runApp
之前从 main
调用它,以便它们成为运行时加载过程而不是强制一个小部件来处理它:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initInjectionContainer();
await sl<AudioManager>().preloadFiles();
runApp(App());
}
既然 这么说,如果这些过程可能需要一段时间,最好用一个小部件来处理它们,这样您就可以向用户显示加载状态,以便他们知道该应用程序不仅在启动时冻结。