在 Flutter 应用中立即显示应用主题
Display app theme immediately in Flutter app
鉴于 Flutter shared_prefs 插件的异步特性,如何确保在启动应用程序时立即显示正确的主题设置? IE。一旦 shared_prefs 完成加载,默认主题不会闪烁,然后应用正确的主题。
一种方法是使用加载屏幕延迟主应用程序的显示。我见过的一种模式是:
main() async {
runApp(new LoadingScreen());
runApp(new App(await asyncStuff()));
}
您可以随时调用 runApp:https://docs.flutter.io/flutter/widgets/runApp.html
当您的 build
方法需要等待 Future
时,是突破 FutureBuilder
的好时机。
void main() {
runApp(new FutureBuilder(
future: SharedPreferences.getInstance(),
builder: (_, snapshot) {
return snapshot.hasData ?
new MyApp(preferences: snapshot.data) :
new LoadingScreen();
},
));
}
使用此模式构建应用程序的一些技巧:
SharedPreferences.getInstance()
非常快。如果将空白的 Container
作为黑色加载屏幕而不是一闪而过的彩色内容,您的应用可能会看起来更好。但是,如果您同时加载其他内容,显示您的徽标会更有意义。
如果需要等待多个futures,可以使用
Future.wait 或将多个 FutureBuilder
嵌套在一起。
您还可以使用 StatefulWidget
和 setState
在应用程序配置完成后更新根小部件。
您可以使用类似(简而言之)的内容:
@override
Widget build(BuildContext context) {
_return mainWidget;
}
连同:
mainWidget = loadingWidget();
someMethodThatDoesAppConfig().then((Widget configuredWidget) {
setState(() {
_mainWidget = configuredWidget;
});
});
鉴于 Flutter shared_prefs 插件的异步特性,如何确保在启动应用程序时立即显示正确的主题设置? IE。一旦 shared_prefs 完成加载,默认主题不会闪烁,然后应用正确的主题。
一种方法是使用加载屏幕延迟主应用程序的显示。我见过的一种模式是:
main() async {
runApp(new LoadingScreen());
runApp(new App(await asyncStuff()));
}
您可以随时调用 runApp:https://docs.flutter.io/flutter/widgets/runApp.html
当您的 build
方法需要等待 Future
时,是突破 FutureBuilder
的好时机。
void main() {
runApp(new FutureBuilder(
future: SharedPreferences.getInstance(),
builder: (_, snapshot) {
return snapshot.hasData ?
new MyApp(preferences: snapshot.data) :
new LoadingScreen();
},
));
}
使用此模式构建应用程序的一些技巧:
SharedPreferences.getInstance()
非常快。如果将空白的Container
作为黑色加载屏幕而不是一闪而过的彩色内容,您的应用可能会看起来更好。但是,如果您同时加载其他内容,显示您的徽标会更有意义。如果需要等待多个futures,可以使用 Future.wait 或将多个
FutureBuilder
嵌套在一起。
您还可以使用 StatefulWidget
和 setState
在应用程序配置完成后更新根小部件。
您可以使用类似(简而言之)的内容:
@override
Widget build(BuildContext context) {
_return mainWidget;
}
连同:
mainWidget = loadingWidget();
someMethodThatDoesAppConfig().then((Widget configuredWidget) {
setState(() {
_mainWidget = configuredWidget;
});
});