flutter项目中 advance_image_picker 组件使用

2023-11-17

一、说明

Advance_image_picker 是flutter 插件,用于从Android 和 ios 图像库中选择多张图片,使用相机拍摄新照片,并对其进行编辑。

下图为最终效果:
在这里插入图片描述
这里有个bug ,在连续多测按 旋转摄像头时,程序会出现卡顿的情况。

二、使用方式

IOS :
将这些设置添加到 ios/Runner/Info.plist

<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSMicrophoneUsageDescription</key>
<string>Can I use the mic please?</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App need your agree, can visit your album</string>

Android :
在您的android/app/build.gradle文件中将最低 Android sdk 版本更改为 21(或更高)。
将活动和使用权限添加到您的AndroidManifest.xml,就像下一步一样。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vn.weta.freemarimagepickerexample">

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="freemarimagepicker_example"
        android:requestLegacyExternalStorage="true"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name="com.yalantis.ucrop.UCropActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
</manifest>

添加到 pubspec
flutter项目的 pubspec.yaml 中添加依赖:

dependencies:
  advance_image_picker: $latest_version

三、项目代码

最近自己动手做的项目是通过Getx 开发。插件测试代码分为 view 端代码和 controller 端代码,这里一并贴出

view 端代码:


class ImagePickerScreen extends GetView<ImagePickerController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Obx(
          () => Text(
            controller.pageName.value,
            style: TextStyle(
              color: Theme.of(context).appBarTheme.titleTextStyle!.color,
            ),
          ),
        ),
        centerTitle: true,
      ),
      body: _buildBody(context),
    );
  }

  Widget _buildBody(BuildContext context) {
    return SingleChildScrollView(
      child: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            Container(
              child: ElevatedButton(
                onPressed: () {
                  controller.getImages();
                },
                child: Text('上传图标'),
              ),
            ),
            _buildImages(context),
          ],
        ),
      ),
    );
  }

  Widget _buildImages(BuildContext context) {
    return Obx(
      () => GridView.builder(
        itemCount: controller.imgObjs.length,
        shrinkWrap: true,
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 4, mainAxisSpacing: 2),
        itemBuilder: (BuildContext context, int index) {
          return Padding(
            padding: EdgeInsets.all(2),
            child: Image.file(
              File(controller.imgObjs[index]),
              height: 80,
              fit: BoxFit.cover,
            ),
          );
        },
      ),
    );
  }
}

contoller 部分代码:
ApiRepository 用于网络请求 ,这里通过构造器依赖注入。由于测试过程中,没有用到网络请求,这部分省略。

class ImagePickerController extends GetxController
    with GetSingleTickerProviderStateMixin {
  final pageName = "imagePicker".obs;
  final ApiRepository apiRepository;
  late ImagePickerConfigs imageConfig;

  RxList<String> imgObjs = <String>[].obs;

  CommodityAddController({required this.apiRepository});

  @override
  void onInit() {
    imageConfig = ImagePickerConfigs();
    imageConfig.appBarTextColor = Colors.white;
    imageConfig.appBarBackgroundColor = Colors.black54;
    imageConfig.stickerFeatureEnabled = false; // ON/OFF features
    imageConfig.translateFunc = (name, value) => name.tr;
    imageConfig.iconCamera = FontAwesomeIcons.camera;
    imageConfig.doneButtonStyle = DoneButtonStyle.outlinedButton;
    imageConfig.adjustFeatureEnabled = false;
    imageConfig.externalImageEditors['external_image_editor_1'] = EditorParams(
      title: 'external_image_editor_1',
      icon: Icons.edit_rounded,
      onEditorEvent: (
              {required BuildContext context,
              required File file,
              required String title,
              int maxWidth = 1080,
              int maxHeight = 1920,
              int compressQuality = 90,
              ImagePickerConfigs? configs}) async =>
          navigator!.push(
        MaterialPageRoute(
          fullscreenDialog: true,
          builder: (context) => ImageEdit(
              file: file,
              title: title,
              maxWidth: maxWidth,
              maxHeight: maxHeight,
              configs: configs),
        ),
      ),
    );
    imageConfig.imagePreProcessingBeforeEditingEnabled = true;
    imageConfig.filterFeatureEnabled = false;
    imageConfig.imagePreProcessingEnabled = true;
    imageConfig.cropFeatureEnabled = false;

    super.onInit();
  }

  void getImages() async {
    List<ImageObject> objects = await navigator!.push(
      MaterialPageRoute(
        builder: (_) {
          return ImagePicker(maxCount: 5);
        },
      ),
    );
    if (objects.length > 0) {
      imgObjs.addAll(objects.map((e) => e.modifiedPath).toList());
    }
  }
}

四、最后注意事项

ImagePickerConfigs 为imagePicker 配置信息。该插件在弹出图片选择界面后,显示语言默认 英文显示。

imageConfig.translateFunc = (name, value) => name.tr; 用于配置 imagePicker语言国际化。

getx 多语言配置:

  1. 文件结构:
    在这里插入图片描述
  2. 文件内容:

translation_service.dart:

import 'dart:ui';

import 'package:get/get.dart';

import 'en_US.dart';
import 'zh_CN.dart';

class TranslationService extends Translations {
  static Locale? get locale => Get.deviceLocale;
  static final fallbackLocale = Locale('zh', 'CN');
  @override
  Map<String, Map<String, String>> get keys => {
        'zh_CN': zh_CN,
        'en_US': en_US,
      };
}

en_US.dart

const Map<String, String> en_US = {
  'name': 'name',
  'image_picker_camera_title': 'camera',
  'image_picker_album_title': 'album',

  'image_picker_select_button_title': 'select',
  'image_picker_select_images_title': 'selected images count:',
  'image_picker_select_images_guide': 'drag images for sorting list...:',
  'image_picker_exposure_title':'exposure',
  'image_picker_exposure_locked_title':'locked',
  'image_picker_exposure_auto_title':'auto',
};

zh_CN.dart

const Map<String, String> zh_CN = {
  'name': '用户名',
  'image_picker_camera_title': '相机',
  'image_picker_album_title': '相册',
  'image_picker_select_button_title': '确定',
  'image_picker_select_images_title': '已选择:',
  'image_picker_select_images_guide': '拖动图片重新排序:',
  'image_picker_exposure_title': '滤镜',
  'image_picker_exposure_locked_title': '锁定',
  'image_picker_exposure_auto_title': '自动',
  'image_picker_confirm': '确定',
  'image_picker_confirm_delete': '是否要删除这张照片',
  'no': '否',
  'yes': '是',
  'image_picker_exit_without_selecting': '是否要退出而不选择图像?',
  'image_picker_preview_title': '预览',
  'image_picker_image_edit_title': '编辑',
  'image_picker_image_edit_contrast': '对比度',
  'image_picker_image_edit_brightness': '亮度',
  'image_picker_image_edit_saturation': '饱和度',
  'image_picker_image_filter_title': '滤镜',
  'image_picker_confirm_reset_changes': '是否重置更改?',
};

main.dart 中 需要 传递参数给GetMaterialApp来定义语言和翻译。

return GetMaterialApp(
    translations: Messages(), // 你的翻译
    locale: Locale('zh', 'CN'), // 将会按照此处指定的语言翻译
    fallbackLocale: Locale('en', 'US'), // 添加一个回调语言选项,以备上面指定的语言翻译不存在
);

项目中的配置:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter项目中 advance_image_picker 组件使用 的相关文章

随机推荐

  • WPS excel 使用 MAX() 函数为合并单元格自动填充序号编号

    在一些统计表格时会把一些内容使用合并单元格作归类 甚至需要给他们编号 每一个合并后的单元格包括的行数是不规律的 本文对不规律的单元格如何填充序号进行介绍 现有如下表格内容 需要 在 A 列 按照 B 列的功能单元格进行排序 步骤 1 如下图
  • HTML 初识

    前言 HTML的基本骨架 HTML基本骨架是构建网页的最基本的结果 指定文档类型为HTML5 表示整个HTML文档的根元素 包含了与文档相关的设置和定义 如字符编码 标题等
  • 微信支付--调起支付(整理、思路)

    小程序微信支付 小程序支付 public JSONObject minMpPay String reqBody throws Exception 第一步获取prepay id String prepayId WxPayV3Util v3Pa
  • windows线程同步 基础

    windows线程同步 基础 一 用户方式同步 同步速度非常快 互锁函数家族只能在单值上运行 根本无法使线程进入等待状态 可以使用关键代码段使线程进入等待状态 但是只能用这些代码段对单个进程中的线程实施同步 还有 使用关键代码段时 很容易陷
  • 拳王虚拟项目公社:低价电影票怎样赚钱,低价电影票实操赚钱方法

    不管是线上还是线下 资源的交换 讲究的是资源对等 尤其是资源 小白上路 往往没有什么方向感 每天不知道该干嘛 做什么行动有效果 如果看不到希望 特别磨灭一个人内心 这种痛苦是煎熬的 是难以忍受的 拳王虚拟项目公社 低价电影票怎样赚钱 低价电
  • JavaWeb知识梳理(后端部分)

    JavaWeb 静态web资源 如html 页面 指web页面中供人们浏览的数据始终是不变 动态web资源 指web页面中供人们浏览的数据是由程序产生的 不同时间点访问web页面看到的内容各不相同 静态web资源开发技术 HTML CSS
  • mysql存储过程之传递参数

    in 表示传入的参数 in 参数名1 参数类型 in 参数名2 参数类型 delimiter create procedure func in id int begin select from 表 where Id id 查询Id id的信
  • Causal Attention for Vision-Language Tasks Paper: Causal Attention for Vision-Language Tasks个人理解

    Causal Attention for Vision Language Tasks Paper Causal Attention for Vision Language Tasks 传统的视觉语言任务中 如果数据集是长尾分布的 atten
  • 研发效能提升工具插件

    一 代码工具插件 GitHub Copilot https copilot github com GitHub Copilot 是一个基于OpenAI Codex的代码生成器 作为Visual Studio Code VSCode 的扩展提
  • c语言中+ =和=+有什么区别

    点击上方蓝字关注我 了解更多咨询 c语言中 和 有什么区别 区别在于 是简写 a 1就是a a 1 并不是简写 a a直接对a的赋值 符号代表的是正负 完全可以省略不写 即a b其实就是a b 在用C 编程时 我经常混淆 和 前者实际上是我
  • 高度封装的前后端框架-odoo回顾(四):翻译官方教程<<高级B:ACL和记录规则>>

    Advanced B ACL and Record Rules 高级B ACL和记录规则 Warning 警告 This tutorial assumes you have completed the Core Training 这个教程默
  • 集成学习与深度学习 加载模型方法

    1 集成学习 import joblib joblib load model pkl 2 深度学习 用torch自带的load import torch data torch load model pkl error pickle Unpi
  • JDK8 字节码操作

    java字节码技术 1 BCEL 基于汇编 2 ASM 轻量级 3 javassist 性能比发射高 比asm低 使用简单 4 cglib 基于ASM 应用场景 1 动态修改class文件 对类进行增删改 2 aop技术 3 lombok
  • 树、森林与二叉树相互转化

    1 树转换为二叉树 由于二叉树是有序的 为了避免混淆 对于无序树 我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号 将树转换成二叉树的步骤是 1 加线 就是在所有兄弟结点之间加一条连线 2 抹线 就是对树中的每个结点 只保留他与第一
  • 《数字图像处理》学习总结及感悟:第二章数字图像基础(5)数学工具

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 本系列文章记录老猿自学冈萨雷斯 数字图像处理 的感悟和总结 不过估计更新会比较慢 白天要工作 都是晚上抽空学习 学习完一章再回头总结
  • 不小心删除了网络适配器中的无线网卡驱动?

    昨天电脑蓝屏了几次 查了下问题 有人说把win10的网卡重新安装下就好了 结果 我直接把网络适配器的无线网卡驱动给卸载了 就是这个样子 点击卸载后 网络适配器下面没有无线网卡的驱动 电脑也连不了网 还没有网线 驱动精灵就是垃圾 它没有适配我
  • 校招高频必背考点

    2 操作系统 2 1 基础 进程与线程的本质区别 以及各自的使用场景 进程是操作系统资源分配的基本单位 线程是操作系统调度的最小单位 一个进程可以中可以有多个线程 线程依赖于进程存在 进程状态 阻塞 就绪 运行 进程调度算法的特点以及使用场
  • 【分析笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析

    相关信息 硬件平台 全志T507 系统版本 Android 10 Linux 4 9 170 问题描述 PF4 无法通过标准接口设置为中断模式 而 PF1 PF2 PF3 PF5 正常可用 分析过程 一开始以为是引脚被其它驱动占用引起 或者
  • vue路由配置

    import Vue from vue import Router from vue router Vue use Router Note 路由配置项 hidden true 当设置 true 的时候该路由不会再侧边栏出现 如401 log
  • flutter项目中 advance_image_picker 组件使用

    一 说明 Advance image picker 是flutter 插件 用于从Android 和 ios 图像库中选择多张图片 使用相机拍摄新照片 并对其进行编辑 下图为最终效果 这里有个bug 在连续多测按 旋转摄像头时 程序会出现卡