FutureBuilder
,并发现了一种模式,在渲染小部件之前会检查 both snapshot.hasData
and snapshot.data != null
:
FutureBuilder(
future: future,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData && snapshot.data != null) {
return widgetToBuild;
} else if (snapshot.hasError) {
return Icon(Icons.error_outline);
} else {
return CircularProgressIndicator();
}
}
)
AsyncSnapshot
的源代码时,我注意到hasData
被定义为true
,如果
data
不是
null
:
bool get hasData => data != null;
鉴于此实现,检查 snapshot.hasData
和
snapshot.data != null
是否多余?
snapshot.hasData
还不够吗,因为它本质上会检查
data
是否不是
null
?我很好奇是否存在两种检查都是必要的场景,或者这是否只是开发人员经常错误的
FutureBuilder
使用中的常见误解。
AsyncSnapshot
代码,它看起来像这样
if (snapshot.data != null && snapshot.data != null) {
关于 null
可能产生
future
结果,它在我的某些代码中发生过一次(由于意外情况),并且
FutureBuilder
卡在
CircularProgressIndicator
上,因为从未检测到数据。 因此,除非发生变化,否则我认为
null
-返回期货不应与
FutureBuilder
一起使用。
是的,这是多余的,因为 hasData getter 已经这样做了
FutureBuilder(
future: getValue(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
// Check if is loading
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
// When the builder has data
if (snapshot.hasData) {
// Here you can force no null without issues
return Text(snapshot.data);
}
return const Icon(Icons.error_outline);
},
)