getter'email'被调用为null

时间:2020-02-04 10:03:57

标签: firebase flutter dart firebase-authentication

我正在尝试使用Flutter和Firebase在两个人之间聊天,但是当我使用Firebase的signInWithEmailAndPassword连接到我的应用程序时遇到错误,它告诉我:

获取器'email'在null上被调用。接收方:null尝试调用: 电子邮件

Flutter还告诉我错误来自我main.dart中的MaterialApp小部件,这没有帮助我找到错误。

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:social/responsive/size_config.dart';
import 'settings.dart';
import 'home.dart';

final _firestore = Firestore.instance;
FirebaseUser loggedInUser;


class ActivityFeed extends StatefulWidget {
  static const String id = 'activity_feed_screen';
  @override
  _ActivityFeedState createState() => _ActivityFeedState();
}

class _ActivityFeedState extends State<ActivityFeed> {
  final _auth = FirebaseAuth.instance;

  @override
  void initState() {
    super.initState();
    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(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: Container(
              color: Colors.red,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                    UserInfo(),
                    FlatButton(
                      child: Icon(
                        Icons.settings,
                        color: Colors.white,
                      ),
                      onPressed: () {
                        Navigator.pushNamed(context, Settings.id);
                      },
                    ),
                  FlatButton(
                    child: Icon(
                      Icons.not_interested,
                      color: Colors.white,
                    ),
                    onPressed: () {
                      _auth.signOut();
                      Navigator.pushNamed(context, Home.id);
                    },
                  ),
                ],
              ),
            ),
          )
        ],
      ),
    );
  }
}

class UserInfo extends StatefulWidget {
  @override
  _UserInfoState createState() => _UserInfoState();
}

class _UserInfoState extends State<UserInfo> {

  String email = loggedInUser.email;
  String username;

  @override
  void initState() {
    super.initState();
    getUsername();
  }

  void getUsername() async {
    DocumentReference docRef = _firestore.collection('users').document(email);
    docRef.get().then((snapshot) {
      if (snapshot.exists) {
        username = snapshot.data['username'];
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    SizeConfig().init(context);
    return Column(
        children: <Widget>[
          Text(
            'Welcome $username',
            style: TextStyle(
                fontFamily: 'Amatic',
                fontSize: SizeConfig.safeBlockHorizontal * 10),
          ),
        ],
      )
    ;
  }
}

所以基本上我只是想显示'Welcome'+用户名,但是它不想要, 我的Firebase数据库有一个名为“用户”的集合,其中文档名称是用户创建帐户时使用的电子邮件。

所有的注册/登录过程似乎都正常。

如果有人对正在发生的事情有个线索,那就太好了,谢谢。

1 个答案:

答案 0 :(得分:1)

您将用户名初始化为空。您可以在小部件树上对其进行检查

username != null ? Text(
        'Welcome $username',
        style: TextStyle(
            fontFamily: 'Amatic',
            fontSize: SizeConfig.safeBlockHorizontal * 10),
        ) : CircularProgressIndicator()

并通过setState()

进行设置
setState(() {
   username = snapshot.data['username'];
});

另一种解决方案是更改

String username;

String username = '';

您应该顺便使用state management方法。 setState()非常原始,如果将它用作状态管理解决方案,最终将得到sphagetti代码。