Геттер был вызван на ноль, но виджеты все еще работают нормально - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь реализовать Provider вместо использования State, так что после прочтения некоторых учебных пособий мне немного трудно понять, потому что я не нашел что-то ясное, чтобы сказать: «Вы собираетесь использовать Firebase, тогда здесь вы должны использовать ChangeNotifierProvider или Provider или StreamProvider et c. "

Итак, я нашел учебное пособие Джеффа Делани в Fireship, которое я пытался применить к своему сценарию использования, но я не уверен Я сделал это правильно, в основном потому, что я получаю это сообщение, гласящее: «Получатель вызван на нуль». Я могу подавить это, поставив "?" как user? .name, но я хочу понять, что происходит и почему, несмотря на ошибку, код по-прежнему работает нормально.

Вот код, который у меня есть: во-первых, у меня есть нормальная модель User, которая прекрасно работает, создавая модель и возвращая name, tlf и другие вещи из Firebase. Эта часть в порядке. Затем у меня есть этот сервис базы данных из кода Джеффа:

class DatabaseService {
  final Firestore _db = Firestore.instance;

  /// Get a stream of a single document
  Stream<User> streamUser (String id) {
    return _db
        .collection('profiles')
        .document(id)
        .snapshots()
        .map((snap) => User.fromMap(snap.data));
  }
  }

Затем у меня есть экран, на котором я реализовал провайдера:

class GestorScreen extends StatelessWidget {
  final db = DatabaseService();
  final FirebaseUser firebaseUser;
  GestorScreen({Key key, @required this.firebaseUser});

  @override
  Widget build(BuildContext context) {    
         return StreamProvider<User>.value(
              value: db.streamUser(firebaseUser.uid),
            child: DashboardButtons(),
          );
  }
}

И класс DashboardButtons:

class DashboardButtons extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var user = Provider.of<User>(context);
    return Scaffold(
      appBar: AppBar(),
      body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              user?.updated != null ? _button(CustomColors.emerald, () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) =>
                        Dashboard(user: user)));
              }, 'Gestionar Perfil') : _button(CustomColors.emerald, () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) =>
                        UserAlta(user: user,)));
              }, ' Dar de Alta (ßeta)'),
              SizedBox(height: SizeConfig.blockSizeHorizontal * 7,),
             .................
             .................
             .................
            ],
          )

      ),
      backgroundColor: CustomColors.newCreme,
    )
  }
}

Код работает нормально, но если удалить "?" из user.updated он говорит, что getter 'updated' был вызван на null ... все же он работает нормально.

Может кто-нибудь помочь мне с этим? Где проблема с геттером? И правильно ли я внедрил Провайдера?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Получить ошибку, когда user равно нулю.

user?.updated равно user == null ? null : user.updated

0 голосов
/ 05 марта 2020

это безопасный оператор навигации, когда пользовательский объект имеет значение null, все выражение возвращает значение null. В противном случае выполняется метод updated ().

оператор безопасной навигации

...