Flutter多图裁剪选择插件multi_crop_picker的使用

Flutter多图裁剪选择插件multi_crop_picker的使用

特性

选择并裁剪单个或多个图像。

开始前

在使用此插件之前,需要处理照片权限问题。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下内容:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
iOS

ios/Info.plist 文件中添加以下内容:

<key>NSPhotoLibraryUsageDescription</key>
<string>photo permission required.</string>

使用方法

你可以通过以下代码来选择并裁剪最多3张图片,每张图片的预览高度为屏幕宽度,并且保持1:1的宽高比。

List<Uint8List>? res = await MultiCropPicker.selectMedia(
    context,
    maxLength: 3,
    previewHeight: MediaQuery.of(context).size.width,
    aspectRatio: 1);

完整示例代码

以下是一个完整的示例代码,展示了如何使用 multi_crop_picker 插件来选择并裁剪图片。

import 'dart:typed_data';

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<Uint8List>? photos;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
                onPressed: () async {
                  photos = await MultiCropPicker.selectMedia(context,
                      maxLength: 2,
                      aspectRatio: 1.0,                      
                      previewShowingRatio: 1.0,
                      textColor: Colors.white,
                      backgroundColor: Colors.brown,
                      tagColor: Colors.yellow,
                      loadingWidget: const LoadingCircle(),
                      tagTextColor: Colors.black);
                  setState(() {});
                },
                child: const Text('获取图片')),
            if (photos != null)
              Expanded(child: ListView.builder(
                  itemCount: photos!.length,
                  shrinkWrap: true,
                  itemBuilder: (context, index) {
                    return SizedBox(
                      height: MediaQuery.of(context).size.width,
                      width: MediaQuery.of(context).size.width,
                      child: Image.memory(photos![index]),
                    );
                  }))
          ],
        ),
      ),
    );
  }
}

class LoadingCircle extends StatelessWidget {
  const LoadingCircle(
      {Key? key,
      this.size = 22.0,
      this.backgroudColor = 0x000000,
      this.color = 0xFFFFFDE7})
      : super(key: key);
  final double size;
  final int backgroudColor;
  final int color;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SizedBox(
      width: size,
      height: size,
      child: CircularProgressIndicator(
        strokeWidth: 3,
        backgroundColor: Color(backgroudColor),
        color: Color(color),
      ),
    );
  }
}

更多关于Flutter多图裁剪选择插件multi_crop_picker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多图裁剪选择插件multi_crop_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中multi_crop_picker插件的使用,下面是一个简单的代码示例,展示了如何在Flutter应用中实现多图裁剪和选择功能。

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

dependencies:
  flutter:
    sdk: flutter
  multi_crop_picker: ^3.0.1  # 请检查最新版本号

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

接下来是代码实现部分:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<File> _images = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multi Crop Picker Demo'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: GridView.builder(
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 4.0,
                mainAxisSpacing: 4.0,
              ),
              itemCount: _images.length,
              itemBuilder: (BuildContext context, int index) {
                return Image.file(_images[index]);
              },
            ),
          ),
          ElevatedButton(
            onPressed: _pickImages,
            child: Text('Pick Images'),
          ),
        ],
      ),
    );
  }

  Future<void> _pickImages() async {
    List<Asset> resultList = await MultiCropPicker.pickImages(
      maxImages: 3,
      enableRounding: true,
      aspectPresets: [
        CropAspectRatioPreset.square,
        CropAspectRatioPreset.ratio3x2,
        CropAspectRatioPreset.original,
        CropAspectRatioPreset.ratio4x3,
        CropAspectRatioPreset.ratio16x9
      ],
      androidUiSettings: AndroidUiSettings(
          toolbarTitle: 'Multi Image Picker',
          toolbarColor: Colors.deepOrange,
          toolbarWidgetColor: Colors.white,
          initAspectRatio: CropAspectRatioPreset.original,
          lockAspectRatio: false),
      iosUiSettings: IOSUiSettings(
        minimumAspectRatio: 1.0,
      ),
    );

    if (resultList != null) {
      setState(() {
        _images = resultList.map((Asset asset) => File(asset.path)).toList();
      });
    }
  }
}

代码解释:

  1. 依赖引入:在pubspec.yaml中添加multi_crop_picker依赖。
  2. UI结构:使用ScaffoldColumn布局一个简单的界面,包含一个图片网格和一个按钮。
  3. 图片网格:使用GridView.builder来显示选中的图片。
  4. 按钮点击事件:点击按钮时调用_pickImages方法,使用MultiCropPicker.pickImages来打开图片选择和裁剪界面。
  5. 处理结果:将选中的图片路径转换为File对象并更新到状态中。

注意事项:

  • 确保在AndroidManifest.xmlInfo.plist中添加必要的权限,以便应用可以访问设备存储。
  • multi_crop_picker插件会根据平台不同,提供不同的UI设置,例如AndroidUiSettingsIOSUiSettings,可以根据需求进行自定义。

这个示例提供了一个基础的多图裁剪和选择功能,你可以根据实际需求进一步扩展和优化。

回到顶部