@@ -56,7 +56,6 @@ class BillingClient {
56
56
///
57
57
/// The `onPurchasesUpdated` parameter must not be null.
58
58
BillingClient (PurchasesUpdatedListener onPurchasesUpdated) {
59
- assert (onPurchasesUpdated != null );
60
59
channel.setMethodCallHandler (callHandler);
61
60
_callbacks[kOnPurchasesUpdated] = [onPurchasesUpdated];
62
61
}
@@ -74,8 +73,13 @@ class BillingClient {
74
73
/// Calls
75
74
/// [`BillingClient#isReady()`] (https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#isReady())
76
75
/// to get the ready status of the BillingClient instance.
77
- Future <bool > isReady () async =>
78
- await channel.invokeMethod <bool >('BillingClient#isReady()' );
76
+ Future <bool > isReady () async {
77
+ bool ? ready = await channel.invokeMethod <bool >('BillingClient#isReady()' );
78
+ if (ready == null ) {
79
+ return false ;
80
+ }
81
+ return ready;
82
+ }
79
83
80
84
/// Enable the [BillingClientWrapper] to handle pending purchases.
81
85
///
@@ -100,20 +104,20 @@ class BillingClient {
100
104
/// This triggers the creation of a new `BillingClient` instance in Java if
101
105
/// one doesn't already exist.
102
106
Future <BillingResultWrapper > startConnection (
103
- {@ required
104
- OnBillingServiceDisconnected onBillingServiceDisconnected}) async {
107
+ {required OnBillingServiceDisconnected
108
+ onBillingServiceDisconnected}) async {
105
109
assert (_enablePendingPurchases,
106
110
'enablePendingPurchases() must be called before calling startConnection' );
107
111
List <Function > disconnectCallbacks =
108
112
_callbacks[_kOnBillingServiceDisconnected] ?? = [];
109
113
disconnectCallbacks.add (onBillingServiceDisconnected);
110
- return BillingResultWrapper .fromJson (await channel
114
+ return BillingResultWrapper .fromJson (( await channel
111
115
.invokeMapMethod <String , dynamic >(
112
116
"BillingClient#startConnection(BillingClientStateListener)" ,
113
117
< String , dynamic > {
114
118
'handle' : disconnectCallbacks.length - 1 ,
115
119
'enablePendingPurchases' : _enablePendingPurchases
116
- }));
120
+ }))! ) ;
117
121
}
118
122
119
123
/// Calls
@@ -137,15 +141,15 @@ class BillingClient {
137
141
/// `SkuDetailsParams` as direct arguments instead of requiring it constructed
138
142
/// and passed in as a class.
139
143
Future <SkuDetailsResponseWrapper > querySkuDetails (
140
- {@ required SkuType skuType, @ required List <String > skusList}) async {
144
+ {required SkuType skuType, required List <String > skusList}) async {
141
145
final Map <String , dynamic > arguments = < String , dynamic > {
142
146
'skuType' : SkuTypeConverter ().toJson (skuType),
143
147
'skusList' : skusList
144
148
};
145
- return SkuDetailsResponseWrapper .fromJson (await channel.invokeMapMethod<
149
+ return SkuDetailsResponseWrapper .fromJson (( await channel.invokeMapMethod<
146
150
String , dynamic > (
147
151
'BillingClient#querySkuDetailsAsync(SkuDetailsParams, SkuDetailsResponseListener)' ,
148
- arguments));
152
+ arguments))! ) ;
149
153
}
150
154
151
155
/// Attempt to launch the Play Billing Flow for a given [skuDetails] .
@@ -172,16 +176,16 @@ class BillingClient {
172
176
/// and [the given
173
177
/// accountId](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder.html#setAccountId(java.lang.String)).
174
178
Future <BillingResultWrapper > launchBillingFlow (
175
- {@ required String sku, String accountId}) async {
179
+ {required String sku, String ? accountId}) async {
176
180
assert (sku != null );
177
181
final Map <String , dynamic > arguments = < String , dynamic > {
178
182
'sku' : sku,
179
183
'accountId' : accountId,
180
184
};
181
185
return BillingResultWrapper .fromJson (
182
- await channel.invokeMapMethod <String , dynamic >(
186
+ ( await channel.invokeMapMethod <String , dynamic >(
183
187
'BillingClient#launchBillingFlow(Activity, BillingFlowParams)' ,
184
- arguments));
188
+ arguments))! ) ;
185
189
}
186
190
187
191
/// Fetches recent purchases for the given [SkuType] .
@@ -197,10 +201,11 @@ class BillingClient {
197
201
/// skutype)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchases).
198
202
Future <PurchasesResultWrapper > queryPurchases (SkuType skuType) async {
199
203
assert (skuType != null );
200
- return PurchasesResultWrapper .fromJson (await channel
204
+ return PurchasesResultWrapper .fromJson (( await channel
201
205
.invokeMapMethod <String , dynamic >(
202
- 'BillingClient#queryPurchases(String)' ,
203
- < String , dynamic > {'skuType' : SkuTypeConverter ().toJson (skuType)}));
206
+ 'BillingClient#queryPurchases(String)' , < String , dynamic > {
207
+ 'skuType' : SkuTypeConverter ().toJson (skuType)
208
+ }))! );
204
209
}
205
210
206
211
/// Fetches purchase history for the given [SkuType] .
@@ -218,10 +223,10 @@ class BillingClient {
218
223
/// listener)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchasehistoryasync).
219
224
Future <PurchasesHistoryResult > queryPurchaseHistory (SkuType skuType) async {
220
225
assert (skuType != null );
221
- return PurchasesHistoryResult .fromJson (await channel.invokeMapMethod< String ,
222
- dynamic > (
226
+ return PurchasesHistoryResult .fromJson (( await channel.invokeMapMethod<
227
+ String , dynamic > (
223
228
'BillingClient#queryPurchaseHistoryAsync(String, PurchaseHistoryResponseListener)' ,
224
- < String , dynamic > {'skuType' : SkuTypeConverter ().toJson (skuType)}));
229
+ < String , dynamic > {'skuType' : SkuTypeConverter ().toJson (skuType)}))! ) ;
225
230
}
226
231
227
232
/// Consumes a given in-app product.
@@ -234,15 +239,15 @@ class BillingClient {
234
239
///
235
240
/// This wraps [`BillingClient#consumeAsync(String, ConsumeResponseListener)`] (https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#consumeAsync(java.lang.String,%20com.android.billingclient.api.ConsumeResponseListener))
236
241
Future <BillingResultWrapper > consumeAsync (String purchaseToken,
237
- {String developerPayload}) async {
242
+ {String ? developerPayload}) async {
238
243
assert (purchaseToken != null );
239
- return BillingResultWrapper .fromJson (await channel
244
+ return BillingResultWrapper .fromJson (( await channel
240
245
.invokeMapMethod <String , dynamic >(
241
246
'BillingClient#consumeAsync(String, ConsumeResponseListener)' ,
242
- < String , String > {
247
+ < String , dynamic > {
243
248
'purchaseToken' : purchaseToken,
244
249
'developerPayload' : developerPayload,
245
- }));
250
+ }))! ) ;
246
251
}
247
252
248
253
/// Acknowledge an in-app purchase.
@@ -266,15 +271,15 @@ class BillingClient {
266
271
///
267
272
/// This wraps [`BillingClient#acknowledgePurchase(String, AcknowledgePurchaseResponseListener)`] (https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#acknowledgePurchase(com.android.billingclient.api.AcknowledgePurchaseParams,%20com.android.billingclient.api.AcknowledgePurchaseResponseListener))
268
273
Future <BillingResultWrapper > acknowledgePurchase (String purchaseToken,
269
- {String developerPayload}) async {
274
+ {String ? developerPayload}) async {
270
275
assert (purchaseToken != null );
271
- return BillingResultWrapper .fromJson (await channel.invokeMapMethod< String ,
276
+ return BillingResultWrapper .fromJson (( await channel.invokeMapMethod< String ,
272
277
dynamic > (
273
278
'BillingClient#(AcknowledgePurchaseParams params, (AcknowledgePurchaseParams, AcknowledgePurchaseResponseListener)' ,
274
- < String , String > {
279
+ < String , dynamic > {
275
280
'purchaseToken' : purchaseToken,
276
281
'developerPayload' : developerPayload,
277
- }));
282
+ }))! ) ;
278
283
}
279
284
280
285
/// The method call handler for [channel] .
@@ -283,15 +288,15 @@ class BillingClient {
283
288
switch (call.method) {
284
289
case kOnPurchasesUpdated:
285
290
// The purchases updated listener is a singleton.
286
- assert (_callbacks[kOnPurchasesUpdated].length == 1 );
291
+ assert (_callbacks[kOnPurchasesUpdated]! .length == 1 );
287
292
final PurchasesUpdatedListener listener =
288
- _callbacks[kOnPurchasesUpdated].first;
293
+ _callbacks[kOnPurchasesUpdated]! .first as PurchasesUpdatedListener ;
289
294
listener (PurchasesResultWrapper .fromJson (
290
- call.arguments. cast <String , dynamic >( )));
295
+ Map <String , dynamic >. from (call.arguments )));
291
296
break ;
292
297
case _kOnBillingServiceDisconnected:
293
298
final int handle = call.arguments['handle' ];
294
- await _callbacks[_kOnBillingServiceDisconnected][handle]();
299
+ await _callbacks[_kOnBillingServiceDisconnected]! [handle]();
295
300
break ;
296
301
}
297
302
}
0 commit comments