Как создать StreamProvider и подписаться на него позже, Flutter

#flutter #dart #flutter-provider

#flutter #dart #flutter-provider

Вопрос:

У меня проблема, когда я хочу создать MultiProvider с несколькими разными провайдерами, проблема в том, что два из них являются потоковыми провайдерами, которым сначала требуется авторизоваться в firebase, а после этого подписаться на поток в firebase на основе результата входа пользователя в систему.

Итак, если я не могу запустить StreamProvider перед входом в систему в верхней части моего MaterialApp .

Если я объявляю этих поставщиков после завершения входа в систему, я получаю сообщение об ошибке, что поставщик не находится на правильном маршруте, потому что мне нужны данные по нескольким маршрутам для всего моего приложения.

Вот мой код:

 class Neybor extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final textTheme = GoogleFonts.nunito;
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<Data>(create: (context) => new Data()),

        /// Settings Stream
        StreamProvider<SettingsDataModel>.value(
          value: Globals.firebaseCaller.settings(),
        ),

        /// Plans Stream
        StreamProvider<PlansDataModel>.value(
          value: Globals.firebaseCaller.plans(),
        ),
      ],
      child: MaterialApp(
...
}
  

Для Globals.firebaseCaller.settings() и Globals.firebaseCaller.plans() я использую пользовательский uid register

Есть ли способ объявить StreamProvider и подписаться на него позже в моем коде?

Заранее спасибо

Комментарии:

1. Используйте конструктор по умолчанию вместо «.value»

Ответ №1:

Используйте create параметр в StreamProvider , чтобы передать свой поток и подписаться на него, используя Provider.of<T>(context)

 class Neybor extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final textTheme = GoogleFonts.nunito;
    return MultiProvider(
      providers: [
        /// Settings Stream
        /// Globals.firebaseCaller.settings() should returns a Stream<SettingsDataModel>
        StreamProvider<SettingsDataModel>(create: (context) =>
          Globals.firebaseCaller.settings(), 
        ),
      ],
      child: HomeView()
..
  

затем в HomeView()

 import 'package:provider/provider.dart';

class HomeView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    SettingsDataModel settings = Provider.of<SettingsDataModel>(context);

    if (settings == null) {
      return Align(child: new CircularProgressIndicator());
    } else {
      // your code
      ...
    }
...