Я пытаюсь реализовать 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 ... все же он работает нормально.
Может кто-нибудь помочь мне с этим? Где проблема с геттером? И правильно ли я внедрил Провайдера?