我有一个远程异步 Firebase 函数“checkSubscription”,如果用户有有效的订阅,则返回“true”,或者 或“N”,其中N表示用户用完之前剩余的积分数。
为了跟踪完成情况,我在类里面有这两个 future :
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
有什么建议吗?
最佳答案
据我了解,您希望有两个稍后完成的 future。当您调用检查函数时,这些 future 应该立即可用,但只有在获得结果时才能完成。
为此,您应该使用Completer
。
我假设您只调用一次检查函数。如果没有,那么您应该在函数内部的每次调用上创建一个新的完成器,并将 future 存储在可变字段中。
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));
}
}
关于asynchronous - 根据另一个 Future 的结果创建 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54564241/