Поставщик потоков приложений Flutter и firebase всегда возвращает значение null

# #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