我正在通过Firebase创建登录代码。我只想登录到通过电子邮件注册并认证的用户并进行设置,以便可以自动登录。使用streambuilder创建的代码可以自动登录。但是,当接收者为null时,会发生自动登录电子邮件身份验证错误。有没有办法将接收器放入?或者,如果您能告诉我解决方法,我将不胜感激。
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();
}
}
},
),
);
}
}
这是错误。
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
答案 0 :(得分:1)
'isEmailVerified'
被调用为null,表示_firebaseUser
为null。您没有初始化_firebaseUser
,因为您正在FirebaseAuth.instance.onAuthStateChanged
中使用StreamBuilder
,它应该返回Stream<FirebaseUser>
,因此您应该使用类型为snapshot
的变量AsyncSnapshot<FirebaseUser>
检查电子邮件是否已验证。
else {
if (snapshot.hasData &&snapshot.data.isEmailVerified == true) {
return MemoPage();
} else {
return LogInPage();
}