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);
    }