Flutter全屏显示图片插件full_screen_image的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter全屏显示图片插件full_screen_image的使用

full_screen_image 是一个用于在Flutter应用中实现图片全屏显示的插件。它支持通过垂直滚动关闭全屏模式,并且可以与Hero widget结合使用,提供流畅的动画效果。

安装

要在你的项目中使用这个插件,请在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  full_screen_image: any

然后运行 flutter pub get 来安装依赖。

示例代码

以下是一个完整的示例demo,展示了如何使用 full_screen_image 插件来实现不同类型的全屏图片显示。

主要代码

import 'package:flutter/material.dart';
import 'package:full_screen_image/full_screen_image.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  String lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ..."; // 省略部分内容

  Widget fullScreenImage() => FullScreenWidget(
        child: ClipRRect(
          borderRadius: BorderRadius.circular(16),
          child: Image.asset(
            "assets/image1.jpg",
            fit: BoxFit.cover,
          ),
        ),
      );

  Widget fullScreenHeroWidget() => FullScreenWidget(
        child: Hero(
          tag: "customTag",
          child: ClipRRect(
            borderRadius: BorderRadius.circular(16),
            child: Image.asset(
              "assets/image2.jpg",
              fit: BoxFit.cover,
            ),
          ),
        ),
      );

  Widget smallImage() => FullScreenWidget(
        child: Center(
          child: Hero(
            tag: "smallImage",
            child: ClipRRect(
              borderRadius: BorderRadius.circular(16),
              child: Image.asset(
                "assets/image3.jpg",
                fit: BoxFit.cover,
              ),
            ),
          ),
        ),
      );

  Widget customBackgroundColor() => FullScreenWidget(
        backgroundColor: Colors.purple,
        child: Center(
          child: Hero(
            tag: "customBackground",
            child: ClipRRect(
              borderRadius: BorderRadius.circular(16),
              child: Image.asset(
                "assets/image3.jpg",
                fit: BoxFit.cover,
              ),
            ),
          ),
        ),
      );

  Widget nonTransparentWidget() => FullScreenWidget(
        backgroundColor: Colors.purple,
        backgroundIsTransparent: false,
        child: Center(
          child: Hero(
            tag: "nonTransparent",
            child: ClipRRect(
              borderRadius: BorderRadius.circular(16),
              child: Image.asset(
                "assets/image3.jpg",
                fit: BoxFit.cover,
              ),
            ),
          ),
        ),
      );

  Widget customWidget() => FullScreenWidget(
        child: SafeArea(
          child: Card(
            elevation: 4,
            child: Container(
              height: 350,
              padding: const EdgeInsets.all(8.0),
              child: Column(
                children: <Widget>[
                  Hero(
                    tag: "customWidget",
                    child: ClipRRect(
                      borderRadius: BorderRadius.circular(16),
                      child: Image.asset(
                        "assets/image3.jpg",
                        fit: BoxFit.cover,
                      ),
                    ),
                  ),
                  SizedBox(height: 16),
                  Text('Lorem text', style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold)),
                  SizedBox(height: 16),
                  Expanded(child: Text(lorem)),
                ],
              ),
            ),
          ),
        ),
      );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Full screen widget example')),
        body: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              GridView.count(
                primary: false,
                shrinkWrap: true,
                crossAxisCount: 2,
                children: <Widget>[
                  _buildGridItem("Full screen image", fullScreenImage()),
                  _buildGridItem("Full screen image with hero", fullScreenHeroWidget()),
                  _buildGridItem("Small image with hero", smallImage()),
                  _buildGridItem("Custom background", customBackgroundColor()),
                  _buildGridItem("None transparent", nonTransparentWidget()),
                ],
              ),
              _buildListItem("Custom Widget", customWidget()),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildGridItem(String title, Widget widget) {
    return Column(
      children: <Widget>[
        Padding(padding: const EdgeInsets.all(8.0), child: widget),
        ListTile(title: Text(title, textAlign: TextAlign.center)),
      ],
    );
  }

  Widget _buildListItem(String title, Widget widget) {
    return Column(
      children: <Widget>[
        Padding(padding: const EdgeInsets.all(8.0), child: widget),
        ListTile(title: Text(title, textAlign: TextAlign.center)),
      ],
    );
  }
}

说明

  • 全屏显示图片:使用 FullScreenWidget 包裹图片组件,图片将自动进入全屏模式。
  • 带Hero效果的全屏显示:通过 Hero 组件实现平滑过渡效果。
  • 自定义背景颜色:可以通过 backgroundColor 属性设置背景颜色。
  • 非透明背景:通过设置 backgroundIsTransparentfalse 实现非透明背景。
  • 自定义Widget:可以在 FullScreenWidget 中嵌入更复杂的布局。

确保你已经准备好相应的图片资源(如 image1.jpg, image2.jpg, image3.jpg),并将其放置在 assets 目录下,并在 pubspec.yaml 中正确配置。

许可证

该插件使用Apache许可证,详情请参见 LICENSE


更多关于Flutter全屏显示图片插件full_screen_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter全屏显示图片插件full_screen_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 full_screen_image 插件在 Flutter 中实现全屏显示图片的示例代码。

首先,确保你已经在 pubspec.yaml 文件中添加了 full_screen_image 依赖:

dependencies:
  flutter:
    sdk: flutter
  full_screen_image: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

接下来,在你的 Flutter 应用中,你可以按照以下步骤实现全屏显示图片的功能。

1. 导入插件

在你的 Dart 文件中导入 full_screen_image 插件:

import 'package:full_screen_image/full_screen_image.dart';

2. 创建一个简单的 UI 来展示图片并触发全屏显示

下面是一个简单的示例,展示了一个 GridView,点击图片后会全屏显示:

import 'package:flutter/material.dart';
import 'package:full_screen_image/full_screen_image.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'FullScreen Image Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ImageGalleryPage(),
    );
  }
}

class ImageGalleryPage extends StatelessWidget {
  final List<String> imageUrls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg',
    // 添加更多图片URL
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Gallery'),
      ),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          crossAxisSpacing: 4.0,
          mainAxisSpacing: 4.0,
        ),
        itemCount: imageUrls.length,
        itemBuilder: (BuildContext context, int index) {
          return GestureDetector(
            onTap: () {
              Navigator.of(context).push(FullScreenImagePageRoute(
                photoUrls: imageUrls,
                initialIndex: index,
              ));
            },
            child: Image.network(
              imageUrls[index],
              fit: BoxFit.cover,
            ),
          );
        },
      ),
    );
  }
}

class FullScreenImagePageRoute extends MaterialPageRoute<void> {
  final List<String> photoUrls;
  final int initialIndex;

  FullScreenImagePageRoute({
    required this.photoUrls,
    required this.initialIndex,
  }) : super(
          builder: (BuildContext context) => FullScreenImagePage(
            photoUrls: photoUrls,
            initialIndex: initialIndex,
          ),
        );
}

class FullScreenImagePage extends StatelessWidget {
  final List<String> photoUrls;
  final int initialIndex;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: FullScreenImage(
        photoUrls: photoUrls,
        initialPhotoIndex: initialIndex,
        clickCloseIconToExit: true,
        doubleTapToZoom: true,
      ),
    );
  }
}

3. 运行应用

保存文件并运行你的 Flutter 应用。你现在应该能够看到一个图片网格,点击任何一张图片都会全屏显示它。

解释

  • ImageGalleryPage 是一个简单的图片网格页面,每一张图片都可以点击。
  • FullScreenImagePageRoute 是一个自定义的 MaterialPageRoute,用于将全屏图片页面推送到导航堆栈中。
  • FullScreenImagePage 使用 FullScreenImage 组件显示全屏图片,并处理一些基本的全屏图片查看功能(如双击放大、点击关闭图标退出等)。

这个示例展示了如何使用 full_screen_image 插件在 Flutter 应用中实现全屏显示图片的基本功能。你可以根据需要进一步自定义和扩展这个示例。

回到顶部