首页 > 解决方案 > 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(),
                ),
              ),
            );
          }
        });
  }
}

标签: asynchronousflutterthemes

解决方案


接收到数据并刷新流构建器后更新状态,因此再次执行构建函数,从而调用:

bloc.getAppThemes();

再次等待任何数据在返回占位符主题的流中传递,将 bloc.getAppThemes 函数放在 initState 函数中:

@override
void initState() {
   super.initState();
   bloc.getAppThemes();
}

推荐阅读