Исключение Flutter: при обработке жеста была выдана следующая ошибка NOSUCHMETODERROR: средство получения ’email’ было вызвано с нулевым значением

#firebase #flutter #google-cloud-firestore

#firebase #flutter #google-cloud-firestore

Вопрос:

Flutter показывает мне, что мой loggedInUser пуст / недействителен. Но я сохранил его значение от пользователя в методе getCurrentUser() . Теперь из-за этого мой код получает исключение в строке 92 (строка, за которой следует комментарий). Исключение составляет —

При обработке жеста была выдана следующая ошибка NoSuchMethodError: средство получения ’email’ было вызвано в null. Получатель: null Пытался вызвать: email

// Но всякий раз, когда я использую _auth.CurrentUser.email вместо loggedInUser, мой код работает нормально. Я не понимаю, почему??

Пожалуйста, кто-нибудь, помогите мне, я новичок в flutter.

Вот мой код для экрана чата —

 import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:palabrero_chat_app/constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class ChatScreen extends StatefulWidget {

  static const String id = 'chat_screen';

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

class _ChatScreenState extends State<ChatScreen> {

  final myController = TextEditingController();
  @override
  void dispose() {
    myController.dispose();
    super.dispose();
  }
  // ignore: deprecated_member_use
  final _firestore = Firestore.instance;
  final _auth = FirebaseAuth.instance;
  FirebaseUser loggedInUser;
  String messageText;

  @override
  void initState() {
    super.initState();
    Firebase.initializeApp().whenComplete(() {
      print("completed");
      setState(() {});
    });
    getCurrentUser();
  }

  void getCurrentUser() async {
    try {
      final user = await _auth.currentUser;
      if(user!=null) {
        loggedInUser = user;
      }
    }
    catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: null,
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                _auth.signOut();
                Navigator.pop(context);
                //Implement logout functionality
              }),
        ],
        title: Text('⚡️Chat'),
        backgroundColor: Colors.lightBlueAccent,
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Container(
              decoration: kMessageContainerDecoration,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: TextField(
                      onChanged: (value) {
                        messageText = value;
                      },
                      decoration: kMessageTextFieldDecoration,
                    ),
                  ),
                  FlatButton(
                    onPressed: () {
                      getCurrentUser();
                      //messageText   loggedInUser.email
                      _firestore.collection('messages').add({
                        'text' : messageText,
                        'sender' :  loggedInUser.email,   //This line no. 92
                         //If i use  _auth.currentUser.email above, in place of loggedInUser, my code 
                         works. Please explain it to me.
                      });
                    },
                    child: Text(
                      'Send',
                      style: kSendButtonTextStyle,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  

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

1. какую версию firebase_auth вы используете?

2. @PeterHaddad 0.18.0 1

Ответ №1:

Измените это:

   void getCurrentUser() async {
    try {
      final user = await _auth.currentUser;
      if(user!=null) {
        loggedInUser = user;
      }
    }
    catch (e) {
      print(e);
    }
  }
  

в это:

   void getCurrentUser()  {
    try {
      final user  = _auth.currentUser;
      if(user!= null) {
        setState(() { loggedInUser = user; });
      }
    }
    catch (e) {
      print(e);
    }
  }
  

Удалите async / await, поскольку currentUser не возвращает Future , также используйте setState для обновления переменной loggedInUser

Ответ №2:

Как сказал Питер.. Я следовал его подходу, но мой код работал, пока я выполнял следующее:

  1. Я удалил async / await и добавил setState, но потерпел неудачу — в нем говорилось, что я не могу назначить пользователю будущее, поскольку loggedInUser был FirebaseUser.
  2. Я перечитал async / await и сохранил setState таким, какой он есть, и код сработал..

Итак, я чувствую, что это только для FirebaseUser, нам нужно добавить setState к назначению loggedInUser.

Ответ №3:

В функции getCurrentUser() попробуйте изменить final user = _auth.currentUser;

чтобы final user = _auth.currentUser(); просто добавить эти круглые скобки.