Оператор проверки Null, используемый для нулевого значения при выходе из системы с помощью getX

#flutter #dart #flutter-test #flutter-getx

Вопрос:

Итак, все шло хорошо при входе в систему, но _CastError при выходе из системы был выброшен a, даже если выход из системы шел нормально, но я обеспокоен тем, что эта ошибка создает проблему в производственном режиме.

это код из моей auth_model

 Rxn<User> _user = Rxn<User>() ;


 String? get user => _user.value!.email;

 @override
 void onInit() {
  // TODO: implement onInit
   super.onInit();
   _user.bindStream(_auth.authStateChanges());
  }
 

и это код из моего controller_view

  return Obx((){
  return(Get.find<AuthViewModel>().user != null)
      ? HomeScreen()
      : Home();
});
 

и это с моего рабочего стола

 class HomeScreen extends StatelessWidget {
    FirebaseAuth _auth = FirebaseAuth.instance;

  @override
  Widget build(BuildContext context) {
    return Scaffold(

      appBar: AppBar(
        title: Text(
          "Home Screen",
              textAlign: TextAlign.center,
        ),
      ),
      body: Column(
        children: <Widget>[
          Center(
            child: TextButton(
              child: Text(
                  "logout"
              ),
              onPressed: () {
                _auth.signOut();
                Get.offAll(Home());
              },
            ),
          ),
        ],
      ),
    );
  }
}
 

Я буду признателен за любую помощь.

Комментарии:

1. вопрос понятен, пожалуйста, предоставьте еще какой-нибудь соответствующий код.

Ответ №1:

В этом-то и проблема.

 /// You tried to declare a private variable that might be `null`.
/// All `Rxn` will be null by default.
Rxn<User> _user = Rxn<User>();

/// You wanted to get a String from `email` property... from that variable.
/// But you also want to return `null` if it doesn't exist. see: `String?` at the beginning.
/// But you also tell dart that it never be null. see: `_user.value!`.
String? get user => _user.value!.email;

/// That line above will convert to this.
String? get user => null!.email;
 

Вы помечаете a null как not-null , добавляя a ! перед следующим операндом. Вот почему вы получаете ошибку. Чтобы исправить это, используйте ? вместо ! .

 /// This will return `null` and ignore the next `.email` operand
/// if `_user.value` is `null`.
String? get user => _user.value?.email;
 

Комментарии:

1. большое вам спасибо, эта проверка на нуль сбивает меня с толку всякий раз, когда я пишу код, flutter продолжает кричать на меня, чтобы я поставил оператор проверки на нуль, поэтому я просто следил за исправлениями ошибок flutter.

2. Да, поначалу это сбивало с толку… Просто помните, что если вы хотите иметь объект, который, возможно null , и вы также хотите получить доступ к свойству внутри него, используйте ? … Используйте только ! тогда, когда вы знаете, что объект всегда будет там и никогда не будет null . Если вы знаете, когда их использовать, с вами все будет в порядке.. Нулевая безопасность-это круто! 🙂