# #firebase #flutter #google-cloud-firestore #stream #provider
Вопрос:
в настоящее время работаю над личным проектом, который потенциально может быть использован несколькими церквями в нашем районе. в настоящее время находится на ранней стадии разработки
я пытаюсь распечатать пользовательские данные из firebase, но поток всегда возвращает значение null
вот виджет, который проверяет, вошел ли пользователь в систему. я передаю UID этому виджету, и он проверяет, является ли он нулевым или нет
class AuthWrapper extends StatelessWidget {
const AuthWrapper({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
AppUser? user = Provider.of<AppUser?>(context);
if (user == null) {
return Authenticate();
} else {
print(user.uid); // this prints successfully which means that the UID is successfully passed
return StreamProvider<AppUserData?>.value(
value: UserDatabaseService(user.uid).appUserData,
initialData: null,
child: Schedules(),
);
}
}
}
после успешной передачи UID он попадает на страницу Расписания
вот страница Расписания. это первая страница, которую вы видите после аутентификации. я пытаюсь напечатать имя пользователя здесь для тестирования
class Schedules extends StatelessWidget {
Schedules({Key? key}) : super(key: key);
final AuthService _auth = AuthService();
@override
Widget build(BuildContext context) {
AppUserData userData = Provider.of<AppUserData>(context);
print(userData);
return Scaffold(
appBar: AppBar(title: Text(userData.name.toString())),
body: ElevatedButton.icon(
onPressed: () async {
await _auth.signOut();
},
icon: Icon(Icons.person),
label: Text("logout"),
),
drawer: NavigationDrawer(),
);
}
}
здесь я всегда получаю ошибку
Error: The widget Schedules tried to read Provider but the matching
provider returned null.
which is wierd, as the UID is passed succesffully to the UserDatabaseService
class UserDatabaseService {
String uid;
UserDatabaseService(this.uid);
// ! Collection reference to APPUSERS
final CollectionReference appUserDataCollection =
FirebaseFirestore.instance.collection('AppUsers');
Future updateAppUserdata({
String name = 'no name',
String churchID = 'no church',
bool isOnChurch = false,
}) async {
return await appUserDataCollection.doc(uid).set({
'name': name,
'churchID': churchID,
'isOnChurch': isOnChurch,
});
}
// ! get user data from snapshot and maps it
AppUserData appUserDataFromSnapshot(snapshot) {
return AppUserData(
name: (snapshot.data() as DocumentSnapshot)['name'],
church: (snapshot.data() as DocumentSnapshot)['church'],
isInChurch: (snapshot.data() as DocumentSnapshot)['isInChurch'],
);
}
// ! data stream
Stream<AppUserData> get appUserData {
print('successss');
return appUserDataCollection
.doc(uid)
.snapshots()
.map(appUserDataFromSnapshot);
}
}
Я застрял на этой проблеме уже несколько часов, и большинство поисковых запросов Google возвращает результаты многолетней давности
Я полностью новичок, поэтому буду признателен за любую помощь и не стесняйтесь поправлять меня, если я сделал что-то не так.
Спасибо
Ответ №1:
Документы базы данных содержат churchID
и isOnChurch
Приложение while ищет church
и isInChurch