如何在Flutter Firebase中检查用户是否为SignedIn


大家好。我是flutter的新手,我想检查用户是否已登录。如果是,则用户导航到HomeScreen else SplashScreen。

这是我的主要艺术

void main() async{
runApp(MyApp());
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Instant Tasker',
theme: theme(),
initialRoute: SplashScreen.routeName,
routes: routes,
);
}
}

这是启动屏幕

class SplashScreen extends StatefulWidget {
static String routeName = "/splash";
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
var _duration = new Duration(seconds: 2);
return new Timer(_duration, navigationPage);
}
void navigationPage() {
var auth = FirebaseAuth.instance;
// ignore: deprecated_member_use
auth.onAuthStateChanged.listen((user) {
if (user != null) {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => MainScreen()),
(Route<dynamic> route) => false);
} else {}
});
}
@override
void initState() {
super.initState();
startTime();
}
@override
Widget build(BuildContext context) {
SizeConfig().init(context);
return Scaffold(
body: Body()
);
}
}

然而,我实现了在启动屏幕上检查用户,但它停留在启动屏幕检查用户,然后转到主屏幕,这似乎不太好。或者有人能建议如何在检查用户时显示CircularProgressIndicator而不是Splash Screen主体吗

您可以使用StreamProvder实现

实施

步骤

创建CustomUser数据模型。

class CustomUser {
final String userId;
CustomUser({this.userId});
}

创建一个名为FirebaseAuthService的类并创建一个stream以侦听FirebaseAuthStateChanges

import 'package:firebase_auth/firebase_auth.dart';
class FirebaseAuthService {
final FirebaseAuth auth = FirebaseAuth.instance;
// create user obj based on firebase user
CustomUser _userFromFirebaseUser(User user) {
return user != null ? CustomUser(userId: user.uid) : null;
}
// auth change user stream
//Required stream
Stream<CustomUser> get user {
return auth.authStateChanges().map(_userFromFirebaseUser);
}
}
}

在要检查AuthState的小部件树顶部添加一个StreamProvider

void main() async{
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<CustomUser>.value(
value: FirebaseAuthService().user,
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Instant Tasker',
theme: theme(),
initialRoute: SplashScreen.routeName,
routes: routes,
)
);
}
}

创建一个Wrapper,并根据AuthState返回SplashScreenHomeScreen

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
final user = Provider.of<CustomUser>(context);
if (user == null) {
return SplashScreen();
}
return HomeScreen();
}
}

现在您可以使用final user = Provider.of<CustomUser>(context);在小部件树中检查用户是否为null。

https://www.youtube.com/watch?v=z05m8nlPRxk&list=PL4cUxeGkcC9j-TKIdkb3ISfRbJeJYQwC&索引=3

最新更新