在颤振中调用 getter 'uid' 为 null

时间:2021-03-13 10:19:46

标签: firebase flutter dart firebase-authentication

我正在 Flutter 应用程序中实现 firebase 身份验证,但在尝试获取用户 uid 时,它崩溃并显示 noSuchMethodError uid 为 null ,如果有人可以提供帮助,不胜感激

  • 这就是我初始化变量的方式
class _UserRegistrationState extends State<UserRegistration> {

FirebaseAuth auth;
DocumentReference reference;
Reference storage;

PickedFile imageUri;
final ImagePicker _imagePicker = new ImagePicker();

@override
void initState() {
  super.initState();

  auth =   FirebaseAuth.instance;
   
  // the uid is where the logcat is pointing too and it is null
  reference =  FirebaseFirestore.instance.collection('users').doc(auth.currentUser.uid);
  storage =  firebase_storage.FirebaseStorage.instance.ref('avatar').child(auth.currentUser.uid);
}

2 个答案:

答案 0 :(得分:1)

currentUser → 用户? 如果当前用户已登录,则返回当前用户,否则返回 null。

所以很可能是你没有登录,因此将 null 传递给 reference

答案 1 :(得分:1)

当您登录 Firebase 身份验证时,SDK 会自动将用户的凭据保存在本地存储中。当您重新启动应用程序时,SDK 会尝试从存储的凭据中恢复用户的身份验证状态。这要求它调用服务器以获取新的 ID 令牌,例如检查帐户是否在此期间被删除/禁用。

根据您运行代码的平台,对服务器的调用可能在您的 auth.currentUser 运行之前完成,也可能未完成。要安全地响应用户状态,请始终使用身份验证状态侦听器,如 responding to auth state changes 上的 FlutterFire 文档中所示:

@override
void initState() {
  super.initState();

  auth = FirebaseAuth.instance;
   
  FirebaseAuth.instance.authStateChanges().listen((User user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
      reference =  FirebaseFirestore.instance.collection('users').doc(auth.currentUser.uid);
      storage =  firebase_storage.FirebaseStorage.instance.ref('avatar').child(auth.currentUser.uid);
    }
  });
}