mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-02 06:46:22 +01:00
Fix loading indicator showing randomly
This commit is contained in:
parent
b106ec0458
commit
aa65c12f7b
3 changed files with 56 additions and 19 deletions
|
@ -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
|
||||
|
|
22
lib/widget/page_changed_listener.dart
Normal file
22
lib/widget/page_changed_listener.dart
Normal 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;
|
||||
}
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in a new issue