首页 > 解决方案 > Flutter GetX Get.find() 在一个类中返回 null,但在另一个类中找到它?

问题描述

我有多个使用 GetX 的网页控制器。authController登录用户并调用数据库 api 从 firebase firestore 获取用户:

await Future.delayed(Duration(seconds: 1));
btnController.value.success();
UserCredential _authResult = await _auth.signInWithEmailAndPassword(email: email.trim(), password: password);
Get.find<UserController>().user = await Database().getUser(_authResult.user!.uid);

userController是一个非常简单的控制器:

class UserController extends GetxController {
  Rx<UserModel> _userModel = UserModel().obs;

  UserModel get user => _userModel.value;

  set user(UserModel value) => this._userModel.value = value;

  void clear() {
    _userModel.value = UserModel();
  }
}

UserModel本身有一个这样的构造函数,所有字段都用?(null-safety)指示

UserModel.createUser({required final data}) {
    role = data["User_Role"];
    firstName = data["firstName"];
    lastName = data["lastName"];
    age = data["age"];
    privateAdress = Adress.fromLinkedMap(data: data["privateAdress"]);
    dateOfBirth = data["dateOfBirth"].toDate();
    driverCardNumber = data["driverCardNumber"];
    driverLicenseNumber = data["driverLicenseNumber"];
    email = data["email"];
    id = data["employee_ID"];
    lastLoginTime = data["lastLoginTime"];
    mobilePhoneNumber = data["mobilePhoneNumber"];
    photo = data["photo"];
  }

这是问题:

当我尝试在 中使用 Get.find().user 访问用户时AuthClass,我能够得到它。但是,一旦我尝试在其他任何地方访问它,我只会得到 null 结果。我也在 webapp 开始时调用了这些方法,并且所有其他控制器都可以正常工作:

Get.put(AuthController());
Get.put(UserController());
Get.put(DashboardController());

这里可能是什么问题?

标签: firebaseflutterdartflutter-webflutter-getx

解决方案


我想到了!由于UserController绑定了FirebaseAuth. 那是因为我打电话firebaseUser.bindStream(auth.authStateChanges())并且我的登录屏幕正在监听该值,因此在用户被拉出之前打开了仪表板:

UserCredential _authResult = await _auth.signInWithEmailAndPassword(
        email: email.trim(),
        password: password,
      ); // The dashboard was already opened here
Get.find<UserController>().user =
      await Database().getUser(_authResult.user!.uid);

final loggedIn = false.obs我只是在我的身份验证类中添加了一个布尔值,并在创建用户后将其设置为 true。


推荐阅读