如何修复错误:在 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 'userEmail'
如何解决此问题 [错误:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:NoSuchMethodError:在 null 上调用了 getter 'insta
错误状态: DocumentSnapshotPlatform 中不存在字段。它显示在 null 上调用了 getter