From aa65c12f7ba104fe8b77b23aee8dbd345d518748 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Thu, 5 Aug 2021 18:38:43 +0800 Subject: [PATCH] Fix loading indicator showing randomly --- lib/widget/horizontal_page_viewer.dart | 31 +++++++++++++++++++------- lib/widget/page_changed_listener.dart | 22 ++++++++++++++++++ lib/widget/viewer.dart | 22 +++++++++--------- 3 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 lib/widget/page_changed_listener.dart diff --git a/lib/widget/horizontal_page_viewer.dart b/lib/widget/horizontal_page_viewer.dart index 9501bada..fe80bfc0 100644 --- a/lib/widget/horizontal_page_viewer.dart +++ b/lib/widget/horizontal_page_viewer.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/platform/k.dart' as platform_k; +import 'package:nc_photos/widget/page_changed_listener.dart'; class HorizontalPageViewer extends StatefulWidget { HorizontalPageViewer({ @@ -14,14 +15,9 @@ class HorizontalPageViewer extends StatefulWidget { HorizontalPageViewerController? controller, this.viewportFraction = 1, this.canSwitchPage = true, + this.onPageChanged, }) : controller = controller ?? HorizontalPageViewerController(), - super(key: key) { - this.controller._pageController = PageController( - initialPage: initialPage, - viewportFraction: viewportFraction, - keepPage: false, - ); - } + super(key: key); @override createState() => _HorizontalPageViewerState(); @@ -32,13 +28,26 @@ class HorizontalPageViewer extends StatefulWidget { final HorizontalPageViewerController controller; final double viewportFraction; final bool canSwitchPage; + final ValueChanged? onPageChanged; } class _HorizontalPageViewerState extends State { @override - void initState() { + initState() { super.initState(); _pageFocus.requestFocus(); + + widget.controller._pageController = PageController( + initialPage: widget.initialPage, + viewportFraction: widget.viewportFraction, + keepPage: false, + ); + if (widget.onPageChanged != null) { + widget.controller._pageController.addListener(PageChangedListener( + widget.controller._pageController, + onPageChanged: widget.onPageChanged, + ).call); + } } @override @@ -52,6 +61,12 @@ class _HorizontalPageViewerState extends State { : _buildContent(context); } + @override + dispose() { + widget.controller._pageController.dispose(); + super.dispose(); + } + Widget _buildWebContent(BuildContext context) { assert(platform_k.isWeb); // support switching pages with keyboard on web diff --git a/lib/widget/page_changed_listener.dart b/lib/widget/page_changed_listener.dart new file mode 100644 index 00000000..f3aeeac5 --- /dev/null +++ b/lib/widget/page_changed_listener.dart @@ -0,0 +1,22 @@ +import 'package:flutter/widgets.dart'; + +class PageChangedListener { + PageChangedListener( + this.pageController, { + this.onPageChanged, + }) : _prevPage = pageController.initialPage; + + void call() { + if (pageController.hasClients) { + final page = pageController.page!.round(); + if (page != _prevPage) { + onPageChanged?.call(page); + _prevPage = page; + } + } + } + + final PageController pageController; + final ValueChanged? onPageChanged; + int _prevPage; +} diff --git a/lib/widget/viewer.dart b/lib/widget/viewer.dart index 3f8eb586..0bed9364 100644 --- a/lib/widget/viewer.dart +++ b/lib/widget/viewer.dart @@ -108,6 +108,9 @@ class _ViewerState extends State { controller: _viewerController, viewportFraction: _viewportFraction, canSwitchPage: _canSwitchPage(), + onPageChanged: (_) { + setState(() {}); + }, ), _buildBottomAppBar(context), _buildAppBar(context), @@ -340,21 +343,18 @@ class _ViewerState extends State { ImageViewer.preloadImage(widget.account, nextFile); } } - setState(() { - _pageStates[index]!.hasLoaded = true; - _isViewerLoaded = true; - }); } + setState(() { + _pageStates[index]!.hasLoaded = true; + _isViewerLoaded = true; + }); } void _onVideoLoaded(int index) { - if (_viewerController.currentPage == index && - !_pageStates[index]!.hasLoaded) { - setState(() { - _pageStates[index]!.hasLoaded = true; - _isViewerLoaded = true; - }); - } + setState(() { + _pageStates[index]!.hasLoaded = true; + _isViewerLoaded = true; + }); } void _onVideoPlay() {