根据另一个未来的结果创造未来

时间:2019-02-06 23:40:13

标签: asynchronous dart async-await flutter

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

要跟踪完成情况,我在班上有这两个前途:

interface ItemClickInterface {
    // method may have any name
    fun doIt(item: EntityCommentItem)
}

@BindingAdapter(
    value = ["commentsAdapter", "scrolledUp", "itemClick", "avatarClick"],
    requireAll = false
)
fun initWithCommentsAdapter(
    view: View,
    commentsAdapter: CommentsAdapter,
    scrolledUp: () -> Unit,            // could have been Runnable!
    itemClick: ItemClickInterface,
    avatarClick: ItemClickInterface
) {
    // Some code here
}

假定这些数据类型不能更改。 远程函数的调用方式如下:

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

此函数返回一个CloudFunctions.instance .call(functionName: 'checkSubscription'); 及其结果。

我正在为为我的两个字段分配所需类型所需的Future逻辑而苦苦挣扎。 这是我想出的

Future<dynamic>

显然这是行不通的,因为我分配的是bool而不是Future

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

据我了解,您希望有两个将来完成的期货。调用检查功能时,这些期货应该立即可用,但只有在获得结果后才可以完成。

为此,您应该使用Completer

我假设您只调用一次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));
  }
}

答案 1 :(得分:0)

您可以将结果分配给Future

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