Flutter图片输入字段插件image_field的使用

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

Flutter图片输入字段插件 image_field 的使用

image_field 是一个 Flutter 插件,允许用户在表单中上传和管理图片。它不仅支持强大的图片适应功能,还提供了在上传到服务器之前对小部件进行修改的功能,以及其他许多特性。

截图

wait a moment

特性

  • 最佳结构支持上传到服务器
  • 国际化支持,可以覆盖所有文本
  • 支持多文件上传
  • 可以指定图片上传的数量限制
  • 上传进度显示

使用方法

1. 安装插件

使用 Dart:

$ dart pub add image_field

使用 Flutter:

$ flutter pub add image_field

2. 安装依赖

请阅读 Image Picker 的安装说明,并不要忘记在 iOS 的 Info.plist 和 Android 的 AndroidManifest.xml 中添加必要的键,以防止应用在尝试上传或拍照时崩溃。

3. 实现示例

远程图片上传

以下是一个将图片上传到服务器的示例:

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:image_field/image_field.dart';
import 'package:image_field/linear_progress_indicator_if.dart';
import 'package:image_picker/image_picker.dart';

typedef Progress = Function(double percent);

class UploadRemoteImageForm extends StatefulWidget {
  const UploadRemoteImageForm({super.key, required this.title});
  final String title;

  @override
  State<UploadRemoteImageForm> createState() => _UploadRemoteImageFormState();
}

class _UploadRemoteImageFormState extends State<UploadRemoteImageForm> {
  final _formKey = GlobalKey<FormState>();

  dynamic remoteFiles;

  Future<dynamic> uploadToServer(XFile? file, {Progress? uploadProgress}) async {
    // 实现你的代码,使用 REST API 或其他技术
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 远程图片上传
            ImageField(
              texts: const {
                'fieldFormText': 'Upload to server',
                'titleText': 'Upload to server'
              },
              files: remoteFiles != null
                  ? remoteFiles!.map((image) {
                      return ImageAndCaptionModel(
                          file: image, caption: image.alt.toString());
                    }).toList()
                  : [],
              remoteImage: true,
              onUpload: (pickedFile, ControllerLinearProgressIndicatorIF? controllerLinearProgressIndicator) async {
                dynamic fileUploaded = await uploadToServer(
                  pickedFile,
                  uploadProgress: (percent) {
                    var uploadProgressPercentage = percent / 100;
                    controllerLinearProgressIndicator?.updateProgress(uploadProgressPercentage);
                  },
                );
                return fileUploaded;
              },
              onSave: (List<ImageAndCaptionModel>? imageAndCaptionList) {
                remoteFiles = imageAndCaptionList;
              },
            ),
          ],
        ),
      ),
    );
  }
}

本地图片上传

以下是一个将图片本地保存的示例:

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

class UploadLocalImageForm extends StatefulWidget {
  const UploadLocalImageForm({super.key, required this.title});

  final String title;

  @override
  State<UploadLocalImageForm> createState() => _UploadLocalImageFormState();
}

class _UploadLocalImageFormState extends State<UploadLocalImageForm> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 其他表单字段
            // ...

            // 本地图片上传
            ImageField(
              onSave: (List<ImageAndCaptionModel>? imageAndCaptionList) {
                // 你可以将 imageAndCaptionList 保存到本地存储或简单变量中
              },
            ),
          ],
        ),
      ),
    );
  }
}

主要参数

参数 类型 描述
files List 用于在加载时添加默认图片
remoteImage bool 用于远程上传图片,如果为 true,则需要实现 onUpload() 函数
texts Map<String, String> 用于国际化或覆盖 ImageField 默认文本的键值对
multipleUpload bool 是否允许用户选择多个文件
enabledCaption bool 是否允许用户为图片添加描述
cardinality int 可以上传的最大文件数量

主要函数

函数 参数 描述
onUpload dynamic Function(dynamic, ControllerLinearProgressIndicatorIF?)? 该函数接收用户上传的图片数据和 controllerLinearProgressIndicator,用于指示上传进度,并返回结果存储在 fileList
onSave void Function(List<ImageAndCaptionModel>?) 用于更新表单中的已上传文件,当从列表视图返回时调用
alterFieldForm Widget Function(List<ImageAndCaptionModel>?) 用于在渲染前修改表单中的字段(缩略图列表)的小部件

许可证

此包遵循 MIT License

希望这些信息对你有帮助!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter中使用image_field插件来创建一个图片输入字段的示例代码。image_field是一个方便用户选择并上传图片的Flutter插件。

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

dependencies:
  flutter:
    sdk: flutter
  image_field: ^x.y.z  # 请将x.y.z替换为当前最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下示例代码来使用image_field插件:

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

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

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

class ImageFieldScreen extends StatefulWidget {
  @override
  _ImageFieldScreenState createState() => _ImageFieldScreenState();
}

class _ImageFieldScreenState extends State<ImageFieldScreen> {
  File? _selectedImage;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Field Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ImageField(
              // 初始化显示的图片,如果为空则显示占位符
              initialImage: _selectedImage,
              // 图片选择后的回调
              onImageSelected: (File? image) {
                setState(() {
                  _selectedImage = image;
                });
              },
              // 图片移除后的回调
              onImageRemoved: () {
                setState(() {
                  _selectedImage = null;
                });
              },
              // 图片裁剪配置(可选)
              cropConfig: CropConfig(
                aspectRatioPresets: [
                  CropAspectRatioPreset.square,
                  CropAspectRatioPreset.ratio3x2,
                  CropAspectRatioPreset.original,
                  CropAspectRatioPreset.ratio4x3,
                  CropAspectRatioPreset.ratio16x9
                ],
                androidUiSettings: AndroidUiSettings(
                  toolbarTitle: 'Crop Image',
                  toolbarColor: Colors.deepPurple,
                  toolbarWidgetColor: Colors.white,
                  initAspectRatio: CropAspectRatioPreset.original,
                  lockAspectRatio: false,
                ),
                iosUiSettings: IOSUiSettings(
                  minimumAspectRatio: 1.0,
                ),
              ),
              // 其他可选参数
              // maxHeight: 1000,
              // maxWidth: 1000,
              // compressionQuality: 90,
              // accept: ['image/jpeg', 'image/png'],
              // 其他UI参数,比如按钮文本、占位符等
              placeholder: Text('Select or take a picture'),
              buttonText: Text('Choose'),
            ),
            if (_selectedImage != null) ...[
              SizedBox(height: 16),
              Image.file(
                _selectedImage!,
                width: double.infinity,
                fit: BoxFit.cover,
              ),
            ],
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何使用image_field插件来创建一个图片输入字段,允许用户选择或拍摄图片,并在选择后显示该图片。当用户选择图片后,_selectedImage状态会被更新,并在页面上显示选中的图片。如果用户点击移除按钮,图片会被移除并重置为占位符。

请确保你替换了image_field的版本号为你需要的最新版本,并根据你的需求调整其他可选参数。

回到顶部