feat(ads): ref-constructed ad/consent/iap providers, single ownership source

This commit is contained in:
2026-06-13 13:57:30 +09:00
parent 6d2ffebb92
commit 539afd1dad
+27
View File
@@ -4,8 +4,11 @@ import '../data/content_repository.dart';
import '../data/save_repository.dart';
import '../data/streak.dart';
import '../game/models/season.dart';
import '../services/ad_service.dart';
import '../services/analytics_service.dart';
import '../services/audio_service.dart';
import '../services/consent_service.dart';
import '../services/iap_service.dart';
import 'ads_notifier.dart';
import 'endless_best_notifier.dart';
import 'game_session_notifier.dart';
@@ -75,6 +78,30 @@ final endlessBestProvider = NotifierProvider<EndlessBestNotifier, int>(
final adsRemovedProvider =
NotifierProvider<AdsRemovedNotifier, bool>(AdsRemovedNotifier.new);
/// Reads ownership live from [adsRemovedProvider]; a mid-session purchase
/// takes effect on the next ad decision without re-wiring.
final adServiceProvider = Provider<AdService>((ref) {
final service = AdService(adsRemoved: () => ref.read(adsRemovedProvider));
ref.onDispose(service.dispose);
return service;
});
final consentServiceProvider = Provider<ConsentService>(
(ref) => ConsentService(ref.read(adServiceProvider)),
);
/// A verified remove_ads purchase/restore grants the entitlement through the
/// notifier (persists + flips state), which AdService and the banner observe.
final iapServiceProvider = Provider<IapService>((ref) {
final service = IapService(
onEntitlementGranted: () =>
ref.read(adsRemovedProvider.notifier).grant(),
);
ref.onDispose(service.dispose);
service.initialize();
return service;
});
final analyticsProvider = Provider<AnalyticsService>(
(ref) => AnalyticsService(DebugAnalyticsBackend()),
);