Flutter:关于期货和异步功能的问题

Posted

技术标签:

【中文标题】Flutter:关于期货和异步功能的问题【英文标题】:Flutter : Question about Futures and async function 【发布时间】:2019-07-22 09:22:04 【问题描述】:

我有几个关于在 dart 中使用 Futures 的问题。假设我正在使用 Firestore,并且我有这样的功能来更新用户的信息:

void updateOldUser(User oldUser,String newInfo)
DocumentReference userToUpdateRef = userRef.document(oldUser.id);
Firestore.instance.runTransaction((Transaction transaction) async 
DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists)
    await transaction.update(
      userToUpdateSnapshot.reference, userToUpdateSnapshot.data[newInfo] + 1
    ).catchError((e)=> print(e));
  
);

我的问题是:它是否需要返回一个未来,因为 runTransaction 是未来。没有它似乎可以正常工作,但对我来说,它应该返回一个“Future void”,以便在我使用它时能够等待 updateOldUser。但是当我把它变成一个“未来的虚空”,然后用'return;'结束函数体时我有一个错误说“返回后预期值”。 但我真正不明白的是,还有另一个类似的代码:

Future<void> updateUserPhoto(User user,File userPhoto) async 
String photoUrl = await  uploadImage(user.id,userPhoto);
DocumentReference userToUpdateRef = userRef.document(user.id);
Firestore.instance.runTransaction((Transaction transaction) async 
  DocumentSnapshot userToUpdateSnapshot = await transaction.get(userToUpdateRef);
  if(userToUpdateSnapshot.exists)
    await transaction.update(
      userToUpdateSnapshot.reference, 
      'photoUrl' : photoUrl
      
    ).catchError((e)=> print(e));
  
);
return;

我没有收到此错误,它也可以正常工作。为什么 ?提前致谢。

【问题讨论】:

【参考方案1】:

是否需要返回一个未来

如果你希望调用者能够等待函数的完成,那么返回类型应该是Future&lt;...&gt;(如果没有具体的返回值,比如Future&lt;void&gt;,或者如果结果是Future&lt;int&gt;整数值,...)

对于即发即弃的async 函数,您可以使用void,但这并不常见。 如果返回类型是Future&lt;...&gt;,调用者仍然可以决定不等待完成。

但是当我把它变成一个“Future void”然后用'return;'结束函数体时

如果您使用async,则在方法结束时隐式返回Future

如果你使用async,你需要返回一个Future like

return doSomething.then((v) => doSomethingElse());

【讨论】:

以上是关于Flutter:关于期货和异步功能的问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutte VS RN

whenComplete() 方法没有按预期工作 - Flutter Async

flutte学习-编译模式

flutte学习-编译模式

Flutter:关于检索 Firebase 用户 ID 的异步函数的问题

关于Flutter初始化流程,我必须告诉你的是...