我有一个小部件,该小部件在第一次单击时显示错误页面,表示我要达到的值为null ...当我第二次打开该小部件时,它可以工作,因为在第一次单击时加载了该值,并且屏幕显示正确。在加载值之前,如何使用户看到“循环进度指示器”而不是错误页面?
这是小部件:
Widget build(BuildContext context){
var user = Provider.of<UserRepository>(context);
user.cacheGet();
return Scaffold(
appBar: AppBar(
title: Text("Last Conversation"),
),
body: user.conversationID.values == null
? Center(
child: CircularProgressIndicator(),
)
: Container(
child: _myListView(context, user.conversationID.values),
),
);
}
由于user.conversationID.values
是null
,因此显示错误。它是通过类型为cacheGet( )
的{{1}}函数加载的...因此,如果我返回并再次打开同一屏幕(窗口小部件),则会加载该值,并且不会显示错误。我尝试使用三元运算符,但是在这种情况下它不起作用。
编辑
这是Future <bool>
函数。
cacheGet
答案 0 :(得分:1)
只需用将来的构建器包装小部件即可。这是示例代码:
FutureBuilder<bool>(
future: user.cacheGet(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.hasData){
return user.conversationID.values == null
? Center(
child: CircularProgressIndicator(),
)
: Container(
child: _myListView(context, user.conversationID.values),
);
}else{
return Container();
}
},
)
答案 1 :(得分:0)
像user.cacheGet();
这样的例程不应该在build()
内部完成,但是initState()
可能是一个更好的选择。
我建议您查看FutureBuilder(或StreamBuilder)。考虑一下您的价值如何可能是 Future ,然后您的构建例程将使用FutureBuilder
,它会在等待数据时显示CircularProgressIndicator()
,然后再显示其他内容一旦有了数据(或者第三种情况是获取数据时出错)。未来应该在initState()
中初始化。