【问题标题】:Flutter Exception : The following NoSuchMethodError was thrown while handling a gesture: The getter 'email' was called on null颤振异常:处理手势时抛出以下 NoSuchMethodError:getter 'email' 被调用为 null
【发布时间】:2020-08-25 09:34:05
【问题描述】:

Flutter 显示我的 loggedInUser 为空/无效。但是我在 getCurrentUser() 方法中保存了用户的值。现在正因为如此,我的代码在第 92 行出现异常(该行后面是注释)。例外是 -

在处理手势时引发以下 NoSuchMethodError: 在 null 上调用了 getter 'email'。 接收方:空 尝试呼叫:电子邮件

//但是每当我使用_auth.currentUser.email 代替loggedInUser 时,我的代码运行良好。我不明白为什么??

请有人帮帮我,我是新手。

这是我的聊天屏幕代码 -

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,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

  • 您使用的是哪个版本的 firebase_auth?
  • @PeterHaddad 0.18.0+1

标签: firebase flutter google-cloud-firestore


【解决方案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 但失败了 - 这表示我无法将 Future 分配给用户,因为 loggedInUser 是 FirebaseUser。
    2. 我读取了 async/await 并保持 setState 原样,并且代码正常工作..

    所以我觉得,它只是针对 FirebaseUser,我们需要将 setState 添加到 loggedInUser 分配中。

    【讨论】:

      【解决方案3】:

      在函数中 getCurrentUser()试试改final user = _auth.currentUser;

      final user = _auth.currentUser(); 只需添加那些括号。

      【讨论】:

        猜你喜欢
        • 2021-03-06
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2021-07-15
        • 2021-08-06
        • 2020-04-25
        • 2021-05-23
        • 2021-08-20
        相关资源
        最近更新 更多