Преобразование в getX вызывает проблемы

#flutter #dart-null-safety #flutter-getx

Вопрос:

Я конвертирую свое приложение flutter для использования getX, а не поставщика, и во время преобразования я получаю некоторые ошибки, которые я не знаю, как исправить.

Первая ошибка:

В моей модели данных, AgentsModel, я получаю ошибку в методе AgentsModel.fromSnapshot(). Ошибка является нулевой ошибкой безопасности. Я попытался вставить «?» в объявление передаваемого параметра, но это не помогает.

Сообщение об ошибке:

Метод «[] «не может быть вызван безоговорочно, потому что получатель может быть «нулевым»

Файл модели данных Agent.dart

 class AgentsModel {
  final String? agentId;
  final String? fName;
  final String? lName;
  final String? agency;
  final String? agencyId;
  final String? address1;
  final String? address2;
  final String? city;
  final String? state;
  final int? zipcode;
  final String? cellPhone;
  final String? officePhone;
  final String? email;
  final String? mls;
  final String? mlsId;

  AgentsModel(
      {this.cellPhone,
      this.address1,
      this.address2,
      this.fName,
      this.lName,
      this.email});

  Map<String, dynamic> toMap() {
    return {
      'cellPhone': cellPhone,
      'address1': address1,
      'address2': address2,
      'fName': fName,
      'lName': lName,
      'email': email
    };
  }

  AgentsModel.fromSnapshot(DocumentSnapshot snapshot)
      : cellPhone = snapshot.data()['cellPhone'] ?? null,
        address1 = snapshot.data()['address1'] ?? null,
        address2 = snapshot.data()['address2'] ?? null,
        fName = snapshot.data()['fName'] ?? null,
        lName = snapshot.data()['lName'] ?? null,
        email = snapshot.data()['email'] ?? null;
}
 

Ошибка 2 (связана с ошибкой 1):

В моем файле auth_controller.dart я получаю сообщение об ошибке, в котором я объявляю переменную agentsModel. Вот в чем ошибка:

 A value of type 'Rx<AgentsModel>' can't be assigned to a variable of type 'Rxn<AgentsModel>'
 

Вот строка кода, выдающая ошибку:

   Rxn<AgentsModel> agentsModel = AgentsModel().obs;
 

Ошибка 3 (связанная с первыми 2 ошибками)

When I try to call fromSnapshot() from the auth_controller.dart file I am getting and error on the call, agentsModel.fromSnapshot(doc));, stating

The method ‘fromSnapshot’ isn’t defined for the type ‘Rxn’.

 _initializeUserModel(String userId) async {
    agentsModel.value =
      await _db.collection(agentsCollection)
        .doc(userId)
        .get()
        .then((doc) => agentsModel.fromSnapshot(doc));
  }
 

Вот определение снова сверху:

   AgentsModel.fromSnapshot(DocumentSnapshot snapshot)
      : cellPhone = snapshot.data()['cellPhone'] ?? null,
        address1 = snapshot.data()['address1'] ?? null,
        address2 = snapshot.data()['address2'] ?? null,
        fName = snapshot.data()['fName'] ?? null,
        lName = snapshot.data()['lName'] ?? null,
        email = snapshot.data()['email'] ?? null;
}
 

Бонусная ошибка (не связанная с вышеуказанными ошибками)
Я получаю ошибку при объявлении переменной firebaseUser.

 import 'package:firebase_auth/firebase_auth.dart';
 

Ошибка в строке ниже заключается в том, что у класса «Пользователь» нет конструктора по умолчанию.

   User firebaseUser = User().obs;
 

Ошибка в приведенной ниже строке заключается в том, что значение типа » Rx «не может быть присвоено переменной типа «Пользователь».

   firebaseUser = Rx<User>(auth.currentUser);
 

Ошибка в приведенной ниже строке заключается в том, что метод «bindStream» не определен для типа «Пользователь».

   firebaseUser.bindStream(auth.userChanges());
 

Поскольку некоторые из этих ошибок связаны с нулевой безопасностью, я добавил «?» и»!», но без изменений. Я новичок и учусь, поэтому любая помощь, которую я могу получить, будет высоко оценена.

Ответ №1:

  • Например, вы заявляете var x = bool.obs . Для доступа к значению x вам x.value не нужно x .
  • obs это не украшение. Это ярлык для создания экземпляра Rx объекта. Это означает, что bool.obs != bool
  • Используйте ! оператор, чтобы принудительно ввести значение null, когда вы уверены, что это не так. (Ошибка 1)

Ошибка 2 — несоответствие типа, в таких случаях используйте var.

 var agentsModel = AgentsModel().obs;
 

Ошибка 3 — вам нужно вызвать value свойство.

 agentsModel.value.fromSnapshot(doc))
 

Бонусные ошибки

То же, что и ошибки 2 и 3

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

1. спасибо за ваш ответ. Для ошибки 1 я попробовал мобильный телефон = снимок.данные()! [«Мобильный телефон»] ?? null добавляет»!», но затем говорит, что мобильный телефон не определен. Где бы я добавил «!» в? Ошибка 2 теперь исправлена. Для дополнительной ошибки я изменяю объявление как var (var firebaseUser = User().obs;), но теперь я получаю, что класс «Пользователь» не имеет конструктора по умолчанию. Я пробовал User.instance.obs, но это не работает.

2. Я изменил окончательный FirebaseAuth auth = FirebaseAuth.instance на var auth = FirebaseAuth.instance; Теперь это выдает мне ошибку в строке firebaseUser = Rxn<Пользователь>auth.CurrentUser; говоря «Оператор «<Пользователь>

3. В большинстве случаев IDE поможет вам правильно поставить ! оператора.