Flutter 变量getter在不同的类中调用时始终为空

问题描述

我已经使用 view=>viewmodel=>services 设置了我的架构。

FirestoreServices() 类中,我检索了登录用户的数据并将其存储在变量 _currentUser() 中,以便从应用程序内的任何位置访问它。这是执行此操作的代码

 Future getUser(String userId) async {
    try {
      DocumentSnapshot snapshot =
          await _usersCollectionReference.doc(userId).get();

      Object? data = snapshot.data();
      var userObjectAsstring = (data as Map<String,dynamic>);

      return usermodel.fromData(userObjectAsstring);
    } on FirebaseException catch (e) {
      return e.message;
    }
  }

返回值在我的 AuthenticationServices() 类中可用,我将其设置为私有变量 _currentUser 并创建了 getter。

...
  usermodel? _currentUser;
  usermodel? get currentUser => _currentUser;
...
 
 Future _populateCurrentUser(User? user) async {
    if (user != null) {
      _currentUser = await _firestoreService!.getUser(user.uid);
    }
  }

问题是,当我尝试通过 getter 访问 Marketviewmodel() 中的这个变量时,该值始终为空:

  String? _displayName;

  set displayName(String? _displayName) {
    _displayName = _authenticationService.currentUser!.fullName;
    
  }

  String? get displayName => _displayName;

usermodel() 类保存用户的地图:

class usermodel {
  final String? fullName;
  final String? id;
  final String? email;
  final String? phoneNumber;
  usermodel({this.email,this.fullName,this.id,this.phoneNumber});

  usermodel.fromData(Map<String,dynamic> data)
      : id = data['id'],fullName = data['fullName'],email = data['email'],phoneNumber = data['phoneNuber'];

  Map<String,dynamic> toJson() {
    return {
      'fullName': fullName,'email': email,'phoneNumber': phoneNumber,'id': id,};
  }
}

为什么 Marketviewmodel() 没有收到填充的 currentUser?

编辑: 注册()

`usermodel? _currentUser;

  usermodel? get currentUser => _currentUser;

  Future signUp(
      {required String fullName,required String email,required String phoneNumber,required String password}) async {
    try {
      var authResult = await _firebaseAuth.createuserWithEmailAndPassword(
          email: email,password: password);

      _currentUser = usermodel(
        id: authResult.user!.uid,email: email,fullName: fullName,);

      await _firestoreService!.createuserRecord(_currentUser!);
      print(_currentUser);
      return authResult.user != null;
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }`

编辑: 登录()

`Future logIn({required email,required password}) async {
    try {
      var authResult = await _firebaseAuth.signInWithEmailAndPassword(
          email: email,password: password);

      await _populateCurrentUser(authResult.user!);

      return authResult.user;
    } on FirebaseAuthException catch (e) {
      return e.message;
    }
  }

  

编辑: isUserLoggedIn()

 ` isUserLoggedIn() {
    var user = FirebaseAuth.instance.currentUser;
    _populateCurrentUser(user);
    return user;
  }
}`

解决方法

试试这个改变:

UserModel? get currentUser => _firebaseAuth.currentUser;

注意:我没有在 _firebaseAuth.currentUser 中使用空安全,因为我不熟悉它。如果需要,请将任何空安全功能添加到 _firebaseAuth.currentUser

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...