基于 futureBuilder 的 Flutter MaterialApp 主页
Flutter MaterialApp home based on futureBuilder
当我的应用程序启动时,它会检测用户是否登录(使用 firebase),并根据此检查显示主页或登录页面。到现在一切都很好,但我想再加一层。
用户可以以普通用户或管理员身份登录。
所以不仅要检查认证状态,还要检查用户的“级别”,根据用户级别显示不同的页面。
我通过对 firestore 数据库的查询获得了用户级别,所以这是一个 Future。
这是我正在使用的代码:
final usersCollection = FirebaseFirestore.instance.collection('users');
User loggedUser = FirebaseAuth.instance.currentUser;
Future<InfoUtente> userInfo;
String livelloLogin;
// here I get the user from the firestore database, based on the authenticated user id
Future<InfoUtente> fetchInfoUtente() async {
final response = await usersCollection
.where(
'uid',
isEqualTo: loggedUser.uid,
)
.get();
return InfoUtente.fromFireStore(response.docs.first);
}
// here I return the page based on the user authentication "level"
Future<Widget> widgetChoice() async {
if (!isLogged)
return LoginNewPage();
else {
userInfo.then(
(value) {
livelloLogin = value.loginLevel;
if (livelloLogin == 'struttura')
return StrutturaPage();
else
return MainPage();
},
);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
// the homepage of the material app is a future builder
home: FutureBuilder(
future: widgetChoice(),
builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
if (!widget.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
return widget.data;
},
),
);
}
有些地方不对,因为它总是显示循环进度指示器。
我究竟做错了什么?
这是正确的做法还是我完全错了?
如果我是对的,你必须这样调用 future 函数:
FutureBuilder(
future: widgetChoice,
没有()
如果没有获取或找到任何数据,您的屏幕将无限期地卡在加载中。将构建器的实现更新为
builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
if(widget.connectionState == ConnectionState.done){
if (!widget.hasData) {
return Center(
child: Text('No Data exists')
);
}
return widget.data;
}
return Center(
child: CircularProgressIndicator(),
);
},
并将您的 widgetChoice
更新为
Future<Widget> widgetChoice() async {
if (!isLogged)
return LoginNewPage();
else {
var userInfo = await fetchInfoUtente();
livelloLogin = userInfo.loginLevel;
if (livelloLogin == 'struttura')
return StrutturaPage();
else
return MainPage();
}
}
当我的应用程序启动时,它会检测用户是否登录(使用 firebase),并根据此检查显示主页或登录页面。到现在一切都很好,但我想再加一层。
用户可以以普通用户或管理员身份登录。 所以不仅要检查认证状态,还要检查用户的“级别”,根据用户级别显示不同的页面。
我通过对 firestore 数据库的查询获得了用户级别,所以这是一个 Future。 这是我正在使用的代码:
final usersCollection = FirebaseFirestore.instance.collection('users');
User loggedUser = FirebaseAuth.instance.currentUser;
Future<InfoUtente> userInfo;
String livelloLogin;
// here I get the user from the firestore database, based on the authenticated user id
Future<InfoUtente> fetchInfoUtente() async {
final response = await usersCollection
.where(
'uid',
isEqualTo: loggedUser.uid,
)
.get();
return InfoUtente.fromFireStore(response.docs.first);
}
// here I return the page based on the user authentication "level"
Future<Widget> widgetChoice() async {
if (!isLogged)
return LoginNewPage();
else {
userInfo.then(
(value) {
livelloLogin = value.loginLevel;
if (livelloLogin == 'struttura')
return StrutturaPage();
else
return MainPage();
},
);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
// the homepage of the material app is a future builder
home: FutureBuilder(
future: widgetChoice(),
builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
if (!widget.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
return widget.data;
},
),
);
}
有些地方不对,因为它总是显示循环进度指示器。 我究竟做错了什么? 这是正确的做法还是我完全错了?
如果我是对的,你必须这样调用 future 函数:
FutureBuilder(
future: widgetChoice,
没有()
如果没有获取或找到任何数据,您的屏幕将无限期地卡在加载中。将构建器的实现更新为
builder: (BuildContext context, AsyncSnapshot<Widget> widget) {
if(widget.connectionState == ConnectionState.done){
if (!widget.hasData) {
return Center(
child: Text('No Data exists')
);
}
return widget.data;
}
return Center(
child: CircularProgressIndicator(),
);
},
并将您的 widgetChoice
更新为
Future<Widget> widgetChoice() async {
if (!isLogged)
return LoginNewPage();
else {
var userInfo = await fetchInfoUtente();
livelloLogin = userInfo.loginLevel;
if (livelloLogin == 'struttura')
return StrutturaPage();
else
return MainPage();
}
}