@@ -53,10 +53,7 @@ class BillingClient {
5353 bool _enablePendingPurchases = false ;
5454
5555 /// Creates a billing client.
56- ///
57- /// The `onPurchasesUpdated` parameter must not be null.
5856 BillingClient (PurchasesUpdatedListener onPurchasesUpdated) {
59- assert (onPurchasesUpdated != null );
6057 channel.setMethodCallHandler (callHandler);
6158 _callbacks[kOnPurchasesUpdated] = [onPurchasesUpdated];
6259 }
@@ -74,8 +71,11 @@ class BillingClient {
7471 /// Calls
7572 /// [`BillingClient#isReady()`] (https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#isReady())
7673 /// 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+ }
7979
8080 /// Enable the [BillingClientWrapper] to handle pending purchases.
8181 ///
@@ -100,20 +100,21 @@ class BillingClient {
100100 /// This triggers the creation of a new `BillingClient` instance in Java if
101101 /// one doesn't already exist.
102102 Future <BillingResultWrapper > startConnection (
103- {@ required
104- OnBillingServiceDisconnected onBillingServiceDisconnected}) async {
103+ {required OnBillingServiceDisconnected
104+ onBillingServiceDisconnected}) async {
105105 assert (_enablePendingPurchases,
106106 'enablePendingPurchases() must be called before calling startConnection' );
107107 List <Function > disconnectCallbacks =
108108 _callbacks[_kOnBillingServiceDisconnected] ?? = [];
109109 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 > {});
117118 }
118119
119120 /// Calls
@@ -137,15 +138,16 @@ class BillingClient {
137138 /// `SkuDetailsParams` as direct arguments instead of requiring it constructed
138139 /// and passed in as a class.
139140 Future <SkuDetailsResponseWrapper > querySkuDetails (
140- {@ required SkuType skuType, @ required List <String > skusList}) async {
141+ {required SkuType skuType, required List <String > skusList}) async {
141142 final Map <String , dynamic > arguments = < String , dynamic > {
142143 'skuType' : SkuTypeConverter ().toJson (skuType),
143144 'skusList' : skusList
144145 };
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 > {});
149151 }
150152
151153 /// Attempt to launch the Play Billing Flow for a given [skuDetails] .
@@ -172,16 +174,17 @@ class BillingClient {
172174 /// and [the given
173175 /// accountId](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.Builder.html#setAccountId(java.lang.String)).
174176 Future <BillingResultWrapper > launchBillingFlow (
175- {@ required String sku, String accountId}) async {
177+ {required String sku, String ? accountId}) async {
176178 assert (sku != null );
177179 final Map <String , dynamic > arguments = < String , dynamic > {
178180 'sku' : sku,
179181 'accountId' : accountId,
180182 };
181183 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 > {});
185188 }
186189
187190 /// Fetches recent purchases for the given [SkuType] .
@@ -197,10 +200,12 @@ class BillingClient {
197200 /// skutype)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchases).
198201 Future <PurchasesResultWrapper > queryPurchases (SkuType skuType) async {
199202 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 > {});
204209 }
205210
206211 /// Fetches purchase history for the given [SkuType] .
@@ -218,31 +223,34 @@ class BillingClient {
218223 /// listener)`](https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchasehistoryasync).
219224 Future <PurchasesHistoryResult > queryPurchaseHistory (SkuType skuType) async {
220225 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 > {});
225233 }
226234
227235 /// Consumes a given in-app product.
228236 ///
229237 /// Consuming can only be done on an item that's owned, and as a result of consumption, the user will no longer own it.
230238 /// Consumption is done asynchronously. The method returns a Future containing a [BillingResultWrapper] .
231239 ///
232- /// The `purchaseToken` must not be null.
233240 /// The `developerPayload` is the developer data associated with the purchase to be consumed, it defaults to null.
234241 ///
235242 /// 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))
236243 Future <BillingResultWrapper > consumeAsync (String purchaseToken,
237- {String developerPayload}) async {
244+ {String ? developerPayload}) async {
238245 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 > {});
246254 }
247255
248256 /// Acknowledge an in-app purchase.
@@ -261,20 +269,20 @@ class BillingClient {
261269 /// Please refer to [acknowledge] (https://developer.android.com/google/play/billing/billing_library_overview#acknowledge) for more
262270 /// details.
263271 ///
264- /// The `purchaseToken` must not be null.
265272 /// The `developerPayload` is the developer data associated with the purchase to be consumed, it defaults to null.
266273 ///
267274 /// 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))
268275 Future <BillingResultWrapper > acknowledgePurchase (String purchaseToken,
269- {String developerPayload}) async {
276+ {String ? developerPayload}) async {
270277 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 > {});
278286 }
279287
280288 /// The method call handler for [channel] .
@@ -283,15 +291,15 @@ class BillingClient {
283291 switch (call.method) {
284292 case kOnPurchasesUpdated:
285293 // The purchases updated listener is a singleton.
286- assert (_callbacks[kOnPurchasesUpdated].length == 1 );
294+ assert (_callbacks[kOnPurchasesUpdated]! .length == 1 );
287295 final PurchasesUpdatedListener listener =
288- _callbacks[kOnPurchasesUpdated].first;
296+ _callbacks[kOnPurchasesUpdated]! .first as PurchasesUpdatedListener ;
289297 listener (PurchasesResultWrapper .fromJson (
290298 call.arguments.cast <String , dynamic >()));
291299 break ;
292300 case _kOnBillingServiceDisconnected:
293301 final int handle = call.arguments['handle' ];
294- await _callbacks[_kOnBillingServiceDisconnected][handle]();
302+ await _callbacks[_kOnBillingServiceDisconnected]! [handle]();
295303 break ;
296304 }
297305 }
0 commit comments