mod: handle image loading failure

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-11-20 18:34:58 +08:00
parent 70706b902c
commit f9793ad8b6

View File

@@ -16,12 +16,12 @@ import 'package:status_bar_control/status_bar_control.dart';
typedef DoubleClickAnimationListener = void Function(); typedef DoubleClickAnimationListener = void Function();
class ImagePreview extends StatefulWidget { class ImagePreview extends StatefulWidget {
final int? initialPage; final int initialPage;
final List<String>? imgList; final List<String> imgList;
const ImagePreview({ const ImagePreview({
super.key, super.key,
this.initialPage, required this.initialPage,
this.imgList, required this.imgList,
}); });
@override @override
@@ -36,22 +36,24 @@ class _ImagePreviewState extends State<ImagePreview>
Animation<double>? _doubleClickAnimation; Animation<double>? _doubleClickAnimation;
late DoubleClickAnimationListener _doubleClickAnimationListener; late DoubleClickAnimationListener _doubleClickAnimationListener;
List<double> doubleTapScales = <double>[1.0, 2.0]; List<double> doubleTapScales = <double>[1.0, 2.0];
List<String>? imgList; late List<String> _imgList;
int _quality = 80; int _quality = 80;
late List<bool> _thumbList;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
imgList = widget.imgList?.map((url) => url.http2https).toList(); _imgList = widget.imgList.map((url) => url.http2https).toList();
_thumbList = List.generate(_imgList.length, (_) => true);
_quality = _quality =
GStorage.setting.get(SettingBoxKey.previewQuality, defaultValue: 80); GStorage.setting.get(SettingBoxKey.previewQuality, defaultValue: 80);
_previewController.initialPage.value = widget.initialPage!; _previewController.initialPage.value = widget.initialPage;
_previewController.currentPage.value = widget.initialPage! + 1; _previewController.currentPage.value = widget.initialPage + 1;
_previewController.imgList.value = imgList!; _previewController.imgList.value = _imgList;
_previewController.currentImgUrl = imgList![widget.initialPage!]; _previewController.currentImgUrl = _imgList[widget.initialPage];
// animationController = AnimationController( // animationController = AnimationController(
// vsync: this, duration: const Duration(milliseconds: 400)); // vsync: this, duration: const Duration(milliseconds: 400));
setStatusBar(); setStatusBar();
@@ -105,13 +107,13 @@ class _ImagePreviewState extends State<ImagePreview>
dense: true, dense: true,
title: const Text('保存到手机', style: TextStyle(fontSize: 14)), title: const Text('保存到手机', style: TextStyle(fontSize: 14)),
), ),
if (imgList!.length > 1) if (_imgList.length > 1)
ListTile( ListTile(
onTap: () { onTap: () {
Get.back(); Get.back();
DownloadUtils.downloadImg( DownloadUtils.downloadImg(
context, context,
imgList!, _imgList,
); );
}, },
dense: true, dense: true,
@@ -171,10 +173,10 @@ class _ImagePreviewState extends State<ImagePreview>
canScrollPage: (GestureDetails? gestureDetails) => canScrollPage: (GestureDetails? gestureDetails) =>
gestureDetails?.totalScale == null || gestureDetails?.totalScale == null ||
gestureDetails!.totalScale! <= 1.0, gestureDetails!.totalScale! <= 1.0,
itemCount: imgList!.length, itemCount: _imgList.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return ExtendedImage.network( return ExtendedImage.network(
'${imgList![index]}${_quality == 100 ? '' : '@${_quality}q.webp'}', '${_imgList[index]}${_thumbList[index] && _quality != 100 ? '@${_quality}q.webp' : ''}',
fit: BoxFit.contain, fit: BoxFit.contain,
mode: ExtendedImageMode.gesture, mode: ExtendedImageMode.gesture,
handleLoadingProgress: true, handleLoadingProgress: true,
@@ -241,6 +243,14 @@ class _ImagePreviewState extends State<ImagePreview>
], ],
), ),
); );
} else if (state.extendedImageLoadState ==
LoadState.failed) {
WidgetsBinding.instance
.addPostFrameCallback((timeStamp) {
setState(() {
_thumbList[index] = false;
});
});
} }
}, },
initGestureConfigHandler: (ExtendedImageState state) { initGestureConfigHandler: (ExtendedImageState state) {
@@ -280,7 +290,7 @@ class _ImagePreviewState extends State<ImagePreview>
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
imgList!.length > 1 _imgList.length > 1
? Obx( ? Obx(
() => Text.rich( () => Text.rich(
textAlign: TextAlign.center, textAlign: TextAlign.center,
@@ -292,7 +302,7 @@ class _ImagePreviewState extends State<ImagePreview>
text: _previewController.currentPage text: _previewController.currentPage
.toString()), .toString()),
const TextSpan(text: ' / '), const TextSpan(text: ' / '),
TextSpan(text: imgList!.length.toString()), TextSpan(text: _imgList.length.toString()),
]), ]),
), ),
) )