为了在 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));