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<...>
(如果没有具体的返回值,比如Future<void>
,或者如果结果是Future<int>
整数值,...)
对于即发即弃的async
函数,您可以使用void
,但这并不常见。
如果返回类型是Future<...>
,调用者仍然可以决定不等待完成。
但是当我把它变成一个“Future void”然后用'return;'结束函数体时
如果您使用async
,则在方法结束时隐式返回Future
。
如果你不使用async
,你需要返回一个Future
like
return doSomething.then((v) => doSomethingElse());
【讨论】:
以上是关于Flutter:关于期货和异步功能的问题的主要内容,如果未能解决你的问题,请参考以下文章
whenComplete() 方法没有按预期工作 - Flutter Async