Flutter, создающий пользовательскую модель с запросом firestore, дает тип «Future ‹dynamic›» не является подтипом ошибки типа «String»

Я сохраняю имя пользователя в хранилище, например, Пользователи ›имя пользователя› имя пользователя: имя пользователя, почта: почта Я использую электронную почту, передаю аутентификацию.

Я хочу создать собственную модель пользователя, чтобы сохранить имя пользователя и почту текущего пользователя. Я могу успешно найти имя пользователя в функции findCurrentUser () с помощью currentUser.email, но когда я попытался создать модель с тем, что возвращает функция findCurrentUser, я получил ошибку.

Вот полная ошибка:

════════ Исключение обнаружено поставщиком ═════════════════════════════════════ ═══════════════════════ = Было выдано следующее утверждение: исключение было сгенерировано пользователем _MapStream ‹, CustomUser› прослушано

StreamProvider, но catchError не был предоставлен.

Исключение: тип Future не является подтипом типа String.

Вот мои функции и модель:

  class CustomUser {
  final String email;
  final String username;

  CustomUser({this.email, this.username,});

  Map<String, dynamic> toJson() => {
        'email': email,
        'username': username
      };
  }


  dynamic findCurrentUser() async {
    var email = _firebaseAuth.currentUser.email;
    var user =  await FirebaseFirestore.instance
        .collection("Users")
        .where('email', isEqualTo: email).get().then((value) => value.docs.first.data()['username']);
    print('user); 
    return user; 
  }

  CustomUser customUser(User user) {
    return user != null
        ? CustomUser(email: user.email, username:  findCurrentUser())
        : null;
  }

  Stream<CustomUser> get user {
    return _firebaseAuth.authStateChanges().map(customUser);
  } 

И мой провайдер:

 StreamProvider(
        create: (context) =>
        context.read<AuthenticationService>().user,
      ),

person nadas00    schedule 02.01.2021    source источник


Ответы (1)


Вам всегда нужно разрешить будущее перед его использованием, даже если вы вызвали await для будущего и разрешили его в методе, асинхронный метод снова возвращает будущее.

В этом конкретном случае вы вызываете findCurrentUser, который возвращает Future для строкового поля, отсюда и ошибка.

  • вот несколько исправлений,

поскольку в вашей модели есть только пользователь и адрес электронной почты, я бы предложил использовать User, который возвращает onAuthStateChange.

если вы все еще хотите продолжить работу с моделью, вам действительно не нужно делать этот дополнительный запрос, если все, что вам нужно, это адрес электронной почты и имя пользователя, вы можете напрямую получить его из firebase auth.

Самый простой способ сейчас - отобразить пользователя в одной функции, а затем выполнить вызов, чтобы исправить вашу ошибку.


Future<CustomUser> findCurrentUser(User user) async {
    var email = _firebaseAuth.currentUser.email;

    var user =  await FirebaseFirestore.instance
        .collection("Users")
        .where('email', isEqualTo: email)
        .get().then((value) => value.docs.first.data()['username']);
    
    return CustomUser(email: user.email, username: user); 
  }


Stream<CustomUser> get user {
    return _firebaseAuth.authStateChanges().map(findCurrentUser);
  } 

person sameer kashyap    schedule 02.01.2021