Asynchronous 从应用程序开始构建流生成器
我需要从应用程序开始异步加载共享首选项中保存的主题。加载后,将占位符替换为两个主题。但是下面的代码失败了,因为即使它加载了几个主题的结果,应用程序也总是显示这两个主题Asynchronous 从应用程序开始构建流生成器,asynchronous,flutter,themes,Asynchronous,Flutter,Themes,我需要从应用程序开始异步加载共享首选项中保存的主题。加载后,将占位符替换为两个主题。但是下面的代码失败了,因为即使它加载了几个主题的结果,应用程序也总是显示这两个主题 void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override State<StatefulWidget> createState() { return MyAppState(); } } cla
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(),
),
),
);
}
});
}
}
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
状态createState(){
返回MyAppState();
}
}
类MyAppState扩展了状态{
最终集团=AppThemeBloc();
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
bloc.getAppThemes();
返回buildApp();
}
Widget buildApp(){
返回流生成器(
stream:bloc.subject.stream,
生成器:(上下文,异步快照){
if(snapshot.hasData){
返回打印机(
保存主题更改:正确,
loadThemeOnInit:true,
主题:snapshot.data,
孩子:MaterialApp(
家庭:经济消费者(
子:主页(),
),
),
);
}否则{
返回打印机(
保存主题更改:正确,
loadThemeOnInit:true,
主题:[
AppTheme.light(),
AppTheme.dark(),
],
孩子:MaterialApp(
家庭:经济消费者(
子:主页(),
),
),
);
}
});
}
}
在收到数据并刷新streambuilder后,streambuilder将更新状态,以便再次执行构建功能,从而调用:
bloc.getAppThemes();
同样,如果等待任何数据传入返回占位符主题的流,请将bloc.getAppThemes函数放置在initState函数中:
@override
void initState() {
super.initState();
bloc.getAppThemes();
}
我看不到您的代码示例中引用了共享首选项。无论如何,为什么不在调用
runApp
之前从共享首选项加载这两个主题呢?本机iOS和Android启动屏幕将对用户可见,从共享首选项加载主题不会花费很长时间。它将为您节省大量复杂的代码!