我正在创建一个基于Firebase身份验证和具有Flutter,Dart和Bloc模式的在线数据库的应用程序。 我想创建一个初始屏幕来检查用户是否已经使用firebase auth登录,以便可以根据当前状态将用户定向到另一个页面。
因此,我决定将流用于SplashScreen(这是一个StatelessWidget),并创建一个StreamBuilder以等待一些流返回值。但是在流中,我没有输入值。因此,在这种情况下我应该使用流,以及如何植入它。
class SplashScreen extends StatelessWidget {
Widget build(context) {
final bloc = BlocProvider.of(context);
return FutureBuilder(
future: bloc.loadUser(),
builder: (context, snapshot) {
if(snapshot.hasData) {
if(snapshot.data == null) {
Navigator.pushNamed(context, '/login');
} else {
Navigator.pushNamed(context, '/main');
}
} else {
return Scaffold(
body: Center(
child: Column(
children: <Widget>[
Text('Loading', style: TextStyle(fontSize: 20.0)),
CircularProgressIndicator(),
],
),
),
);
}
}
);
}
}
答案 0 :(得分:0)
所以,我实现了类似的功能,它是这样的:
在我的主应用程序中,我检查用户是否以这种方式登录:
bool isLoggedIn = true;
@override
void initState() {
FirebaseAuth.instance.currentUser().then((user) {
setState(() {
isLoggedIn = user != null;
});
});
super.initState();
}
在我的构建中,我相应地更改了视图:
@override
Widget build(BuildContext context) {
return AppProvider(
child: MaterialApp(
title: 'My Sample Title',
home: isLoggedIn ? HomePage() : LoginPage(),
),
);
}
我知道这种方法并没有完全使用块模式,但是这样做也是可以的。我在项目的大部分区域都使用了块模式(例如检查用户信息是否已存在于主页中)。