mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-13 04:56:21 +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: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
|
||||||
|
|
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,
|
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() {
|
||||||
|
|
Loading…
Reference in a new issue