WGShare.Mobile.Flutter/wgshare/lib/utils/cached_network_img.dart

160 lines
5.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:get/get.dart';
import 'package:photo_view/photo_view.dart';
import 'package:photo_view/photo_view_gallery.dart';
import 'package:wgshare/utils/my_text.dart';
part 'cached_network_img.g.dart';
@hwidget
Widget $theCachedNetworkImage(ImageWidgetBuilder imageBuilder, {required String imageUrl}) {
UseCachedImgRefresh useImgRefsh = UseCachedImgRefresh.use();
return CachedNetworkImage(
key: useImgRefsh.imageKey.value,
cacheKey: imageUrl,
fit: BoxFit.fitWidth,
width: double.infinity,
imageUrl: imageUrl,
imageBuilder: imageBuilder,
// placeholder: (context, url) => const CircularProgressIndicator(),
placeholder: (context, url) => Center(child: SpinKitWave(color: Theme.of(context).primaryColor, size: 50.r)),
errorListener: (e) {
debugPrint('图片报错.............$e');
},
errorWidget: (context, url, error) {
return GestureDetector(
onTap: () => (useImgRefsh.imageKey.value = UniqueKey()),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
'assets/images/test_paper_loading_failed.png',
fit: BoxFit.cover,
),
quickText('加载失败,点击重试', color: const Color.fromRGBO(148, 163, 182, 1), size: 12.sp),
],
),
);
},
);
}
// CachedNetworkImage 重新加载图片
class UseCachedImgRefresh {
ValueNotifier<int> refreshNumber;
ValueNotifier<Key> imageKey;
UseCachedImgRefresh._({required this.refreshNumber, required this.imageKey});
// 工厂构造函数
factory UseCachedImgRefresh.use() {
return UseCachedImgRefresh._(refreshNumber: useState(0), imageKey: useState(UniqueKey()));
}
}
@hwidget
Widget $photoViewGallery(BuildContext context, {int? initIndex, required List<String> urls}) {
var useIndex = useState<int>(initIndex != null && initIndex >= 0 ? initIndex : 0);
var pageController = usePageController();
useEffect(() {
if (initIndex != null && initIndex > 0) Future.delayed(Duration.zero, () => pageController.jumpToPage(initIndex));
return () {};
}, []);
return SizedBox(
width: Get.width / 0.7,
height: Get.height,
// child: PhotoView(imageProvider: NetworkImage(url)),
child: Column(
children: [
Expanded(
child: Stack(
children: [
PhotoViewGallery.builder(
scrollPhysics: const BouncingScrollPhysics(),
backgroundDecoration: const BoxDecoration(),
builder: (BuildContext context, int index) {
return PhotoViewGalleryPageOptions(
imageProvider: NetworkImage(urls[index]),
initialScale: PhotoViewComputedScale.contained,
);
},
itemCount: urls.length,
pageController: pageController,
onPageChanged: (i) {
useIndex.value = i;
},
loadingBuilder: (context, event) {
return Center(
child: SizedBox(
width: 20.r,
height: 20.r,
child: CircularProgressIndicator(
value: event == null ? 0 : (event.cumulativeBytesLoaded / (event.expectedTotalBytes ?? 1)),
),
),
);
},
),
Positioned(
right: 60.w,
top: 60.h,
child: IconButton(
onPressed: () => Navigator.pop(context),
icon: Icon(Icons.close, size: 80.r, color: Colors.white),
),
),
Positioned(
right: 100.w,
bottom: 0.h,
child: quickText("${useIndex.value + 1}", size: 28.sp, color: Colors.white, fontWeight: FontWeight.bold),
),
],
),
),
Container(
height: 200.h,
width: double.infinity,
margin: EdgeInsets.only(bottom: 2.h),
padding: EdgeInsets.symmetric(horizontal: 200.w),
alignment: Alignment.center,
child: ListView.builder(
itemCount: urls.length,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
return InkWell(
onTap: () => pageController.jumpToPage(index),
child: Container(
width: 200.w,
height: 200.h,
margin: EdgeInsets.symmetric(horizontal: 20.w),
decoration: BoxDecoration(
border: index == useIndex.value ? Border.all(color: Colors.white, width: 2) : null,
),
child: $TheCachedNetworkImage(
(_, ImageProvider imageProvider) {
return Image(
image: imageProvider,
fit: BoxFit.fitWidth,
);
},
imageUrl: urls[index],
),
),
);
},
),
),
],
),
);
}