如何使用Future返回值,就好像变量一样

Two*_*San 7 dart firebase flutter google-cloud-firestore

我想得到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;
  }
Run Code Online (Sandbox Code Playgroud)

我希望得到这样的价值

final user = _fetchUserInfo(id);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用这样的时候

new Text(user.userName);
Run Code Online (Sandbox Code Playgroud)

Dart不承认是User班级.它说dynamic.
我如何获得返回值并使用它?
我首先做错了吗?任何帮助表示赞赏!

Gün*_*uer 17

您可以简化代码:

Future<User> _fetchUserInfo(String id) async {
    User fetchedUser;
    var snapshot = await Firestore.instance
        .collection('user')
        .document(id)
        .get();
    return User(snapshot);
  }
Run Code Online (Sandbox Code Playgroud)

你还需要async/await来获取值

void foo() async {
  final user = await _fetchUserInfo(id);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。所以我需要就地创建函数只是为了接收未来的返回值?这有效但很奇怪! (2认同)
  • 你是对的,我是 Flutter 的新手,我想要理解的是为什么单独这样做是不可能的:`final user = wait _fetchUserInfo(id);` 那么为什么要创建一个 foo(); ? (2认同)
  • 正如前面提到的,`Future` 是关于回调,当异步执行的结果最终可用时,你的代码(你传递给 `aFuture.then(...)` 的函数)被调用。如果你使用 `async`,这是 Dart 的一个标志,该代码使用了简化的异步语法,例如使用 `await`,它需要将此代码重写为 `.then(...)` 语法之前代码实际上可以编译。您不希望自动执行此操作,因为 `async` *总是* 要求此类函数的返回类型为 `Future&lt;...&gt;`,如果可能,人们会尽量避免这种情况。 (2认同)

Ras*_*bal 9

像这样使用

var username;
dbHelper.getUsers().then((user) {
  username = user.getName;
});
Run Code Online (Sandbox Code Playgroud)

此函数返回未来值

dbHelper.getUsers()
Run Code Online (Sandbox Code Playgroud)

它是这样写的

getUsers() async { .... }
Run Code Online (Sandbox Code Playgroud)