Firebase 颤振如何使用未来返回值作为变量
我想得到Firebase 颤振如何使用未来返回值作为变量,firebase,flutter,dart,google-cloud-firestore,flutter-future,Firebase,Flutter,Dart,Google Cloud Firestore,Flutter Future,我想得到Future返回值,并像变量一样使用它。 我有这个Future功能 Future<User> _fetchUserInfo(String id) async { User fetchedUser; await Firestore.instance .collection('user') .document(id) .get() .then((snapshot) { final Us
Future
返回值,并像变量一样使用它。
我有这个Future
功能
Future<User> _fetchUserInfo(String id) async {
User fetchedUser;
await Firestore.instance
.collection('user')
.document(id)
.get()
.then((snapshot) {
final User user = User(snapshot);
fetchedUser = user;
});
return fetchedUser;
}
但是当我试着这样用的时候
new Text(user.userName);
Dart无法识别为用户
类。它表示动态
如何获取返回值并使用它?
首先,我做错了吗?
感谢您的帮助 您可以简化代码:
Future<User> _fetchUserInfo(String id) async {
User fetchedUser;
var snapshot = await Firestore.instance
.collection('user')
.document(id)
.get();
return User(snapshot);
}
import java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
类ThreadExample实现可调用{
@凌驾
公共字符串调用()引发异常{
//TODO自动生成的方法存根
返回“Ashish”;
}
}
公共类示例{
公共静态void main(字符串a[])引发InterruptedException、ExecutionException{
ExecutorService ExecutorService=Executors.newFixedThreadPool(1);
List objList=new ArrayList();
对于(int i=0;i使用如下
此函数返回未来值
dbHelper.getUsers()
是这样写的
getUsers() async { .... }
为了对Daibaku的原始问题添加更多细节,这可能有助于澄清在颤振/飞镖中使用期货,user
是:
final user = _fetchUserInfo(id);
在不让编译器推断类型的情况下,这将是:
final Future<User> user = _fetchUserInfo(id);
更明确地说,您可以将上述内容写成:
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,);
}
只需在上述答案的基础上添加更多解释/说明
当一个函数返回一个Future时,它意味着它的结果需要一段时间才能准备好,并且结果将在将来可用
调用一个返回未来的函数不会阻塞代码,这就是为什么该函数被称为异步函数。相反,它会立即返回一个未来对象,它最初是未完成的
Future
意味着异步操作的结果将是T
类型。例如,如果函数返回Future
,这意味着将来它将向您提供一个字符串
只有当未来已完成时,未来的结果才可用。
您可以使用以下任一关键字访问将来的结果:
然后
等待
假设getNews函数返回Future
的一个实例
Future<String> getNews() async {
final response = await http.get(url);
return response.body;
}
或
请注意,await关键字只能在异步函数体中使用:
Future<void> foo() async {
String news = await getNews();
print(news);
}
Future foo()异步{
String news=等待获取新闻();
印刷品(新闻);
}
异步
函数的结果必须是未来
有关更多信息,请参阅:在回答之前正确阅读OP问题。这篇文章是关于颤振(dart)的不是Java谢谢。所以我需要就地创建函数来接收未来的返回值?这很有效但很奇怪!我不确定你的确切意思。我添加函数是为了演示如何放置async
。你的代码很可能已经在函数中了。你也可以始终使用。然后(…)
使用Future
。您还应该知道Future
是所有类型回调的统一处理程序,因此“只是为了接收Future的返回值”听起来你并没有完全考虑到底发生了什么。你是对的,我是个新手,我试图理解的是为什么单凭这一点是不可能的:final user=wait _fetchUserInfo(id);
那么为什么要创建一个foo();?正如前面提到的Future
是关于代码所在的回调(将来传递给的函数。然后(…)
)在异步执行的结果最终可用时被调用。如果使用async
这是Dart的一个标志,该代码使用简化的异步语法,例如wait
,它需要将该代码重写为。然后(…)
语法,然后才能实际编译代码。您不希望自动执行此操作,因为async
始终要求此类函数的返回类型为未来的,如果可能的话,将尽量避免这种返回类型。帮助我解决问题。您忘记了使用wait
属于async
方法。这很简单事情。@HuyTower如果你知道答案,为什么不回答呢?我打赌你来这里是因为你也在寻找答案。
final Future<User> user = _fetchUserInfo(id);
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,);
}
user.then((u) => print(u.userName));
Future<String> getNews() async {
final response = await http.get(url);
return response.body;
}
getNews().then((news) {
print(news);
});
String news = await getNews();
print(news);
Future<void> foo() async {
String news = await getNews();
print(news);
}