From 98e5695f9c77c594a103e9e81128798d41bae46a Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Wed, 01 Apr 2026 18:52:33 +0200
Subject: [PATCH] feat: StoreKit 2 IAP — free tier with 2 sessions and 15min message TTL
---
lib/main.dart | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/lib/main.dart b/lib/main.dart
index 34def81..5bab6bb 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -7,6 +7,7 @@
import 'theme/app_theme.dart';
import 'providers/providers.dart';
import 'services/audio_service.dart';
+import 'services/purchase_service.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -23,10 +24,15 @@
// Initialize audio service
AudioService.init();
+ // Initialize purchase service (loads cached status + starts StoreKit listener)
+ await PurchaseService.instance.initialize();
+
runApp(
ProviderScope(
overrides: [
themeModeProvider.overrideWith((ref) => themeMode),
+ // Seed isProProvider from StoreKit cache so first frame is correct.
+ isProProvider.overrideWith((ref) => PurchaseService.instance.isPro),
],
child: const PAILotApp(),
),
@@ -47,6 +53,18 @@
void initState() {
super.initState();
_router = createRouter();
+ // Keep isProProvider in sync whenever PurchaseService notifies a change.
+ PurchaseService.instance.addListener(_onPurchaseChanged);
+ }
+
+ @override
+ void dispose() {
+ PurchaseService.instance.removeListener(_onPurchaseChanged);
+ super.dispose();
+ }
+
+ void _onPurchaseChanged() {
+ ref.read(isProProvider.notifier).state = PurchaseService.instance.isPro;
}
@override
--
Gitblit v1.3.1