Флаттер: вопрос о фьючерсах и асинхронной функции - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть несколько вопросов, касающихся использования фьючерсов в дротике.Допустим, я работаю с пожарным магазином, и у меня есть такая функция для обновления информации пользователей:

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Будущее.Кажется, что он работает нормально без него, но мне кажется, что он должен вернуть «Будущее пустое пространство», чтобы иметь возможность ожидать updateOldUser, когда я его использую.Но когда я превращаю его в «Future void», а затем завершаю тело функции с помощью 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 Ответ

0 голосов
/ 28 февраля 2019

нужно ли возвращать будущее

Если вы хотите, чтобы вызывающая сторона могла ожидать завершения функции, тогда тип возвращаемого значения должен быть Future<...> (как Future<void>, если нет конкретного возвращаемого значения, или Future<int>, если результатом является целочисленное значение, ...)

Для функций async "забей и забудь" можно использовать void, ноэто довольно необычно.Если тип возврата Future<...>, вызывающий может все равно решить не ждать завершения.

Но когда я превращаю его в «Future void», а затем завершаю тело функции с помощью «return;'

Если вы используете async, в конце метода возвращается неявно Future.

Если вы делаете , а не , используйте async, вам нужно вернуть Future как

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