欢迎访问宙启技术站
智能推送

基于Flutter实现图片选择和图片上传

发布时间:2023-05-15 07:29:48

Flutter是Google公司推出的一套移动应用开发框架,其极佳的跨平台能力和丰富的组件库为开发者提供了极大的便利。本文将介绍如何使用Flutter实现图片选择和图片上传功能。

一、实现图片选择

在Flutter中,可以使用image_picker插件来实现图片选择。以下是具体的步骤。

1.在pubspec.yaml文件中添加image_picker依赖。

  dependencies:

    image_picker: ^0.7.3

2.在代码中导入image_picker及相关依赖。

import 'dart:io';

import 'package:flutter/material.dart';

import 'package:image_picker/image_picker.dart';

3.在需要调用图片选择功能的Widget中,添加点击事件,通过ImagePicker.pickImage方法调用图片选择器。

  Future getImage() async {

    var image = await ImagePicker.pickImage(source: ImageSource.gallery);

    setState(() {

      _image = image;

    });

  }

二、实现图片上传

Flutter中实现图片上传的方法与普通的HTTP文件上传相似。以下是具体的步骤。

1.在pubspec.yaml文件中添加http和dio依赖。

  dependencies:

    http: ^0.13.3

    dio: ^4.0.0

其中,http是Flutter自带的HTTP请求库,而dio则是一款更加易用的HTTP请求库。

2.编写上传方法。如果使用http库,上传代码如下:

  _uploadImage() async {

    if (_image == null) return;

    var request = http.MultipartRequest(

      'POST',

      Uri.parse('http://your_upload_url.com'),

    );

    request.files.add(await http.MultipartFile.fromPath('image', _image.path));

    var response = await request.send();

    if (response.statusCode == 200) {

      print('Uploaded!');

    } else {

      print('Failed to upload: ${response.reasonPhrase}');

    }

  }

如果使用dio库,上传代码如下:

  _uploadImage() async {

    if (_image == null) return;

    var formData = dio.FormData.fromMap({

      'image': await dio.MultipartFile.fromFile(_image.path),

    });

    var response = await dio.Dio().post('http://your_upload_url.com', data: formData);

    if (response.statusCode == 200) {

      print('Uploaded!');

    } else {

      print('Failed to upload: ${response.statusMessage}');

    }

  }

以上代码中,需要将image替换为具体的文件参数名,并将http接口地址替换为实际上传地址。

三、完整代码示例

以下是实现图片选择和图片上传的完整代码示例。

import 'dart:io';

import 'package:flutter/material.dart';

import 'package:image_picker/image_picker.dart';

import 'package:http/http.dart' as http;

import 'package:dio/dio.dart' as dio;

class ImageUploadDemo extends StatefulWidget {

  @override

  _ImageUploadDemoState createState() => _ImageUploadDemoState();

}

class _ImageUploadDemoState extends State<ImageUploadDemo> {

  File _image;

  Future getImage() async {

    var image = await ImagePicker.pickImage(source: ImageSource.gallery);

    setState(() {

      _image = image;

    });

  }

  _uploadImage() async {

    if (_image == null) return;

    // 使用http库上传图片

    var request = http.MultipartRequest(

      'POST',

      Uri.parse('http://your_upload_url.com'),

    );

    request.files.add(await http.MultipartFile.fromPath('image', _image.path));

    // 使用dio库上传图片

    // var formData = dio.FormData.fromMap({

    //   'image': await dio.MultipartFile.fromFile(_image.path),

    // });

    // var response = await dio.Dio().post('http://your_upload_url.com', data: formData);

    var response = await request.send();

    if (response.statusCode == 200) {

      print('Uploaded!');

    } else {

      print('Failed to upload: ${response.reasonPhrase}');

    }

  }

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: Text('Image Upload Demo'),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            _image == null

                ? Text('No image selected.')

                : Image.file(

                    _image,

                    height: 200,

                  ),

            SizedBox(height: 20),

            ElevatedButton(

              child: Text('Pick Image'),

              onPressed: getImage,

            ),

            SizedBox(height: 20),

            ElevatedButton(

              child: Text('Upload Image'),

              onPressed: _uploadImage,

            ),

          ],

        ),

      ),

    );

  }

}