From b5d65168fb289bd2d43e3d31f6422adb040a68dc Mon Sep 17 00:00:00 2001 From: Enbiya Olgun <78034913+NBA2K1@users.noreply.github.com> Date: Tue, 22 Apr 2025 00:39:00 +0200 Subject: [PATCH] Fix Exception ``` [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: Bad state: Cannot use "ref" after the widget was disposed. #0 ConsumerStatefulElement._assertNotDisposed (package:flutter_riverpod/src/consumer.dart:550:7) consumer.dart:550 #1 ConsumerStatefulElement.read (package:flutter_riverpod/src/consumer.dart:619:5) consumer.dart:619 #2 _MainScreenState.initState.. (package:mangayomi/modules/main_view/main_screen.dart:70:13) main_screen.dart:70 #3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:410:19) timer_impl.dart:410 #4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:441:5) timer_impl.dart:441 #5 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:194:12) isolate_patch.dart:194 ``` --- lib/modules/main_view/main_screen.dart | 59 ++++++++++++++++++-------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index b64cf99a..d63a2c5e 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -38,6 +38,8 @@ class MainScreen extends ConsumerStatefulWidget { } class _MainScreenState extends ConsumerState { + Timer? _backupTimer; + Timer? _syncTimer; String getHyphenatedUpdatesLabel(String languageCode, String defaultLabel) { switch (languageCode) { case 'de': @@ -63,26 +65,19 @@ class _MainScreenState extends ConsumerState { late String defaultLocation = navigationOrder.first; @override initState() { + super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { context.go(defaultLocation); - Timer.periodic(Duration(minutes: 5), (timer) { - ref.read(checkAndBackupProvider); - }); + _backupTimer = Timer.periodic( + const Duration(minutes: 5), + _onBackupTimerTick, + ); if (autoSyncFrequency != 0) { - final l10n = l10nLocalizations(context)!; - Timer.periodic(Duration(seconds: autoSyncFrequency), (timer) { - try { - ref - .read(syncServerProvider(syncId: 1).notifier) - .startSync(l10n, true); - } catch (e) { - botToast( - "Failed to sync! Maybe the sync server is down. Restart the app to resume auto sync.", - ); - timer.cancel(); - } - }); + _syncTimer = Timer.periodic( + Duration(seconds: autoSyncFrequency), + _onSyncTimerTick, + ); } ref.watch(checkForUpdateProvider(context: context)); @@ -90,8 +85,38 @@ class _MainScreenState extends ConsumerState { ref.watch(fetchAnimeSourcesListProvider(id: null, reFresh: false)); ref.watch(fetchNovelSourcesListProvider(id: null, reFresh: false)); }); + } - super.initState(); + void _onBackupTimerTick(Timer timer) { + if (!mounted) { + timer.cancel(); + return; + } + ref.read(checkAndBackupProvider); + } + + void _onSyncTimerTick(Timer timer) { + if (!mounted) { + timer.cancel(); + return; + } + try { + final l10n = l10nLocalizations(context)!; + ref.read(syncServerProvider(syncId: 1).notifier).startSync(l10n, true); + } catch (e) { + botToast( + "Failed to sync! Maybe the sync server is down. " + "Restart the app to resume auto sync.", + ); + timer.cancel(); + } + } + + @override + void dispose() { + _backupTimer?.cancel(); + _syncTimer?.cancel(); + super.dispose(); } @override