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: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<int>? onPageChanged;
}
class _HorizontalPageViewerState extends State<HorizontalPageViewer> {
@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<HorizontalPageViewer> {
: _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

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,
viewportFraction: _viewportFraction,
canSwitchPage: _canSwitchPage(),
onPageChanged: (_) {
setState(() {});
},
),
_buildBottomAppBar(context),
_buildAppBar(context),
@ -340,21 +343,18 @@ class _ViewerState extends State<Viewer> {
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() {