From bd012a363e12f3aab613560f5657dd8f26040a38 Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 21 Apr 2026 02:18:24 +0200 Subject: [PATCH] replace global callback with broadcast --- lib/app.dart | 5 ----- lib/globals.dart | 2 -- lib/src/providers/purchases.provider.dart | 4 ++++ lib/src/services/api.service.dart | 5 ++++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 0576e6fd..7699fcf2 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -43,10 +43,6 @@ class _AppState extends State with WidgetsBindingObserver { await setUserPlan(); }; - globalCallbackUpdatePlan = (plan) { - context.read().updatePlan(plan); - }; - unawaited(initAsync()); } @@ -86,7 +82,6 @@ class _AppState extends State with WidgetsBindingObserver { void dispose() { WidgetsBinding.instance.removeObserver(this); globalCallbackConnectionState = ({required isConnected}) {}; - globalCallbackUpdatePlan = (planId) {}; super.dispose(); } diff --git a/lib/globals.dart b/lib/globals.dart index 8c066fa9..a44d104d 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -4,7 +4,6 @@ import 'package:path_provider/path_provider.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/model/json/userdata.dart'; import 'package:twonly/src/services/api.service.dart'; -import 'package:twonly/src/services/subscription.service.dart'; class AppEnvironment { static late final String cacheDir; @@ -38,7 +37,6 @@ void Function({required bool isConnected}) globalCallbackConnectionState = }) {}; void Function() globalCallbackAppIsOutdated = () {}; void Function() globalCallbackNewDeviceRegistered = () {}; -void Function(SubscriptionPlan plan) globalCallbackUpdatePlan = (plan) {}; Map globalUserDataChangedCallBack = {}; diff --git a/lib/src/providers/purchases.provider.dart b/lib/src/providers/purchases.provider.dart index 25cf1508..71e8c04b 100644 --- a/lib/src/providers/purchases.provider.dart +++ b/lib/src/providers/purchases.provider.dart @@ -38,6 +38,8 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { onError: _updateStreamOnError, ); + _planSub = apiService.onPlanUpdated.listen(updatePlan); + loadPurchases(); } @@ -48,6 +50,7 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { late StreamSubscription> _subscription; final InAppPurchase iapConnection = IAPConnection.instance; + late StreamSubscription _planSub; bool _userTriggeredBuyButton = false; void updatePlan(SubscriptionPlan newPlan) { @@ -225,6 +228,7 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { @override void dispose() { + _planSub.cancel(); _subscription.cancel(); super.dispose(); } diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index 45bedd86..e0c62fd4 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -58,6 +58,9 @@ class ApiService { // final String apiHost = kReleaseMode ? 'api.twonly.eu' : 'dev.twonly.eu'; final String apiSecure = kReleaseMode ? 's' : ''; + final _planUpdateController = StreamController.broadcast(); + Stream get onPlanUpdated => _planUpdateController.stream; + bool appIsOutdated = false; bool isAuthenticated = false; @@ -333,7 +336,7 @@ class ApiService { user.subscriptionPlan = authenticated.plan; return user; }); - globalCallbackUpdatePlan(planFromString(authenticated.plan)); + _planUpdateController.add(planFromString(authenticated.plan)); // this was triggered by apiService.ipaPurchase, so call the onAuthenticated again if (isAuthenticated) {