#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 поможет вам правильно поставить
!
оператора.