为了在 Daibaku 的原始问题上添加更多细节,这可能有助于澄清在 Flutter/dart 中使用 Futures,user
是:
final user = _fetchUserInfo(id);
如果不让编译器推断类型,那将是:
final Future<User> user = _fetchUserInfo(id);
获取和使用未来价值
Daibaku 询问如何获取user
并使用它的返回值。
要user
在小部件中使用,您的小部件必须观察/观察变化,并在发生变化时重建自身。
您可以使用大量样板代码手动执行此操作,或者您可以使用FutureBuilder
已为您完成此操作的 :
FutureBuilder(future: user, builder: (context, snapshot)
{
if (snapshot.hasData) return Text(snapshot.data.userName);
return Container(width: 0.0, height: 0.0,);
}
更明确地说,您可以将以上内容写为:
FutureBuilder<User>(future: user, builder: (context, AsyncSnapshot<User> userSnapshot)
{
if (userSnapshot.hasData) return Text(userSnapshot.data.userName);
return Container(width: 0.0, height: 0.0,);
}
FutureBuilder
在上面的示例中,同步(即立即)返回一个零宽度/高度的容器小部件,但还会将观察者附加到您的 future user
,以了解 Future 数据何时到达。
当user
最终用“数据”更新时,FutureBuilder
会通知观察者并调用setState()
,这将开始重建自身。现在返回的snapshot.hasData
是true
,Text(snapshot.data.userName)
而不是空的 Container。
如果您没有user
在 Widget Element 树构建的同步世界中使用,而只是想打印出调试值,您可以使用以下方法附加观察者then
:
user.then((u) => print(u.userName));