MultiProvider отправляет NULL в дочерние виджеты, но выводит правильное значение в консоли

#flutter #dart #flutter-provider

#flutter #dart #flutter-provider

Вопрос:

Моя домашняя страница, где инициализируются поставщики:

 Widget build(BuildContext context) {
    return SafeArea(
      child: MultiProvider(
        providers: [
          ChangeNotifierProvider<EmailAuth>(create: (context) => EmailAuth()),
        ],
        child: Scaffold(
          resizeToAvoidBottomInset: true,
          floatingActionButton: FloatingActionButton(.....
 

Моя функция аутентификации, которая запускается при входе пользователя в систему (Firebase)

 class EmailAuth extends ChangeNotifier {
  final _auth = FirebaseAuth.instance;
  final dbRef = FirebaseFirestore.instance.collection("users");
  String userid;
 
  Future signIn({String email, String password}) async {
    final currentUser = await _auth.signInWithEmailAndPassword(
        email: email, password: password);
    if (currentUser != null) {
      userid = _auth.currentUser.uid;
      dbRef.doc(_auth.currentUser.uid).update({
        "lastLogin": DateTime.now(),
      });
    } else {
      print("something didn't work");
    }
    print(userid);
    notifyListeners();
    return userid;
  }
  }
 

Вот как мой потребитель настроен на домашней странице — панели приложений

  title: Consumer<EmailAuth>(
                    builder: (context, data, child) => Text(
                      "${data.userid}",
                      style: TextStyle(color: Colors.indigoAccent),
                    ),
                  ),
 

Но вывод на панели приложений равен NULL. Что я делаю не так ?!

Я использовал это в качестве ссылки для реализации: https://medium.com/flutter-community/making-sense-all-of-those-flutter-providers-e842e18f45dd

Ответ №1:

Нечто подобное было известной ошибкой в более старом пакете поставщика. Пожалуйста, обновите до последней версии и проверьте, не устранена ли проблема. Однако,

Вот как должен выглядеть MultiProvider:

 @override
  Widget build(BuildContext context) {
    return MultiProvider( //                                     <--- MultiProvider
      providers: [
        ChangeNotifierProvider<MyModel>(create: (context) => MyModel()),
        ChangeNotifierProvider<AnotherModel>(create: (context) => AnotherModel()),
      ],
 

И должен использоваться следующим образом

 child: Consumer<MyModel>( //            <--- MyModel Consumer
                        builder: (context, myModel, child) {
                          return RaisedButton(
                            child: Text('Do something'),
                            onPressed: (){
                              // We have access to the model.
                              myModel.doSomething();
                            },
                          );
                        },
                      )


class MyModel with ChangeNotifier { //                        <--- MyModel
  String someValue = 'Hello';
  void doSomething() {
    someValue = 'Goodbye';
    print(someValue);
    notifyListeners();
  }
 

}

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

1. @NewProgrammer Я обновил ответ некоторым примером чистого кода.