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