queryProductDetails method

  1. @override
Future<ProductDetailsResponse> queryProductDetails(
  1. Set<String> identifiers
)

Performs a network query for the details of products available.

Implementation

@override
Future<ProductDetailsResponse> queryProductDetails(
  Set<String> identifiers,
) async {
  List<ProductDetailsResponseWrapper>? productResponses;
  PlatformException? exception;

  try {
    productResponses =
        await Future.wait(<Future<ProductDetailsResponseWrapper>>[
          billingClientManager.runWithClient(
            (BillingClient client) => client.queryProductDetails(
              productList: identifiers
                  .map(
                    (String productId) => ProductWrapper(
                      productId: productId,
                      productType: ProductType.inapp,
                    ),
                  )
                  .toList(),
            ),
          ),
          billingClientManager.runWithClient(
            (BillingClient client) => client.queryProductDetails(
              productList: identifiers
                  .map(
                    (String productId) => ProductWrapper(
                      productId: productId,
                      productType: ProductType.subs,
                    ),
                  )
                  .toList(),
            ),
          ),
        ]);
  } on PlatformException catch (e) {
    exception = e;
    productResponses = <ProductDetailsResponseWrapper>[
      ProductDetailsResponseWrapper(
        billingResult: BillingResultWrapper(
          responseCode: BillingResponse.error,
          debugMessage: e.code,
        ),
        productDetailsList: const <ProductDetailsWrapper>[],
      ),
      ProductDetailsResponseWrapper(
        billingResult: BillingResultWrapper(
          responseCode: BillingResponse.error,
          debugMessage: e.code,
        ),
        productDetailsList: const <ProductDetailsWrapper>[],
      ),
    ];
  }
  final List<ProductDetails> productDetailsList = productResponses
      .expand((ProductDetailsResponseWrapper response) {
        return response.productDetailsList;
      })
      .expand((ProductDetailsWrapper productDetailWrapper) {
        return GooglePlayProductDetails.fromProductDetails(
          productDetailWrapper,
        );
      })
      .toList();

  final Set<String> successIDS = productDetailsList
      .map((ProductDetails productDetails) => productDetails.id)
      .toSet();
  final List<String> notFoundIDS = identifiers
      .difference(successIDS)
      .toList();
  return ProductDetailsResponse(
    productDetails: productDetailsList,
    notFoundIDs: notFoundIDS,
    error: exception == null
        ? null
        : IAPError(
            source: kIAPSource,
            code: exception.code,
            message: exception.message ?? '',
            details: exception.details,
          ),
  );
}