Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 从应用程序开始构建流生成器_Asynchronous_Flutter_Themes - Fatal编程技术网

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启动屏幕将对用户可见,从共享首选项加载主题不会花费很长时间。它将为您节省大量复杂的代码!