You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter PageView点击图片如何实现全屏查看功能?

实现PageView图片点击全屏预览功能

我用PageView组件展示图片,想实现点击图片时打开全屏查看的功能,请问该怎么实现?我的代码如下:

class BannerItem extends StatelessWidget {
  final AppBanner appBanner;
  const BannerItem({Key? key, required this.appBanner}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(horizontal: 14.0),
      decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(20.0),
          image: DecorationImage(
              image: NetworkImage(appBanner.url), fit: BoxFit.cover)),
    );
  }
}

效果如图:
PageView展示的带圆角图片


实现方案

1. 给图片添加点击触发逻辑

用GestureDetector把原有的Container包裹起来,点击时跳转到全屏预览页面:

修改BannerItem的build方法:

@override
Widget build(BuildContext context) {
  return GestureDetector(
    onTap: () {
      // 跳转至全屏预览页,传入当前图片的URL
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => FullScreenImageViewer(imageUrl: appBanner.url),
        ),
      );
    },
    child: Container(
      margin: EdgeInsets.symmetric(horizontal: 14.0),
      decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(20.0),
          image: DecorationImage(
              image: NetworkImage(appBanner.url), fit: BoxFit.cover)),
    ),
  );
}

2. 编写全屏预览页面

新建一个FullScreenImageViewer组件,实现全屏黑底显示图片,支持点击返回和手势缩放:

class FullScreenImageViewer extends StatelessWidget {
  final String imageUrl;
  const FullScreenImageViewer({Key? key, required this.imageUrl}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: GestureDetector(
        // 点击任意区域返回原页面
        onTap: () => Navigator.pop(context),
        child: Center(
          child: InteractiveViewer(
            // 开启图片缩放、拖动功能
            panEnabled: true,
            scaleEnabled: true,
            child: Image.network(
              imageUrl,
              fit: BoxFit.contain,
            ),
          ),
        ),
      ),
    );
  }
}

3. 进阶:支持多图全屏切换(可选)

如果你的PageView是展示一组图片,可以传递整个图片列表和当前索引,实现全屏时左右滑动切换图片:

修改BannerItem的点击逻辑(需父组件传入图片列表和当前索引)

// 假设父组件持有List<AppBanner> banners列表和currentIndex当前索引
GestureDetector(
  onTap: () {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => FullScreenImageListViewer(
          banners: banners,
          initialIndex: currentIndex,
        ),
      ),
    );
  },
  child: Container(/* 原有代码 */),
)

编写多图全屏预览页面

class FullScreenImageListViewer extends StatefulWidget {
  final List<AppBanner> banners;
  final int initialIndex;
  const FullScreenImageListViewer({
    Key? key,
    required this.banners,
    required this.initialIndex,
  }) : super(key: key);

  @override
  State<FullScreenImageListViewer> createState() => _FullScreenImageListViewerState();
}

class _FullScreenImageListViewerState extends State<FullScreenImageListViewer> {
  late PageController _pageController;

  @override
  void initState() {
    super.initState();
    // 初始化PageController,跳转到当前点击的图片位置
    _pageController = PageController(initialPage: widget.initialIndex);
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: GestureDetector(
        onTap: () => Navigator.pop(context),
        child: PageView.builder(
          controller: _pageController,
          itemCount: widget.banners.length,
          itemBuilder: (context, index) {
            return InteractiveViewer(
              child: Image.network(
                widget.banners[index].url,
                fit: BoxFit.contain,
              ),
            );
          },
        ),
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者st4tic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:45:32