颤振-Firebase自动登录和电子邮件身份验证错误

颤振-Firebase自动登录和电子邮件身份验证错误,firebase,flutter,dart,firebase-authentication,Firebase,Flutter,Dart,Firebase Authentication,我正在通过firebase创建登录代码。我只想登录到通过电子邮件注册和认证的用户,并将其设置为可以自动登录。使用streambuilder创建了用于自动登录的代码。但是,当收件人为空时,会发生自动登录电子邮件身份验证错误。有没有办法把听筒放进去?或者如果你能告诉我怎么解决我会很感激的 import 'dart:io'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart

我正在通过firebase创建登录代码。我只想登录到通过电子邮件注册和认证的用户,并将其设置为可以自动登录。使用streambuilder创建了用于自动登录的代码。但是,当收件人为空时,会发生自动登录电子邮件身份验证错误。有没有办法把听筒放进去?或者如果你能告诉我怎么解决我会很感激的

import 'dart:io';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutteridmemo/pages/log_in_page.dart';
import 'package:flutteridmemo/pages/memo_page.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Directory document = await getApplicationDocumentsDirectory();
  Hive.init(document.path);
  await Hive.openBox<String>("DB");
  runApp(MyApp());
}

bool isFirstData = true;

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FirebaseUser _firebaseUser;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        canvasColor: Colors.transparent,
      ),
      title: 'ID_Memo_Memo',
      home: StreamBuilder<FirebaseUser>(
        stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (context, snapshot) {
          if (isFirstData) {
            isFirstData = false;
            return Center(
              child: CircularProgressIndicator(),
            );
          } else {
            if (snapshot.hasData && _firebaseUser.isEmailVerified == true) {
              return MemoPage();
            } else {
              return LogInPage();
            }
          }
        },
      ),
    );
  }
}
导入'dart:io';
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“package:Memo/pages/log_in_page.dart”;
导入“package:memo/pages/memo_page.dart”;
导入“package:hive/hive.dart”;
导入“package:path_provider/path_provider.dart”;
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
目录文档=等待getApplicationDocumentsDirectory();
init(document.path);
等待Hive.openBox(“DB”);
runApp(MyApp());
}
bool isFirstData=true;
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
FirebaseUser\u FirebaseUser;
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark().copyWith(
画布颜色:颜色。透明,
),
标题:“身份证备忘录”,
主页:StreamBuilder(
流:FirebaseAuth.instance.onAuthStateChanged,
生成器:(上下文,快照){
if(isFirstData){
isFirstData=false;
返回中心(
子对象:CircularProgressIndicator(),
);
}否则{
if(snapshot.hasData&&u firebaseUser.isEmailVerified==true){
返回MemoPage();
}否则{
返回登录页面();
}
}
},
),
);
}
}
这就是错误所在

I/flutter (14699): The following NoSuchMethodError was thrown building             
StreamBuilder<FirebaseUser>(dirty, state:
I/flutter (14699): _StreamBuilderBaseState<FirebaseUser,         
AsyncSnapshot<FirebaseUser>>#963d7):
I/flutter (14699): The getter 'isEmailVerified' was called on null.
I/flutter (14699): Receiver: null
I/flutter (14699): Tried calling: isEmailVerified
I/flutter (14699): 
I/flutter (14699): The relevant error-causing widget was:
I/flutter (14699):   StreamBuilder<FirebaseUser> enter code here
I/flatter(14699):在建筑中抛出以下NoSuchMethodError
StreamBuilder(脏,状态:
I/颤振(14699):_streambuilder基础状态#963d7):
I/flatter(14699):在null上调用了getter'isEmailVerified'。
I/颤振(14699):接收器:空
I/flatter(14699):尝试呼叫:isEmailVerified
I/颤振(14699):
I/flatter(14699):导致错误的相关小部件是:
I/颤振(14699):StreamBuilder在此处输入代码

因此,即使快照不包含数据,也会发生这种情况,即,即使快照为null,也会尝试对其调用isEmailVerified。将代码更改为类似以下内容:

if (snapshot.hasData) {
  if(_firebaseUser.isEmailVerified == true){
    return MemoPage();
  }
}else{
    return LogInPage();
}

'isEmailVerified'
被调用为null,表示
\u firebaseUser
为null。您没有初始化
\u firebaseUser
,因为您正在
StreamBuilder
中使用
FirebaseAuth.instance.onAuthStateChanged
,它应该返回
,因此您应该使用
AsyncSnapshot
类型的变量
来检查电子邮件是否已验证

 else {
            if (snapshot.hasData &&snapshot.data.isEmailVerified == true) {
              return MemoPage();
            } else {
              return LogInPage();
            }

多亏了你,问题解决了。谢谢你给了我一个好的解决方案。谢谢你告诉我这个解决方案。这是一个很好的解决方案,但我选择了另一种方法,因为我认为另一种方法更好。然而,通过教我如何用这种方法,我学会了各种方法。非常感谢。