Fix loading indicator showing randomly

This commit is contained in:
Ming Ming 2021-08-05 18:38:43 +08:00
parent b106ec0458
commit aa65c12f7b
3 changed files with 56 additions and 19 deletions

View file

@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:nc_photos/k.dart' as k; import 'package:nc_photos/k.dart' as k;
import 'package:nc_photos/platform/k.dart' as platform_k; import 'package:nc_photos/platform/k.dart' as platform_k;
import 'package:nc_photos/widget/page_changed_listener.dart';
class HorizontalPageViewer extends StatefulWidget { class HorizontalPageViewer extends StatefulWidget {
HorizontalPageViewer({ HorizontalPageViewer({
@ -14,14 +15,9 @@ class HorizontalPageViewer extends StatefulWidget {
HorizontalPageViewerController? controller, HorizontalPageViewerController? controller,
this.viewportFraction = 1, this.viewportFraction = 1,
this.canSwitchPage = true, this.canSwitchPage = true,
this.onPageChanged,
}) : controller = controller ?? HorizontalPageViewerController(), }) : controller = controller ?? HorizontalPageViewerController(),
super(key: key) { super(key: key);
this.controller._pageController = PageController(
initialPage: initialPage,
viewportFraction: viewportFraction,
keepPage: false,
);
}
@override @override
createState() => _HorizontalPageViewerState(); createState() => _HorizontalPageViewerState();
@ -32,13 +28,26 @@ class HorizontalPageViewer extends StatefulWidget {
final HorizontalPageViewerController controller; final HorizontalPageViewerController controller;
final double viewportFraction; final double viewportFraction;
final bool canSwitchPage; final bool canSwitchPage;
final ValueChanged<int>? onPageChanged;
} }
class _HorizontalPageViewerState extends State<HorizontalPageViewer> { class _HorizontalPageViewerState extends State<HorizontalPageViewer> {
@override @override
void initState() { initState() {
super.initState(); super.initState();
_pageFocus.requestFocus(); _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 @override
@ -52,6 +61,12 @@ class _HorizontalPageViewerState extends State<HorizontalPageViewer> {
: _buildContent(context); : _buildContent(context);
} }
@override
dispose() {
widget.controller._pageController.dispose();
super.dispose();
}
Widget _buildWebContent(BuildContext context) { Widget _buildWebContent(BuildContext context) {
assert(platform_k.isWeb); assert(platform_k.isWeb);
// support switching pages with keyboard on web // support switching pages with keyboard on web

View file

@ -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<int>? onPageChanged;
int _prevPage;
}

View file

@ -108,6 +108,9 @@ class _ViewerState extends State<Viewer> {
controller: _viewerController, controller: _viewerController,
viewportFraction: _viewportFraction, viewportFraction: _viewportFraction,
canSwitchPage: _canSwitchPage(), canSwitchPage: _canSwitchPage(),
onPageChanged: (_) {
setState(() {});
},
), ),
_buildBottomAppBar(context), _buildBottomAppBar(context),
_buildAppBar(context), _buildAppBar(context),
@ -340,21 +343,18 @@ class _ViewerState extends State<Viewer> {
ImageViewer.preloadImage(widget.account, nextFile); ImageViewer.preloadImage(widget.account, nextFile);
} }
} }
setState(() {
_pageStates[index]!.hasLoaded = true;
_isViewerLoaded = true;
});
} }
setState(() {
_pageStates[index]!.hasLoaded = true;
_isViewerLoaded = true;
});
} }
void _onVideoLoaded(int index) { void _onVideoLoaded(int index) {
if (_viewerController.currentPage == index && setState(() {
!_pageStates[index]!.hasLoaded) { _pageStates[index]!.hasLoaded = true;
setState(() { _isViewerLoaded = true;
_pageStates[index]!.hasLoaded = true; });
_isViewerLoaded = true;
});
}
} }
void _onVideoPlay() { void _onVideoPlay() {