Ошибка «Неожиданное нулевое значение» при попытке записи данных в cloud firestore

# #firebase #flutter #google-cloud-firestore #flutter-web

Вопрос:

Я работаю над страницей регистрации для веб-приложения. Приведенный ниже код показывает, как я пытаюсь аутентифицировать пользователей, а также добавлять их данные в cloud firestore. Однако я получаю сообщение об ошибке, в котором говорится, что что-то равно нулю, даже если я правильно заполняю информацию о регистрации.

Я предполагаю, что ошибка происходит из блока try/catch в нижней части. Я следил за документами на веб-сайте flutterfire, чтобы добавить пользовательские данные в базу данных cloud firestore (https://firebase.flutter.dev/docs/firestore/usage).

Кроме того, какой был бы лучший способ реализовать функцию addUser (), чтобы избежать ошибок?

вот мой код:

 
class SignUpPage extends StatefulWidget {
  @override
  _SignUpPageState createState() => _SignUpPageState();
}

class _SignUpPageState extends State<SignUpPage> {
  FirebaseAuth auth = FirebaseAuth.instance;
  final emailController = TextEditingController();
  final passwordController = TextEditingController();
  final nameController = TextEditingController();
  User? firebaseUser = FirebaseAuth.instance.currentUser;

  @override
  Widget build(BuildContext context) {
    CollectionReference firestoreData =
        FirebaseFirestore.instance.collection('users');

    Future<void> addUser() {
      return firestoreData
          .add({
            'email': emailController.text,
            'name': nameController.text,
            'login_UID': firebaseUser!.uid,
            'isCounselor': false,
          })
          .then((value) => print("User Added"))
          .catchError((error) => print("Failed to add user: $error"));
    }

    return Scaffold(
      body: Container(
          padding: EdgeInsets.all(300),
          child: Column(
            children: [
              TextField(
                controller: nameController,
                decoration: InputDecoration(labelText: 'Prénom'),
              ),
              TextField(
                controller: emailController,
                decoration: InputDecoration(labelText: 'Email'),
              ),
              TextField(
                controller: passwordController,
                decoration: InputDecoration(labelText: 'Mot de Passe'),
              ),
              SizedBox(
                height: 30,
              ),
              MaterialButton(
                child: Text('Sign up'),
                onPressed: () async {
                  try {
                    UserCredential userCredential = await FirebaseAuth.instance
                        .createUserWithEmailAndPassword(
                            email: emailController.text,
                            password: passwordController.text);
                    addUser();
                  } on FirebaseAuthException catch (e) {
                    if (e.code == 'weak-password') {
                      print('The password provided is too weak.');
                    } else if (e.code == 'email-already-in-use') {
                      print('The account already exists for that email.');
                    }
                  } catch (e) {
                    print(e);
                  }
                  Navigator.pushNamed(context, '/login');
                },
              ),
            ],
          )),
    );
  }
}

 

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

1. В чем заключается фактическая ошибка? Вы использовали консоль. войдите в журнал или другое, чтобы увидеть , что значения, которые вы «знаете», не являются нулевыми? Сорок лет опыта отладки: вы не «знаете» ничего, чего бы вы только что не видели! Просто потому, что вы «знаете», что это «должно» работать, не значит, что это так.

2. Я ничего не регистрировал в консоли. Я не совсем уверен, что это значит. Ошибка отображается в окне Android studio «выполнить». Ошибка возникает в строке catch(e) в конце фрагмента кода. Я опубликовал этот вопрос вчера, и по какой-то причине он работает сегодня утром. Тем не менее, спасибо вам за вашу помощь! Как вы сказали, я не должен предполагать, что я «знаю», пока не увижу.