问题描述
我有一个名为 userName
的变量,它依赖于数据库查询,所以 async 是必须的。
我的旧代码可以这样总结
class IndexScreen extends StatefulWidget {
@override
_IndexScreenState createState() => _IndexScreenState();
}
//use database query function
Future<void> initUser() async{
UserTable().getUserInfo(curUserEmail).then((value)=>null);
}
//show page
class _IndexScreenState extends State<IndexScreen> {
@override
Widget build(BuildContext context) {
initUser().then((value){
final theme = Theme.of(context);
return WillPopScope(
onWillPop: () =>router.navigateto(context,'/welcome'),child: SafeArea(
child: Scaffold(
//The static global variable is used in Body in other files
body: Body()
),),);
});
}
}
谢谢!!
解决方法
您可以使用 FutureBuilder
小部件实现此目的。请参考下面的代码。
class IndexScreen extends StatefulWidget {
@override
_IndexScreenState createState() => _IndexScreenState();
}
//use database query function
Future<Map> initUser() async {
final data =
await UserTable().getUserInfo(curUserEmail);
return data;
}
//show page
class _IndexScreenState extends State<IndexScreen> {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: initUser(),builder: (BuildContext context,AsyncSnapshot snapshot) {
if (snapshot.hasData) {
final theme = Theme.of(context);
return WillPopScope(
onWillPop: () => router.navigateTo(context,'/welcome'),child: SafeArea(
child: Scaffold(
body: Body(),),);
} else {
// Returns empty container untill the data is loaded
Container();
}
},);
}
}