Создать будущее на основе результата другого будущего - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть удаленная асинхронная функция firebase «checkSubscription», которая возвращает либо «true», если у пользователя есть действительная подписка, либо «N», где N означает количество оставшихся кредитов до того, как у пользователя закончится.

Для отслеживания завершения у меня в классе есть два следующих фьючерса:

Future<bool> hasSubscription;
Future<int> remaining;

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

CloudFunctions.instance
        .call(functionName: 'checkSubscription');

Эта функция возвращает Future<dynamic> с результатом.

Я борюсь с логикой Future, необходимой для назначения моих двух полей с помощьюнеобходимые типы.Вот что я придумал

Future<void> checkIfUserHasSubscription() async {
    await Future < dynamic > remainingS = CloudFunctions.instance
        .call(functionName: 'isValid');

    if (remaining == "true")
      hasSubscription = true;
    else {
      hasSubscription = false;
      remaining = int.parse(remaining);
    }
  }

Очевидно, это не сработает, потому что я назначаю bool вместо Future

Любой совет?

Ответы [ 2 ]

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

Насколько я понимаю, вы хотите иметь два фьючерса, которые будут завершены позднее.Эти фьючерсы должны быть доступны сразу же, когда вы вызываете функцию проверки, но должны выполняться только тогда, когда у вас есть результат.

Для этого вам следует использовать Completer.

Я буду считатьчто вы вызываете функцию проверки только один раз.Если нет, то вы должны создавать новый завершитель при каждом вызове внутри функции и вместо этого сохранять фьючерсы в изменяемых полях.

Future<bool> _hasSubscription;
Future<int> _remaining;
Future<boo> get hasSubscription => 
  _hasSubscription ?? throw StateError("Call checkIfUserHasSubscription first");  
Future<int> get remaining => 
  _remaining ?? throw StateError("Call checkIfUserHasSubscription first");
Future<void> checkIfUserHasSubscription() async {
  // Maybe: if (hasSubscription != null) return;
  var hasSubscriptionCompleter = Completer<bool>();
  var remainingCompleter = Completer<int>();
  _hasSubscription = hasSubscriptionCompleter.future;
  _remaining = remainingCompleter.future;
  var remainings = await
      CloudFunctions.instance.call(functionName: 'isValid');
  if (remaining == "true") {
    hasSubscriptionCompleter.complete(true);
    remainingCompleter.complete(0); // or never complete it.
  } else {
    hasSubscriptionCompleter.complete(false);
    remainingCompleter.complete(int.parse(remaining));
  }
}
0 голосов
/ 07 февраля 2019

Вместо этого вы можете присвоить Future с вашим результатом:

hasSubscription = Future<bool>.value(true);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...