【问题标题】:The argument type 'Future<void> Function(FirebaseUser)' can't be assigned to the parameter type 'void Function(User)'参数类型“Future<void> Function(FirebaseUser)”不能分配给参数类型“void Function(User)”
【发布时间】:2021-02-12 08:40:06
【问题描述】:

我在尝试将我的 Flutter 应用与 Firebase 连接时遇到此错误,我不明白为什么会出现此错误。

参数类型“Future Function(FirebaseUser)”不能分配给参数类型“void Function(User)”

错误出现在_onStateChanged 这一行。整行是_auth.onAuthStateChanged.listen(_onStateChanged);

这是我的 auth.dart 代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:sokoni/src/helpers/user.dart';
import 'package:sokoni/src/models/user.dart';

enum Status {Uninitialized, Unauthenticated, Authenticating, Authenticated}

class AuthProvider with ChangeNotifier{
  // we're using the methods of the ChangeNotifier class in the AuthProvider class
  FirebaseAuth _auth;
  // ignore: deprecated_member_use
  FirebaseUser _user;
  Status _status = Status.Uninitialized;// initial status
  UserServices _userServices = UserServices();
  UserModel _userModel;

  //getters => we can access the values of a class but we cannot modify the values

  Status get status => _status;
  UserModel get userModel => _userModel;

  // ignore: deprecated_member_use
  FirebaseUser get user => _user;

  // ignore: non_constant_identifier_names
  final FormKey = GlobalKey<FormState>();

  TextEditingController email = TextEditingController();
  TextEditingController name = TextEditingController();
  TextEditingController password = TextEditingController();




 AuthProvider.initialize(): _auth = FirebaseAuth.instance{
    //this listens to the user authentication state the we will do something about once a change is caught
    // ignore: deprecated_member_use
    _auth.onAuthStateChanged.listen(_onStateChanged);
 }

  Future<bool> signIn() async{
    try{
      _status = Status.Authenticating;
      notifyListeners();
      await _auth.signInWithEmailAndPassword(email: email.text, password: password.text);
      return true;
    }catch(e){

      return _onError(e.toString());
    }

  }
  Future signOut(){
    _auth.signOut();
    _status = Status.Unauthenticated;
    notifyListeners();
    return Future.delayed(Duration.zero);
  }

  Future<bool> signUp() async{
   try{
      _status = Status.Authenticating;
    notifyListeners();
    await _auth.createUserWithEmailAndPassword(email: email.text, password: password.text).then((user) {
      Map<String, dynamic> values = {
        "name": name.text,
        "email": email.text,
        "id": user.user.uid,

      };
      _userServices.createUser(values);
    });

    return true;

   }catch(e){
     return _onError(e.toString());
    
   }
   
  }
   
       // ignore: deprecated_member_use
    Future<void> _onStateChanged(FirebaseUser firebaseUser) async{
     if(firebaseUser == null){
       _status =  Status.Uninitialized;
     }else {
       _user = firebaseUser;
       _status = Status.Authenticated;
       _userModel = await _userServices.getUserById(firebaseUser.uid);
     }

     notifyListeners();
    }


    // my gen methods
    bool _onError(String error){
     _status = Status.Unauthenticated;
     notifyListeners();
     print("We got an error: $error");
     return false;
   }

   void cleanControllers (){
     email.text = " ";
     password.text = " ";
     name.text = " ";
   }
   }

【问题讨论】:

    标签: firebase flutter dart firebase-authentication


    【解决方案1】:

    我想你需要的是这样的:

    _auth.onAuthStateChanged.listen((User user) async{
        await _onStateChanged(user);
         }
    );
    

    正如另一个答案所暗示的,将FirebaseUser 更改为User

    【讨论】:

      【解决方案2】:

      FirebaseUser 现在在 Firebase 库中已弃用,并替换为 User, 你应该改变你的方法

      Future<void> _onStateChanged(FirebaseUser firebaseUser) async{
           if(firebaseUser == null){
             _status =  Status.Uninitialized;
           }else {
             _user = firebaseUser;
             _status = Status.Authenticated;
             _userModel = await _userServices.getUserById(firebaseUser.uid);
           }
      
           notifyListeners();
          }
      

      Future<void> _onStateChanged(User user) async{
           if(user== null){
             _status =  Status.Uninitialized;
           }else {
             _user = user;
             _status = Status.Authenticated;
             _userModel = await _userServices.getUserById(user.uid);
           }
      
           notifyListeners();
          }
      

      您可以在docs 那里查看新功能

      【讨论】:

        猜你喜欢
        • 2020-08-21
        • 2023-04-05
        • 1970-01-01
        • 2021-10-22
        • 2020-01-05
        • 2022-08-05
        • 1970-01-01
        • 2022-01-17
        • 2021-08-11
        相关资源
        最近更新 更多