У меня есть страница входа в мое приложение flutter для аутентификации и регистрации пользователей. Когда я хочу сохранить адрес электронной почты пользователя в firestore (после регистрации), я получаю сообщение об ошибке:
flutter: Error: NoSuchMethodError: The method 'saveRegisterUserData' was called on null.
Receiver: null
Tried calling: saveRegisterUserData(email: "[email protected]", userID: "EVDnVFMkYeYd291Yzu2j2r8HLpC2")'
Я создал отдельный dart-файл для функций Firestore. Это выглядит так:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';
abstract class BaseFire {
Future <void> saveRegisterUserData({String userID, String email});
}
class Fire implements BaseFire {
final Firestore firestore = new Firestore();
DocumentReference usersdocuments;
Future <void> saveRegisterUserData({String userID, String email}) async {
usersdocuments = Firestore.instance.collection("Users").document(userID);
Map<String, String> registerdata = <String, String>{
"Email": email,
};
usersdocuments.setData(registerdata).whenComplete(() {
return print("Document Added");
}).catchError((error) => print(error));
}
}
Я импортирую этот файл на свою страницу входа и выполняю эту функцию:
import '../Firebase/firestore.dart';
class SignInPage extends StatefulWidget {
SignInPage({this.firestore});
final BaseFire firestore;
@override
State<StatefulWidget> createState() {
return _SignInPageState();
}
}
class _SignInPageState extends State<SignInPage> {
String _email;
String _password;
...
void submitRegister() async {
if (validateAndSave()) {
try {
String userId = await widget.auth.createUserWithEmailAndPassword(_email, _password);
await widget.firestore.saveRegisterUserData(userID: userId, email: _email);
} catch (error) {
print(error);
}
}
}
}
В чем моя ошибка? Спасибо за нашу помощь
У вас есть автоматическая инициализация переменной члена класса на
SignInPage({this.firestore});
{} сделайте параметр необязательным, и если вы действительно не хотите, чтобы
firebase //variable
необязательный или имеет значение по умолчанию, не заключайте его в {}, просто удалите его. Вы получите любое сообщение об ошибке, если вы использовали свой SignInPage, просто исправьте параметр, и, надеюсь, все будет работать нормально.
просто SingInPage (this.firestore); и передайте свой BaseFire при инициализации SignInPage. В этот момент ваш firestore имеет значение NULL, что означает, что вы, возможно, не передали его через конструктор, потому что переменная BaseFire там не является обязательной.
Спасибо за быстрый ответ. Я новый разработчик и не уверен, что мне делать сейчас ... извините. Итак, мой конструктор выглядит так: SignInPage ([BaseFire firestore]); а моя переменная firestore выглядит так: final BaseFire firestore; Это правильно или что мне делать?
Попробуйте это: SignInPage (this.firestore); //не здесь. Когда вы инициализируете свой SignInPage, вы можете просто передать BaseFire baseFire = new BaseFire () // инициализировать вашу переменную BaseFire. Когда вы используете свой виджет, просто напишите SignInPage (baseFire);
Большое спасибо за вашу помощь, но я получаю еще одну ошибку при попытке BaseFire baseFire = new BaseFire (). Дарт говорит: «Абстрактные классы не могут быть созданы с помощью« нового »выражения ... Что мы можем сделать?
я решаю проблему ... я создал эту переменную: final BaseFire firestore = new Fire (); и это работает ... спасибо за ваше время и за вашу помощь ... Никлас
Я пробовал это:
SignInPage ( [this.firestore] );
final BaseFire firestore;
Но у меня всегда одна и та же проблема ...