123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- import 'dart:io';
- import 'package:flutter/material.dart';
- import 'package:cs_resources/generated/assets.dart';
- import 'package:flutter_hooks/flutter_hooks.dart';
- import 'package:plugin_basic/router/basic_page_router.dart';
- import 'package:router/ext/auto_router_extensions.dart';
- import 'package:router/path/router_path.dart';
- import 'package:shared/utils/screen_util.dart';
- import 'package:widgets/my_load_image.dart';
- import 'package:widgets/my_text_view.dart';
- import 'package:cs_resources/constants/color_constants.dart';
- import 'package:extended_image/extended_image.dart';
- import 'package:hooks_riverpod/hooks_riverpod.dart';
- import 'package:auto_route/auto_route.dart';
- /*
- * 预览的图片的页面,内部使用PageView左右切换
- */
- @RoutePage()
- class PreviewPhotoPage extends HookConsumerWidget {
- final List<String> images;
- final int position;
- const PreviewPhotoPage({
- Key? key,
- required this.images,
- required this.position,
- }) : super(key: key);
- //启动当前页面
- static Future<T?>? startInstance<T>({
- required BuildContext context,
- required List<String> images,
- required int position,
- }) {
- return context.router.push(PreviewPhotoPageRoute(images: images, position: position));
- }
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- final currentIndex = useState<int>(position);
- return Scaffold(
- backgroundColor: ColorConstants.black,
- body: SafeArea(
- bottom: true,
- top: false,
- //真正的 Content 布局
- child: Column(
- children: [
- SizedBox(height: ScreenUtil.getStatusBarH(context)),
- Row(
- children: [
- //间距
- const SizedBox(width: 30),
- Expanded(
- child: MyTextView(
- "${currentIndex.value + 1}/${images.length}",
- textColor: Colors.white,
- fontSize: 18,
- isFontRegular: true,
- textAlign: TextAlign.center,
- ),
- ),
- InkWell(
- onTap: () {
- appRouter.maybePop();
- },
- child: const MyAssetImage(
- Assets.baseLibDialogDeleteIcon,
- width: 14,
- height: 14,
- ),
- ),
- //间距
- const SizedBox(width: 15),
- ],
- ),
- Expanded(
- child: ExtendedImageGesturePageView.builder(
- controller: ExtendedPageController(
- //图片PageView的配置选项
- initialPage: currentIndex.value,
- pageSpacing: 10,
- ),
- itemCount: images.length,
- scrollDirection: Axis.horizontal,
- onPageChanged: (int index) {
- currentIndex.value = index;
- },
- itemBuilder: (BuildContext context, int index) {
- //默认网络加载的占位图
- final Widget placeholder = Container(
- //如果没有设置占位图,使用默认的灰色背景内置Icon小图标
- width: double.infinity,
- height: double.infinity,
- color: ColorConstants.greye0,
- alignment: Alignment.center,
- child: const MyAssetImage(
- Assets.baseLibImageDefaultPlaceholder,
- width: 38,
- height: 32,
- ),
- );
- //区分网络图片和本地图片
- Widget image = images[index].startsWith("http")
- ? ExtendedImage.network(
- images[index],
- fit: BoxFit.contain,
- timeLimit: const Duration(milliseconds: 30000),
- cache: true,
- mode: ExtendedImageMode.gesture,
- loadStateChanged: (ExtendedImageState state) {
- switch (state.extendedImageLoadState) {
- case LoadState.loading:
- return placeholder;
- case LoadState.completed:
- return null;
- case LoadState.failed:
- return placeholder;
- }
- },
- initGestureConfigHandler: (ExtendedImageState state) {
- return GestureConfig(
- // 图片展示的配置选项
- inPageView: true,
- initialScale: 1.0,
- maxScale: 5.0,
- animationMaxScale: 6.0,
- initialAlignment: InitialAlignment.center,
- cacheGesture: false,
- );
- },
- )
- : ExtendedImage.file(
- File(images[index]),
- fit: BoxFit.contain,
- mode: ExtendedImageMode.gesture,
- initGestureConfigHandler: (ExtendedImageState state) {
- return GestureConfig(
- // 图片展示的配置选项
- inPageView: true,
- initialScale: 1.0,
- maxScale: 5.0,
- animationMaxScale: 6.0,
- initialAlignment: InitialAlignment.center,
- cacheGesture: false,
- );
- },
- );
- if (index == currentIndex.value) {
- return Hero(
- // tag: index.toString(),
- tag: "0",
- child: image,
- );
- } else {
- return image;
- }
- },
- )),
- ],
- ),
- ),
- );
- }
- }
|