initialize static method

Future<AdsService> initialize({
  1. required AdsKeyProvider keyProvider,
  2. ProChecker? isProUser,
  3. AdsConsentChecker? consentChecker,
  4. AdsSdkInitializer? sdkInitializer,
})

Implementation

static Future<AdsService> initialize({
  required AdsKeyProvider keyProvider,
  ProChecker? isProUser,
  AdsConsentChecker? consentChecker,
  AdsSdkInitializer? sdkInitializer,
}) async {
  // ✅ If already initialized, return.
  if (_instance != null && _instance!._initialized) return _instance!;

  // ✅ Reuse existing instance (even if created via instance getter)
  final service = _instance ?? AdsService._();
  _instance = service;

  if (isProUser != null) service._isProUser = isProUser;
  service._keyProvider = keyProvider;
  service._consentChecker = consentChecker;
  service._sdkInitializer = sdkInitializer ?? () async {
    await MobileAds.instance.initialize();
  };

  // Fetch config
  final fetchedConfig = await keyProvider.getConfig();
  service._consentAllowed = await service._readConsent();
  service._config = service._configWithConsent(fetchedConfig);
  service._retryManager = AdsRetryManager(service._config);

  // Configure connectivity
  AdsConnectivity.configure(
    recheckInterval: service._config.connectivityRecheckInterval,
  );

  if (!service._config.adsEnabled || !service._consentAllowed) {
    // Mark initialized even if ads are disabled — so app won't try re-init
    // loops and, importantly, do not initialize Mobile Ads in no-ad mode.
    service._initialized = true;
    dPrint(
      '🚫 AdsService: ads are currently unavailable (initialized in no-ads mode)',
    );
    return service;
  }

  // Init Mobile Ads only after config and consent have allowed ad access.
  if (!await service._initializeSdkIfNeeded()) {
    service._retryManager = AdsRetryManager(service._config);
    service._initialized = true;
    return service;
  }

  // Mark initialized only after the SDK has initialized successfully.
  service._initialized = true;

  // Create handlers for available types
  service._createHandlers();

  // App-state listening only matters if app-open ads are enabled.
  service._startAppOpenLifecycle();

  // Preload
  if (service._config.preloadEnabled && !service._isProUser()) {
    service._preloadAll();
  }

  dPrint('✅ AdsService initialized: ${service._config.availableAdTypes}');
  return service;
}