Я пытаюсь создать страницу типа профиля, где пользователи могут просматривать свою информацию, и в конечном итоге я добавлю функции, чтобы они могли изменять свои данные. Я использую Provider для доступа к потоку Firebase <User>
, который возвращает UID текущего пользователя (это работает нормально). Затем UID используется для доступа к их <UserData>
потоку, но когда я пытаюсь напечатать UserData().email
или любые другие биты данных, он просто возвращает ноль. Код выглядит следующим образом:
class Profile extends StatefulWidget {
@override
_ProfileState createState() => _ProfileState();
}
class _ProfileState extends State<Profile> {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
return StreamProvider<UserData>.value(
initialData: UserData.initialData(),
value: DatabaseService(uid: user.uid).userData,
child: Scaffold(
appBar: AppBar(),
drawer: NavigationDrawer(),
body: ListView(
children: <Widget>[
ListTile(
title: Text(UserData().email),
)
],
),
),
);
}
}
Сам поток выглядит так:
UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
return UserData(
uid: uid,
email: snapshot.data['email'],
firstName: snapshot.data['firstName'],
lastName: snapshot.data['lastName'],
phone: snapshot.data['phone'],
dateCreated: snapshot.data['dataCreated'],
isVerified: snapshot.data['isVerified']
);
}
//User data stream
Stream<UserData> get userData {
return userDataCollection.document(uid).snapshots()
.map(_userDataFromSnapshot);
}
А класс UserData как раз и есть
class UserData {
final String uid;
final String email;
final String firstName;
final String lastName;
final String phone;
final DateTime dateCreated;
final bool isVerified;
UserData({ this.uid, this.email, this.firstName, this.lastName, this.phone, this.dateCreated, this.isVerified });
factory UserData.initialData() {
return UserData(
uid: '',
email: '',
firstName: '',
lastName: '',
phone: '',
dateCreated: null,
isVerified: null,
);
}
}
И, наконец, это ошибка, которую я получаю из ListTile, потому что UserData().email
имеет значение null, а не строку:
A non-null String must be provided to a Text widget.
'package:flutter/src/widgets/text.dart':
Failed assertion: line 285 pos 10: 'data != null'
Я подумал, что, возможно, проблема в том, что данные не загружаются вовремя, поэтому, когда Flutter пытается создать страницу, данных там нет, но добавление UserData.initialData
, похоже, не помогло. Мне удалось заставить его работать с помощью StreamBuilder, но я не знаю, следует ли использовать это наилучшим образом или я должен просто делать все с помощью Provider, чтобы любая помощь была оценена.
Спасибо