Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 颤振:关于未来和异步函数的问题_Asynchronous_Dart_Flutter_Google Cloud Firestore_Future - Fatal编程技术网

Asynchronous 颤振:关于未来和异步函数的问题

Asynchronous 颤振:关于未来和异步函数的问题,asynchronous,dart,flutter,google-cloud-firestore,future,Asynchronous,Dart,Flutter,Google Cloud Firestore,Future,关于在dart中使用期货,我有几个问题。假设我正在使用firestore,我有这样一个功能来更新用户的信息: void updateOldUser(User oldUser,String newInfo){ DocumentReference userToUpdateRef = userRef.document(oldUser.id); Firestore.instance.runTransaction((Transaction transaction) async { DocumentSnap

关于在dart中使用期货,我有几个问题。假设我正在使用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,它是否需要返回future。如果没有它,它似乎可以正常工作,但对我来说,它应该返回一个“未来的空白”,以便在我使用它时能够等待UpdateLDUser。但当我把它变成一个“未来的空白”,然后用“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;
Future updateUserPhoto(用户用户,文件用户照片)异步{
字符串photoUrl=wait uploadImage(user.id,userPhoto);
DocumentReference userToUpdateRef=userRef.document(user.id);
Firestore.instance.runTransaction((事务)异步{
DocumentSnapshot userToUpdateSnapshot=等待事务.get(userToUpdateRef);
如果(userToUpdateSnapshot.exists){
等待事务处理。更新(
userToUpdateSnapshot.reference{
“photoUrl”:photoUrl
}
).catchError((e)=>打印(e));
}
});
返回;
}

我没有得到这个错误,它的工作也很好。为什么?提前谢谢

它需要回归未来吗

如果希望调用者能够等待函数完成,则返回类型应为
Future
(如
Future
如果没有具体的返回值,或
Future
如果结果为整数值,…)

对于fire-and-forget
async
函数,可以使用
void
,但这种情况并不常见。 如果返回类型是
Future
,调用方仍然可以决定不等待完成

但当我把它变成一个“未来的空白”,然后用“return;”结束函数体时

如果使用
async
,则在方法末尾隐式返回
Future

如果不使用
async
,则需要返回一个
未来的
,如

return doSomething.then((v) => doSomethingElse());
它需要回归未来吗

如果希望调用者能够等待函数完成,则返回类型应为
Future
(如
Future
如果没有具体的返回值,或
Future
如果结果为整数值,…)

对于fire-and-forget
async
函数,可以使用
void
,但这种情况并不常见。 如果返回类型是
Future
,调用方仍然可以决定不等待完成

但当我把它变成一个“未来的空白”,然后用“return;”结束函数体时

如果使用
async
,则在方法末尾隐式返回
Future

如果不使用
async
,则需要返回一个
未来的
,如

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