diff --git a/lib/widget/disposable.dart b/lib/widget/disposable.dart new file mode 100644 index 00000000..9b5de956 --- /dev/null +++ b/lib/widget/disposable.dart @@ -0,0 +1,26 @@ +import 'package:flutter/widgets.dart'; + +abstract class Disposable { + void init(State state); + void dispose(State state); +} + +mixin DisposableManagerMixin on State { + @override + initState() { + super.initState(); + for (final d in disposables) { + d.init(this); + } + } + + @override + dispose() { + for (final d in disposables) { + d.dispose(this); + } + super.dispose(); + } + + List get disposables; +} diff --git a/lib/widget/viewer.dart b/lib/widget/viewer.dart index 1a286114..5ebcbf8c 100644 --- a/lib/widget/viewer.dart +++ b/lib/widget/viewer.dart @@ -24,6 +24,7 @@ import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/theme.dart'; import 'package:nc_photos/use_case/remove.dart'; import 'package:nc_photos/widget/animated_visibility.dart'; +import 'package:nc_photos/widget/disposable.dart'; import 'package:nc_photos/widget/horizontal_page_viewer.dart'; import 'package:nc_photos/widget/image_viewer.dart'; import 'package:nc_photos/widget/video_viewer.dart'; @@ -80,16 +81,7 @@ class Viewer extends StatefulWidget { final Album? album; } -class _ViewerState extends State { - @override - void initState() { - super.initState(); - final brightness = Pref.inst().getViewerScreenBrightness(); - if (brightness != null) { - ScreenBrightness.setScreenBrightness(brightness / 100.0); - } - } - +class _ViewerState extends State with DisposableManagerMixin { @override build(BuildContext context) { return AppTheme( @@ -101,13 +93,6 @@ class _ViewerState extends State { ); } - @override - dispose() { - ScreenBrightness.resetScreenBrightness(); - super.dispose(); - SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); - } - Widget _buildContent(BuildContext context) { return GestureDetector( onTap: () { @@ -628,6 +613,11 @@ class _ViewerState extends State { bool _canOpenDetailPane() => !_isZoomed; bool _canZoom() => !_isDetailPaneActive; + final disposables = [ + _ViewerBrightnessController(), + _ViewerSystemUiResetter(), + ]; + var _isShowAppBar = true; var _isShowDetailPane = false; @@ -652,3 +642,30 @@ class _PageState { double? itemHeight; bool hasLoaded = false; } + +/// Control the screen brightness according to the settings +class _ViewerBrightnessController implements Disposable { + @override + init(State state) { + final brightness = Pref.inst().getViewerScreenBrightness(); + if (brightness != null) { + ScreenBrightness.setScreenBrightness(brightness / 100.0); + } + } + + @override + dispose(State state) { + ScreenBrightness.resetScreenBrightness(); + } +} + +/// Make sure the system UI overlay is reset on dispose +class _ViewerSystemUiResetter implements Disposable { + @override + init(State state) {} + + @override + dispose(State state) { + SystemChrome.setEnabledSystemUIOverlays(SystemUiOverlay.values); + } +}