Flutter build Stream Builder с самого начала приложения - PullRequest
0 голосов
/ 08 февраля 2020

Мне нужно загрузить сохраненные темы из общих настроек asyn c с момента запуска приложения. После загрузки замените заполнитель двумя темами. Но приведенный ниже код не удался, поскольку даже при загрузке результатов по нескольким темам приложение всегда отображает две темы.

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(),
                ),
              ),
            );
          }
        });
  }
}

1 Ответ

0 голосов
/ 08 февраля 2020

После получения данных и обновления построителя потока, который обновляет состояние, поэтому функция сборки выполняется снова, вызывая, таким образом:

bloc.getAppThemes();

снова, которая ожидает передачи любых данных в потоке, возвращающем ваш заполнитель Темы, поместите blo c .getAppThemes функцию в функцию initState:

@override
void initState() {
   super.initState();
   bloc.getAppThemes();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...