asynchronous - Flutter 从应用程序开始构建流构建器
问题描述
我需要从应用程序启动时从共享首选项异步加载保存的主题。加载后,将占位符替换为两个主题。但是下面的代码失败了,因为即使它加载了多个主题的结果,应用程序也总是显示这两个主题。
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MyAppState();
}
}
class MyAppState extends State<MyApp> {
final bloc = AppThemeBloc();
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
bloc.getAppThemes();
return buildApp();
}
Widget buildApp() {
return StreamBuilder<List<AppTheme>>(
stream: bloc.subject.stream,
builder: (context, AsyncSnapshot<List<AppTheme>> snapshot) {
if (snapshot.hasData) {
return ThemeProvider(
saveThemesOnChange: true,
loadThemeOnInit: true,
themes: snapshot.data,
child: MaterialApp(
home: ThemeConsumer(
child: HomePage(),
),
),
);
} else {
return ThemeProvider(
saveThemesOnChange: true,
loadThemeOnInit: true,
themes: [
AppTheme.light(),
AppTheme.dark(),
],
child: MaterialApp(
home: ThemeConsumer(
child: HomePage(),
),
),
);
}
});
}
}
解决方案
接收到数据并刷新流构建器后更新状态,因此再次执行构建函数,从而调用:
bloc.getAppThemes();
再次等待任何数据在返回占位符主题的流中传递,将 bloc.getAppThemes 函数放在 initState 函数中:
@override
void initState() {
super.initState();
bloc.getAppThemes();
}
推荐阅读
- arrays - 在 VBA 中使用数组创建堆积柱形图
- java - 使用 Spring Data 和 Couchbase 时,@Version 字段未添加到文档中
- html - CSS网格如何计算行自动高度?
- java - java.lang.IllegalStateException:ie浏览器中不存在驱动程序可执行文件
- android - 运行长任务时前台服务停止
- python - 优雅的跨平台 cython 模块编译
- styled-components - 为什么在样式化的组件道具中未定义主题?
- c++ - 我无法在 qt 的 C++ 代码中定义字符串
- javascript - 找不到 play-services-tasks-license.aar (com.google.android.gms:play-services-tasks-license:11.8.0)
- docker - 0.0.0.0 拒绝连接