在Flutter的FutureBuilder中同时检查snapshot.hasData和snapshot.data != null是否冗余?
Flutter FutureBuilder里的双重检查:
hasData && data != null是不是多余? 这种写法完全是冗余的,只用snapshot.hasData就够了。
为啥这么说?看AsyncSnapshot的源码就懂了:hasData的定义就是bool get hasData => data != null;——也就是说,hasData为true的唯一条件就是data不为null,两者是完全等价的。写hasData && data != null,就跟写data != null && data != null一样,纯粹重复。
那有没有什么特殊场景需要同时检查?正常情况下没有。哪怕你用的是未指定泛型的AsyncSnapshot(比如例子里的AsyncSnapshot而不是AsyncSnapshot<YourDataType>),hasData的逻辑还是判断data是否为null,所以依然不需要多此一举。
如果要优化原代码,直接把双重检查改成只判断hasData就行:
FutureBuilder( future: future, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return widgetToBuild; } else if (snapshot.hasError) { return Icon(Icons.error_outline); } else { return CircularProgressIndicator(); } } )
补充个小细节:如果你的Future返回的是可空类型(比如Future<String?>),当Future实际返回null时,hasData会是false,这时候会走到else分支。要是你想单独处理“Future完成但返回null”的情况,得额外判断snapshot.connectionState == ConnectionState.done && snapshot.data == null,但这和原问题里的双重检查不是一回事,别搞混了。
内容的提问来源于stack exchange,提问作者MendelG
相关产品推荐
相关产品推荐

