我有一个远程异步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
有什么建议吗?
答案 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);