From 4532fb45bf5a73af75e3a5fd45ae70db92a3f636 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sun, 11 Jul 2021 12:48:50 +0800 Subject: [PATCH] Stop showing errors if page is invisible --- lib/widget/home_albums.dart | 14 ++++++---- lib/widget/home_photos.dart | 17 ++++++++---- lib/widget/my_app.dart | 5 ++++ lib/widget/page_visibility_mixin.dart | 40 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 lib/widget/page_visibility_mixin.dart diff --git a/lib/widget/home_albums.dart b/lib/widget/home_albums.dart index a69cfc1b..3179bdb8 100644 --- a/lib/widget/home_albums.dart +++ b/lib/widget/home_albums.dart @@ -28,6 +28,7 @@ import 'package:nc_photos/widget/archive_viewer.dart'; import 'package:nc_photos/widget/dynamic_album_viewer.dart'; import 'package:nc_photos/widget/home_app_bar.dart'; import 'package:nc_photos/widget/new_album_dialog.dart'; +import 'package:nc_photos/widget/page_visibility_mixin.dart'; import 'package:tuple/tuple.dart'; class HomeAlbums extends StatefulWidget { @@ -42,7 +43,8 @@ class HomeAlbums extends StatefulWidget { final Account account; } -class _HomeAlbumsState extends State { +class _HomeAlbumsState extends State + with RouteAware, PageVisibilityMixin { @override initState() { super.initState(); @@ -307,10 +309,12 @@ class _HomeAlbumsState extends State { _transformItems(state.albums); } else if (state is ListAlbumBlocFailure) { _transformItems(state.albums); - SnackBarManager().showSnackBar(SnackBar( - content: Text(exception_util.toUserString(state.exception, context)), - duration: k.snackBarDurationNormal, - )); + if (isPageVisible()) { + SnackBarManager().showSnackBar(SnackBar( + content: Text(exception_util.toUserString(state.exception, context)), + duration: k.snackBarDurationNormal, + )); + } } else if (state is ListAlbumBlocInconsistent) { _reqQuery(); } diff --git a/lib/widget/home_photos.dart b/lib/widget/home_photos.dart index f8b2d5da..211b833d 100644 --- a/lib/widget/home_photos.dart +++ b/lib/widget/home_photos.dart @@ -33,6 +33,7 @@ import 'package:nc_photos/use_case/update_property.dart'; import 'package:nc_photos/widget/album_picker_dialog.dart'; import 'package:nc_photos/widget/home_app_bar.dart'; import 'package:nc_photos/widget/measure.dart'; +import 'package:nc_photos/widget/page_visibility_mixin.dart'; import 'package:nc_photos/widget/photo_list_item.dart'; import 'package:nc_photos/widget/popup_menu_zoom.dart'; import 'package:nc_photos/widget/selectable_item_stream_list_mixin.dart'; @@ -51,7 +52,11 @@ class HomePhotos extends StatefulWidget { } class _HomePhotosState extends State - with WidgetsBindingObserver, SelectableItemStreamListMixin { + with + WidgetsBindingObserver, + SelectableItemStreamListMixin, + RouteAware, + PageVisibilityMixin { @override initState() { super.initState(); @@ -256,10 +261,12 @@ class _HomePhotosState extends State } } else if (state is ScanDirBlocFailure) { _transformItems(state.files); - SnackBarManager().showSnackBar(SnackBar( - content: Text(exception_util.toUserString(state.exception, context)), - duration: k.snackBarDurationNormal, - )); + if (isPageVisible()) { + SnackBarManager().showSnackBar(SnackBar( + content: Text(exception_util.toUserString(state.exception, context)), + duration: k.snackBarDurationNormal, + )); + } } else if (state is ScanDirBlocInconsistent) { _reqQuery(); } diff --git a/lib/widget/my_app.dart b/lib/widget/my_app.dart index d7e35073..d76e30ad 100644 --- a/lib/widget/my_app.dart +++ b/lib/widget/my_app.dart @@ -24,6 +24,10 @@ import 'package:nc_photos/widget/viewer.dart'; class MyApp extends StatefulWidget { @override createState() => _MyAppState(); + + static RouteObserver get routeObserver => _routeObserver; + + static final _routeObserver = RouteObserver(); } class _MyAppState extends State implements SnackBarHandler { @@ -46,6 +50,7 @@ class _MyAppState extends State implements SnackBarHandler { themeMode: Pref.inst().isDarkTheme() ? ThemeMode.dark : ThemeMode.light, initialRoute: Splash.routeName, onGenerateRoute: _onGenerateRoute, + navigatorObservers: [MyApp.routeObserver], scaffoldMessengerKey: _scaffoldMessengerKey, locale: language_util.getSelectedLocale(context), localizationsDelegates: AppLocalizations.localizationsDelegates, diff --git a/lib/widget/page_visibility_mixin.dart b/lib/widget/page_visibility_mixin.dart new file mode 100644 index 00000000..6eb474ba --- /dev/null +++ b/lib/widget/page_visibility_mixin.dart @@ -0,0 +1,40 @@ +import 'package:flutter/widgets.dart'; +import 'package:nc_photos/widget/my_app.dart'; + +mixin PageVisibilityMixin on State, RouteAware { + @override + didChangeDependencies() { + super.didChangeDependencies(); + MyApp.routeObserver.subscribe(this, ModalRoute.of(context)); + } + + @override + dispose() { + MyApp.routeObserver.unsubscribe(this); + super.dispose(); + } + + @override + didPush() { + _isVisible = true; + } + + @override + didPushNext() { + _isVisible = false; + } + + @override + didPop() { + _isVisible = false; + } + + @override + didPopNext() { + _isVisible = true; + } + + bool isPageVisible() => _isVisible; + + var _isVisible = true; +}