如何修复错误:在 null 上调用了 getter 'email'。接收者:空尝试呼叫:电子邮件

Posted

技术标签:

【中文标题】如何修复错误:在 null 上调用了 getter \'email\'。接收者:空尝试呼叫:电子邮件【英文标题】:how to fix the error : The getter 'email' was called on null. Receiver: null Tried calling: email如何修复错误:在 null 上调用了 getter 'email'。接收者:空尝试呼叫:电子邮件 【发布时间】:2020-09-09 13:54:49 【问题描述】:

在尝试从 firebase 检索身份验证数据时,我遇到了以下错误: 在 null 上调用了 getter 'email'。 接收方:空 尝试呼叫:电子邮件

即使这在我的代码中没有错误。

当用户登录时,他将被重定向到主页:

这是我正在使用 home.dart 的代码(其中有侧边栏):

import 'package:flutter/material.dart';
import 'package:testa/bloc/navigation_bloc/navigation_bloc.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:testa/sidebar/sidebar.dart';
import 'package:testa/sidebar/sidebar_layout.dart';

class HomePage extends StatelessWidget with NavigationStates 

  const HomePage(Key key,@required this.user) : super(key: key);
  final FirebaseUser user;

  @override
  Widget build(BuildContext context) 

    return Scaffold(
      appBar: AppBar(
        title: Text('Home $user.email'),
      ),
      body: StreamBuilder<DocumentSnapshot>(
        stream: Firestore.instance
            .collection('/users')
            .document(user.uid)
            .snapshots(),
        builder:
            (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) 
          if (snapshot.hasError) 
            return Text('Error: $snapshot.error');
           else if (snapshot.hasData) 
            return checkRole(snapshot.data);
          
          return LinearProgressIndicator();
        ,
      ),
    );

  

  Center checkRole(DocumentSnapshot snapshot) 
    if (snapshot.data == null) 
      return Center(
        child: Text('no data set in the userId document in firestore'),
      );
    
    if (snapshot.data['role'] == 'admin') 
      return adminPage(snapshot);
     else 
      return userPage(snapshot);
    
  

  Center adminPage(DocumentSnapshot snapshot) 
    return Center(
        child: Text('$snapshot.data['role'] $snapshot.data['name']'));
  

  Center userPage(DocumentSnapshot snapshot) 
    return Center(child: Text(snapshot.data['name']));
  

这是 sign_in.dart 的代码,如果它可能会有所帮助,即使看起来没有问题

import 'package:firebase_auth/firebase_auth.dart';
import 'package:testa/pages/home.dart';
import 'package:flutter/material.dart';
import 'package:testa/sidebar/sidebar_layout.dart';
import 'package:testa/sidebar/sidebar.dart';

class LoginPage extends StatefulWidget 
  @override
  _LoginPageState createState() => new _LoginPageState();


class _LoginPageState extends State<LoginPage> 

  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  String _email, _password;


  @override
  Widget build(BuildContext context) 
    return new Scaffold(
      appBar: new AppBar(),
      body: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                validator: (input) 
                  if(input.isEmpty)
                    return 'Provide an email';
                  
                ,
                decoration: InputDecoration(
                    labelText: 'Email'
                ),
                onSaved: (input) => _email = input,
              ),
              TextFormField(
                validator: (input) 
                  if(input.length < 6)
                    return 'Longer password please';
                  
                ,
                decoration: InputDecoration(
                    labelText: 'Password'
                ),
                onSaved: (input) => _password = input,
                obscureText: true,
              ),
              RaisedButton(
                onPressed: signIn,
                child: Text('Sign in'),
              ),
            ],
          )
      ),
    );
  

  void signIn() async 
    if(_formKey.currentState.validate())
      _formKey.currentState.save();
      try
       FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password)).user;
       Navigator.push(context, MaterialPageRoute(builder: (context) => SideBarLayout(user: user)));

      catch(e)
        print(e.message);
      
    
  

当我通过 HomePage 更改 SideBarLayout 时,它工作正常,否则,我在第一个 'user' (context) => HomePage(user: user,)));它说(未定义命名参数'user'

  void signIn() async 
    if(_formKey.currentState.validate())
      _formKey.currentState.save();
      try
       FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password)).user;
        Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage(user: user,)));

      catch(e)
        print(e.message);
      
    
  

SideBarLayout.dart 代码:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'sidebar.dart';
import 'package:testa/bloc/navigation_bloc/navigation_bloc.dart';

class SideBarLayout extends StatelessWidget 


  const SideBarLayout(Key key, this.user) : super(key: key);
 final FirebaseUser user;

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: BlocProvider<NavigationBloc>(
        create: (context) => NavigationBloc(),
        child: Stack(
          children: <Widget>[
            BlocBuilder<NavigationBloc, NavigationStates> (
              builder: (context, navigationState) 
                return navigationState as Widget;
              ,
            ),
            SideBar(),

          ],
        ),
      ),
    );
  

【问题讨论】:

电子邮件/密码是正确的,因为首先我注册并且电子邮件很好地存储在数据库中,但在它返回此错误之后! 在 signInMethod 的 try-catch 块中尝试打印您的电子邮件。当您传递 data.put print(_email); 时,您提交的电子邮件似乎是空的。在 try 块的开头。使用您在控制台中看到的内容检查控制台和对此评论的回复。 你的SiderBarLayout在哪里,和HomePage一样? 我在这个方法中添加了它,它显示了我用来登录的电子邮件和同样的错误 => Navigator.push(context, MaterialPageRoute(builder: (context) => SideBarLayout(用户:用户))); print('Home $user.email');// 方法中添加的行 catch(e) print(e.message); @Adnankarim,它的另一个类,所以它不是主页 【参考方案1】:

这个错误可能是由无效的电子邮件/密码引起的,FirebaseAuth 正在返回null 并且没有检查您正在导航到下一页,因此它会引发错误。

    确保您提供正确的凭据。 在导航到Homepage 之前检查用户是否为空?

FirebaseUser user = (await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password)).user;
if(user!=null)
  // Navigate to Homepage

【讨论】:

@yassinezagliz 请在登录过程中附加调试器并逐步检查值和响应。 附在案例中 @yassinezagliz 是控制台中user = null 的值吗? @Brendan 不,它不是 nul。【参考方案2】:

您的用户数据没有被传递到 HomePgae,首先将您的 HomePgae 转换为 StatfullWidget 然后确保添加一个构造函数 检查this how to pass data to StatfullWidget Passing data to StatefulWidget and accessing it in it's state in Flutter

【讨论】:

我将此类转换为 StatfullWidget,但我不确定我是否理解您提到的第二步(确保添加构造函数),即使我检查了链接。谢谢 我认为观看视频会更好,因为它有点混乱,请在 6:30 分钟查看此视频,但我建议您观看整个视频youtu.be/d5PpeNb-dOY @RidhaRezzag 没有必要将其更改为有状态小部件。 HomePage 没有任何需要 State 的东西。

以上是关于如何修复错误:在 null 上调用了 getter 'email'。接收者:空尝试呼叫:电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 null 上调用了 getter 'user'

错误“在 null 上调用了 getter 'userEmail'

如何解决此问题 [错误:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'insta

错误状态: DocumentSnapshotPlatform 中不存在字段。它显示在 null 上调用了 getter

在 null 上调用了 getter 'classification'

在 null 上调用了 getter 'keys'