Asynchronous 基于另一个未来的结果创建未来

Asynchronous 基于另一个未来的结果创建未来,asynchronous,dart,async-await,flutter,Asynchronous,Dart,Async Await,Flutter,我有一个远程异步firebase函数“checkSubscription”,如果用户拥有有效的订阅,它将返回“true”,或者 或“N”,其中N表示用户用完之前剩余的信用数 为了跟踪完成情况,我班上有两个未来: Future<bool> hasSubscription; Future<int> remaining; 此函数返回带有结果的未来 我正在努力解决未来分配两个字段所需类型所需的逻辑问题。 这是我想到的 Future<void> checkIfUser

我有一个远程异步firebase函数“checkSubscription”,如果用户拥有有效的订阅,它将返回“true”,或者 或“N”,其中N表示用户用完之前剩余的信用数

为了跟踪完成情况,我班上有两个未来:

Future<bool> hasSubscription;
Future<int> remaining;
此函数返回带有结果的
未来

我正在努力解决未来分配两个字段所需类型所需的逻辑问题。 这是我想到的

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);
    }
  }
Future checkIfUserHasSubscription()异步{
等待未来remainingS=CloudFunctions.instance
.call(functionName:'isValid');
如果(剩余==“真”)
hasSubscription=true;
否则{
hasSubscription=false;
剩余=int.parse(剩余);
}
}
显然这不起作用,因为我分配的是一个布尔而不是未来


有什么建议吗?

您可以用您的结果指定一个
未来


hasubscription=Future.value(true)

据我所知,您希望有两个在以后完成的期货。这些未来应该在调用check函数时立即可用,但只有在得到结果时才能完成

为此,您应该使用一个
补足符

我假设您只调用一次check函数。如果没有,那么您应该在函数内部的每个调用上创建一个新的完成符,并将未来存储在可变字段中

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));
  }
}
Future\u hasSubscription;
未来(剩余);;
Future get hasSubscription=>
_hasSubscription??抛出StateError(“首先调用checkIfUserHasSubscription”);
未来获得剩余=>
_剩余??抛出StateError(“首先调用checkIfUserHasSubscription”);
Future checkIfUserHasSubscription()异步{
//可能:if(hasubscription!=null)返回;
var hasSubscriptionCompleter=Completer();
var remainingCompleter=Completer();
_hasSubscription=hasSubscriptionCompleter.future;
_剩余=remainingCompleter.future;
var剩余=等待
call(functionName:'isValid');
如果(剩余==“真”){
hasSubscriptionCompleter.complete(true);
remainingCompleter.complete(0);//或永远不完成它。
}否则{
hasSubscriptionCompleter.complete(false);
remainingCompleter.complete(int.parse(剩余));
}
}

为什么不改用
bool
呢?因为我的代码中有很多地方都在等待结果。如果数据类型是Future,我可以简单地:在每个位置等待hasubscription,而不是在结果出现后仔细创建回调来更新每个位置。我只是想知道你是不是用错了。要与
Future一起使用,请参见答案。这不是只有在异步调用完成后才能执行吗?我们的想法是在CloudFunctions.instance.call已经完成之后(因为这样我就可以拥有“完整”bool)同步获得未来。这将在此时设置
bool
,并且该变量等待值的所有调用都将实际触发。
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));
  }
}