Flutter: необработанное исключение: NoSuchMethodError: getter 'id' был вызван для null. Получатель: null Пробный вызов: id - PullRequest
0 голосов
/ 14 июля 2020

У меня проблемы с настройкой регистрации с использованием электронной почты и пароля с помощью Flutter. Я получил его, чтобы подписать нового пользователя, и он сохраняет информацию об аутентификации Firebase, но не сохраняет данные профиля в разделе Firebase Storage. Я не уверен, что я здесь делаю не так, я не понимаю, почему id имеет значение null. Некоторая помощь и рекомендации были бы очень признательны!

Это ошибка, которую я получил

Unhandled Exception: NoSuchMethodError: The getter 'id' was called on null.
Receiver: null
Tried calling: id

Это от user.dart

import 'package:cloud_firestore/cloud_firestore.dart';

class User {
  final String id;
  final String profileName;
  final String username;
  final String photoUrl;
  final String url;
  final String email;
  final String bio;
  final String createdAt;

  User({
    this.id,
    this.profileName,
    this.username,
    this.photoUrl,
    this.url,
    this.email,
    this.bio,
    this.createdAt,
  });

  factory User.fromDocument(DocumentSnapshot doc) {
    return User(
      id: doc.documentID,
      email: doc['email'],
      username: doc['username'],
      photoUrl: doc['photoUrl'],
      url: doc['url'],
      profileName: doc['profileName'],
      bio: doc['bio'],
      createdAt: doc['createdAt'],
    );
  }
}

Это из Регистрации. dart

Ошибка указывает на строку usersReference.document.

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:buddiesgram/models/user.dart';
import 'package:buddiesgram/pages/HomePage.dart';
import 'package:shared_preferences/shared_preferences.dart';


class SignupPage extends StatefulWidget {

  static final String id = 'signup_page';
  final DateTime timestamp = DateTime.now();
  User currentUser;

  @override
  _SignupPageState createState() => _SignupPageState();
}

class _SignupPageState extends State<SignupPage> {
  final  FirebaseAuth auth = FirebaseAuth.instance;
  final _formKey = GlobalKey<FormState>();
  String username, email, password;
  SharedPreferences preferences;

  checkIfSignedIn() async {
    auth.onAuthStateChanged.listen((user) {

      if (user != null) {
        Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage()));
      }
    });

    @override
    void initState() {
      super.initState();
      this.checkIfSignedIn();
    }
  }

  saveUserInfoToFireStore() async {

    preferences = await SharedPreferences.getInstance();
    DocumentSnapshot documentSnapshot = await usersReference.document(currentUser.id).get();

    if(!documentSnapshot.exists) {
      usersReference.document(currentUser.id).setData({
        "id": currentUser.id,
        "profileName": currentUser.profileName,
        "username": currentUser.username,
        "photoUrl": currentUser.photoUrl,
        "email": currentUser.email,
        "bio": "",
        "timestamp": timestamp,
        "talkingTo": null,
      });

      //Write data to local
      //currentUser = currentUser as User;
      //await preferences.setString("id", currentUser.id);
      //await preferences.setString("profileName", currentUser.profileName);
      //await preferences.setString("photoUrl", currentUser.photoUrl);

      await followersReference.document(currentUser.id).collection("userFollowers").document(currentUser.id).setData({});

      documentSnapshot = await usersReference.document(currentUser.id).get();
    }

    currentUser = User.fromDocument(documentSnapshot);
  }

  signUp() async {
    if(_formKey.currentState.validate()) {
      _formKey.currentState.save();

      try{
        AuthResult authResult = await auth.createUserWithEmailAndPassword(email: email, password: password);
        FirebaseUser signedInUser = authResult.user;
        if(signedInUser != null) {
        saveUserInfoToFireStore();
        }
        Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage()));
      }
      catch(e) {
        print(e);
      }
    }
  }

Это из Timeline.dart

Ошибка указывает на обе строки QuerySnapshot из этих двух методы.

retrieveTimeLine() async {
    QuerySnapshot querySnapshot = await timelineReference.document(currentUser.id)
        .collection("timelinePosts").orderBy("timestamp", descending: true).getDocuments();

    List<Post> allPosts = querySnapshot.documents.map((document) => Post.fromDocument(document)).toList();

    setState(() {
      this.posts = allPosts;
    });
  }

  retrieveFollowings() async {
    QuerySnapshot querySnapshot = await followingReference.document(currentUser.id)
        .collection("userFollowing").getDocuments();

    setState(() {
      followingsList = querySnapshot.documents.map((document) => document.documentID).toList();
    });
  }

Пожалуйста, дайте мне знать, если я что-то упустил, это может помочь.

1 Ответ

1 голос
/ 14 июля 2020

currentUser имеет значение null, потому что вы не инициализировали класс. Например:

  saveUserInfoToFireStore() async {
    currentUser = User(); //initialize
    preferences = await SharedPreferences.getInstance();
    DocumentSnapshot documentSnapshot = await usersReference.document(currentUser.id).get();

Конечно, приведенный выше код все равно не будет работать, потому что id равно нулю. Если идентификатор документа в вашей базе данных равен идентификатору пользователя, выполните следующие действия:

User loggedInUser;

  saveUserInfoToFireStore() async {
     var user = FirebaseAuth.instance.currentUser();
     loggedInUser = User(id : user.uid);
    preferences = await SharedPreferences.getInstance();
    DocumentSnapshot documentSnapshot = await usersReference.document(loggedInUser.id).get();

Итак, здесь вы получаете uid пользователя из Firebase Authentication, а затем, поскольку вы используете необязательное имя параметр, вы можете инициализировать класс User свойством id и использовать его внутри метода document().

...