Flutter图片展示插件gallery的使用

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

Flutter 图片展示插件 gallery 的使用

介绍

在 Flutter 中,gallery 插件可以用来展示和管理图片。本文将通过一个简单的示例来演示如何使用 gallery 插件。

完整示例代码

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

import 'package:flutter/services.dart';
import 'package:gallery/gallery.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  final _galleryPlugin = Gallery();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息异步处理,因此我们在异步方法中初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用带有 PlatformException 的 try/catch 语句。
    // 我们还处理了消息可能返回 null 的情况。
    try {
      platformVersion = 
          await _galleryPlugin.getPlatformVersion() ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果在异步平台消息还在进行时小部件从树中移除,则我们希望丢弃回复而不是调用
    // setState 来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行于: $_platformVersion\n'),
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的包

    import 'package:flutter/material.dart';
    import 'dart:async';
    
    import 'package:flutter/services.dart';
    import 'package:gallery/gallery.dart';
    

    这些包包括 Flutter 基础库、Dart 异步库、平台通道库以及 gallery 插件。

  2. 主函数

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

    主函数 main 启动应用并设置初始状态。

  3. 创建 MyApp

    class MyApp extends StatefulWidget {
      const MyApp({super.key});
    
      [@override](/user/override)
      State<MyApp> createState() => _MyAppState();
    }
    

    MyApp 是一个状态fulWidget,它负责创建 _MyAppState 状态类。

  4. 创建 _MyAppState

    class _MyAppState extends State<MyApp> {
      String _platformVersion = '未知';
      final _galleryPlugin = Gallery();
    
      [@override](/user/override)
      void initState() {
        super.initState();
        initPlatformState();
      }
    

    _MyAppState 类包含了初始化平台状态的方法 initPlatformState 和一些用于展示平台信息的变量。

  5. 初始化平台状态

    Future<void> initPlatformState() async {
      String platformVersion;
      try {
        platformVersion = 
            await _galleryPlugin.getPlatformVersion() ?? '未知平台版本';
      } on PlatformException {
        platformVersion = '获取平台版本失败。';
      }
    
      if (!mounted) return;
    
      setState(() {
        _platformVersion = platformVersion;
      });
    }
    

    initPlatformState 方法用于获取平台版本,并在状态改变时更新 UI。

  6. 构建应用界面

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: const Text('插件示例应用'),
          ),
          body: Center(
            child: Text('运行于: $_platformVersion\n'),
          ),
        ),
      );
    }
    

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

1 回复

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


当然,以下是如何在Flutter项目中使用gallery(或更常见的图片展示插件如photo_view)来展示图片的示例代码。虽然没有一个名为gallery的官方Flutter插件,但photo_view是一个非常流行的图片放大缩小展示插件,可以满足类似的需求。

首先,你需要在pubspec.yaml文件中添加photo_view依赖:

dependencies:
  flutter:
    sdk: flutter
  photo_view: ^0.14.0  # 请检查最新版本号

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

接下来是一个简单的Flutter应用示例,展示如何使用photo_view来展示图片:

import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart';
import 'package:photo_view/photo_view_gallery.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Photo View Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final List<String> imageUrls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Photo View Gallery Example'),
      ),
      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.push(
                context,
                MaterialPageRoute(
                  builder: (context) => FullScreenImagePage(imageUrl: imageUrls[index]),
                ),
              );
            },
            child: Image.network(
              imageUrls[index],
              fit: BoxFit.cover,
            ),
          );
        },
      ),
    );
  }
}

class FullScreenImagePage extends StatelessWidget {
  final String imageUrl;

  FullScreenImagePage({required this.imageUrl});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Full Screen Image'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () => Navigator.pop(context),
        ),
      ),
      body: Center(
        child: PhotoViewGallery.builder(
          scrollPhysics: BouncingScrollPhysics(),
          builder: (BuildContext context, int index) {
            return PhotoViewGalleryPageOptions(
              imageProvider: NetworkImageWithRetry(imageUrl),
              minScale: PhotoViewComputedScale.contained * 0.8,
              maxScale: PhotoViewComputedScale.covered * 3,
            );
          },
          itemCount: 1,
        ),
      ),
    );
  }
}

// 如果图片加载失败需要重试,可以使用这个自定义的 NetworkImageWithRetry 类
class NetworkImageWithRetry extends StatelessWidget {
  final String url;

  NetworkImageWithRetry(this.url);

  @override
  Widget build(BuildContext context) {
    return FadeInImage.memoryNetwork(
      placeholder: kTransparentImage,
      image: url,
      fit: BoxFit.cover,
      fadeInDuration: 300,
      fadeInCurve: Curves.easeInOut,
    );
  }
}

// 透明占位符图片(1x1像素)
final Uint8List kTransparentImage = Uint8List.fromList(
  List.filled(4, 255).concat([0, 0, 0, 0]).toList(),
);

解释

  1. 依赖添加:在pubspec.yaml中添加photo_view依赖。
  2. 主应用MyAppMyHomePage类定义了一个基本的Flutter应用结构。
  3. 图片网格:在MyHomePage中,使用GridView.builder来显示一个图片网格。
  4. 全屏图片查看:点击网格中的图片时,会导航到一个新的页面FullScreenImagePage,该页面使用PhotoViewGallery.builder来展示全屏图片,并支持缩放和拖动。
  5. 网络图片重试NetworkImageWithRetry是一个自定义的小部件,用于处理网络图片加载失败时的重试逻辑,这里使用FadeInImage.memoryNetwork来实现图片的淡入效果。

这样,你就可以在你的Flutter应用中展示一个图片网格,并且可以通过点击图片来查看全屏并放大缩小的图片了。

回到顶部