Как обойти "Future <dynamic>" не является подтипом ошибки типа "FirebaseUser" - PullRequest
0 голосов
/ 05 мая 2020

У меня есть класс FirebaseActions, который выполняет регистрацию и вход в систему для меня. Я добавил в него метод getCurrentUser. Я вызываю эту функцию из виджета HomeScreen. Мне нужно поместить возвращаемое значение (type = FirebaseUser) в переменную на моем HomeScreen, чтобы получить доступ к loggedInUser.email. Но я получаю эту ошибку. Мой вопрос; есть ли способ получить данные типа FirebaseUser в переменной типа Future? Когда я пишу эту функцию в HomeScreen вместо класса FirebasAction, она работает, но это лучшая практика?

класс FirebaseActions

static getCurrentUser(context) async {
    final user = await _auth.currentUser().catchError((error) {
      Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
    });

    if (user != null) {
      return user;
    }
  }

виджет HomeScreen

class _HomeScreenState extends State<HomeScreen> {

  FirebaseUser loggedInUser;

  @override
  void initState() {
    super.initState();
    loggedInUser = FirebaseActions.getCurrentUser(context);
    print(loggedInUser.toString());
  }

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Вы получаете эту ошибку, потому что вы не указали тип возвращаемого значения в своей функции getCurrentUser().

Замените свой код приведенным ниже, и все будет работать нормально.

Чтобы решите эту проблему: проверьте код ниже: он отлично работает:

Firebase Action Class

// give your function a return type
static Future<FirebaseUser> getCurrentUser(context) async {
    final user = await _auth.currentUser().catchError((error) {
      Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
    });

    if (user != null) {
      return user;
    }
  }

Виджет главного экрана

class _HomeScreenState extends State<HomeScreen> {

  FirebaseUser loggedInUser;

  @override
  void initState() {
    super.initState();
    call the function here
    logInUser();
    print(loggedInUser.toString());
  }

Надеюсь, это поможет

ОБНОВЛЕНИЕ

// create a new function to log in user
void logInUser() async {
 // await the result because you are invoking a future method
    loggedInUser = await FirebaseActions.getCurrentUser(context);
}
2 голосов
/ 05 мая 2020

Вам не указан возвращаемый тип метода, а также метод asyn c, поэтому вам нужно поместить await там, где вы звоните.

 static Future<FirebaseUser> getCurrentUser(context) async {

также, добавьте await туда, где вы звоните.

loggedInUser = await FirebaseActions.getCurrentUser(context);

обновление:

создать новую функцию и вызвать ее.

callme() async{  
 loggedInUser = FirebaseActions.getCurrentUser(context);
    print(loggedInUser.toString());
}

initstate:

 @override
  void initState() {
    super.initState();
    callme();
  }
1 голос
/ 05 мая 2020

Вот как я обрабатываю асинхронные c функции в моем состоянии инициализации:

FirebaseActions.getCurrentUser(context).then((val){loggedInUser = val});

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

Future<FirebaseUser> getCurrentUser(context) async {...
...