Flutter и Firestore: NoSuchMethodError: метод '...' был вызван с нулевым значением

У меня есть страница входа в мое приложение 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);
     }
    }
   }
}

В чем моя ошибка? Спасибо за нашу помощь

0
0
5 197
1

Ответы 1

У вас есть автоматическая инициализация переменной члена класса на

SignInPage({this.firestore});

{} сделайте параметр необязательным, и если вы действительно не хотите, чтобы

firebase //variable

необязательный или имеет значение по умолчанию, не заключайте его в {}, просто удалите его. Вы получите любое сообщение об ошибке, если вы использовали свой SignInPage, просто исправьте параметр, и, надеюсь, все будет работать нормально.

Я пробовал это: SignInPage ( [this.firestore] );final BaseFire firestore; Но у меня всегда одна и та же проблема ...

Niklas 10.08.2018 14:45

просто SingInPage (this.firestore); и передайте свой BaseFire при инициализации SignInPage. В этот момент ваш firestore имеет значение NULL, что означает, что вы, возможно, не передали его через конструктор, потому что переменная BaseFire там не является обязательной.

ujjwal mainali 10.08.2018 14:48

Спасибо за быстрый ответ. Я новый разработчик и не уверен, что мне делать сейчас ... извините. Итак, мой конструктор выглядит так: SignInPage ([BaseFire firestore]); а моя переменная firestore выглядит так: final BaseFire firestore; Это правильно или что мне делать?

Niklas 10.08.2018 15:00

Попробуйте это: SignInPage (this.firestore); //не здесь. Когда вы инициализируете свой SignInPage, вы можете просто передать BaseFire baseFire = new BaseFire () // инициализировать вашу переменную BaseFire. Когда вы используете свой виджет, просто напишите SignInPage (baseFire);

ujjwal mainali 10.08.2018 15:06

Большое спасибо за вашу помощь, но я получаю еще одну ошибку при попытке BaseFire baseFire = new BaseFire (). Дарт говорит: «Абстрактные классы не могут быть созданы с помощью« нового »выражения ... Что мы можем сделать?

Niklas 10.08.2018 15:22

я решаю проблему ... я создал эту переменную: final BaseFire firestore = new Fire (); и это работает ... спасибо за ваше время и за вашу помощь ... Никлас

Niklas 10.08.2018 15:29

Другие вопросы по теме