Flutter图片上传(Dio + Image_picker)

2023-11-09

PS: 图片上传功能在项目中属于很常见的功能,网上也有蛮多图片上传的框架,看的眼花缭乱的。。。最后,本着自己最熟悉的才是最好的原则选择 Flutter Dio,所以项目中用的网络框架也是Flutter Dio ,直接拿来写个简单的demo,也算记录下Flutter踩坑心酸史吧。。。

  • 国际惯例(为了省事没做图片大小限制了。。。)

test.gif


废话不多说了,直接上代码,

  • 先添加两个依赖:

 

dio: any
flutter_picker: ^1.0.11

不熟悉dio的小伙伴可以去看看 Dio

  • 全部应用代码直接贴出来(dio可自行封装,这里只演示极简版)

 

import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:image_picker/image_picker.dart';

class HeadImageUploadPage extends StatefulWidget {
  @override
  _HeadImageUploadPageState createState() => _HeadImageUploadPageState();
}

class _HeadImageUploadPageState extends State<HeadImageUploadPage> {
  File _image;

  Future getImage() async {
    var image = await ImagePicker.pickImage(source: ImageSource.gallery);
    _upLoadImage(image);
    setState(() {
      _image = image;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Example'),
      ),
      body: Center(
        child: _image == null
            ? Text('No image selected.')
            : Image.file(_image),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: getImage,
        tooltip: 'Pick Image',
        child: Icon(Icons.add_a_photo),
      ),
    );
  }

  _upLoadImage(File image) async {
    String path = image.path;
    var name = path.substring(path.lastIndexOf("/") + 1, path.length);
    var suffix = name.substring(name.lastIndexOf(".") + 1, name.length);
    FormData formData = new FormData.from({
      "userId": "10000024",
      "file": new UploadFileInfo(new File(path), name,
          contentType: ContentType.parse("image/$suffix"))
    });

    Dio dio = new Dio();
    var respone = await dio.post<String>("/upload", data: formData);
    if (respone.statusCode == 200) {
      Fluttertoast.showToast(
          msg: "图片上传成功",
          gravity: ToastGravity.CENTER,
          textColor: Colors.grey);
    }
  }
}

 

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

Flutter图片上传(Dio + Image_picker) 的相关文章

随机推荐

  • QT 创建可复用查找、替换对话框

    目录 1 查找对话框的实现 2 Qt中的调色板 palette 3 替换对话框的实现 目标 开发一个可以在不同项目间复用的查找替换对话框 1 查找对话框的实现 查找对话框需求分析 查找文本框中的指定字符串 能够指定查找方向 支持大小写敏感查
  • 随机生成6位的字符串验证码,要求包含数字,大小写字母

    package com cheng import java util Random import java util Scanner public class Demo04 static Scanner sc new Scanner Sys
  • c++类型推导

    类型推导 现代c 类型推导分为三个 一个为模板函数的形参推演 一个为auto的类型推导 一个decltype的类型推导 auto的类型推导是以模板函数的类型推导为基础的 模板函数类型推导 推导过程 模板函数的类型推导 是通过调用表达式即实参
  • openGL之API学习(七十七)glDrawElements

    通过索引方式来绘制几何图元 如果要 glDrawArrays 和 glDrawElements 正确进行绘制的话 必须在之前 调用带有相应参数的 glEnableClientState 方法 glDrawArrays使用的是顶点 而glDr
  • 查看linux centos ftp服务,Centos7开启FTP服务

    一 查看并安装vsftpd 执行以下命令进行查看 vsftpd v 如果没有安装的话就执行以下命令进行安装 yum y install vsftpd 二 配置vsftpd 2 1 取消匿名登陆 修改vsftpd conf文件 vi etc
  • huggingface ,Trainer() 函数是 Transformers 库中用于训练和评估模型的主要接口,Trainer()函数的参数如下:

    model required 待训练的模型 必须是 PyTorch 模型 args required TrainingArguments 对象 包含训练和评估过程的参数 例如训练周期数 学习率 批量大小等 train dataset opt
  • Linux用户空间和内核空间的内存互访

    Linux用户空间和内核空间的内存互访 标签 虚拟内存 安全性 Linux 用户 2012 11 13 15 55 Linux 内存 在 Linux 中 用户内存和内核内存是独立的 在各自的地址空间实现 地址空间是虚拟的 就是说地址是从物理
  • 在导入NVIDIA的apex库时报错 ImportError cannot import name ‘UnencryptedCookieSessionFactoryConfig‘ from

    在导入NVIDIA的apex库时报错 ImportError cannot import name UnencryptedCookieSessionFactoryConfig from pyramid session unknown loc
  • stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1 TIM3 时钟使能 位于低速的APB1总线上 注意 高级定时器是在高速的APB2总线上 RCC APB1PeriphClockCmd RCC APB1Periph TIM3 ENABLE 时钟使能 2 初
  • 自签名SSL证书以及nginx配置https服务

    自签名SSL证书以及nginx配置https服务 服务器SSL的认证流程 单向认证 客户端发起建立HTTPS连接请求 将SSL协议版本的信息发送给服务端 服务器端将本机的公钥证书发送给客户端 客户端读取公钥证书 取出服务端公钥 客户端生成一
  • 如何理解数据库事务?

    目录 今日良言 保持热爱 奔赴山河 一 数据库事务 1 概念 2 使用 3 特性 今日良言 保持热爱 奔赴山河 一 数据库事务 1 概念 事务指逻辑上的一组操作 组成这组操作的各个单元 要么全部成功 要么全部失败 事务能够把多个SQL打包到
  • 【云原生之kubernetes实战】在k8s环境下部署jpress开源网站

    云原生之kubernetes实战 在k8s环境下部署jpress开源网站 一 jpress介绍 1 jpress简介 2 jpress功能 二 检查本地k8s环境 1 检查工作节点状态 2 检查系统pod状态 三 编辑jpress yaml
  • Fiddler抓包工具使用方法(二)手机抓包、设置断点

    抓取手机上的http生成https证书并发送到手机上进行安装 手机需要设置密码 设置如下 手机wifi设置代理 设置过滤抓取固定域名 手机抓取https请求 手机浏览器输入代理IP 8888 进入证书下载界面下载 下载并安装 需要设置锁屏密
  • 菊花链结构信号相关

    1 菊花链拓扑结构 菊花链一词最基本的概念指的是一种由许多菊花串接在一起形成的花环 早期也叫手牵手链接方式 一个人最多只能通过两条手臂牵着另外两个人 相当于一个芯片最多只能通过两段传输线连接到另外的两个芯片上 后来衍变到电子电器工程中菊花链
  • vue中点击按钮跳转到el-table的某个标识位置所在行

    客户需求 每点击一次按钮就跳到el table的具体位置 省的自己滚动找数据 实现思路 通过循环行和列找到标识数据所在行的id 存储到数组里 然后在按钮方法里获取 id 所在行的dom的高度 使用scrollTop方法 id 所在行的dom
  • 什么是二进制8421码?

    8421码 是BCD码的一种 意思是每一个二进制位上的数据对应一个固定的值 只需要把1位置对应的数值相加就能得出该二进制对应的十进制的值 图解如下 及相关二进制快速转换问题
  • VUE生命周期与Ajax前后端调用

    1 VUE的生命周期 VUE中有一整套完整的VUE对象创建 使用 销毁的流程 如果用户需要在某个特定的点 有特殊的需求 可以对VUE对象进行扩展 销毁需要手动销毁
  • 【华为OD机试真题 python】打印任务排序

    题目描述 某个打印机根据打印队列执行打印任务 打印任务分为九个优先级 分别用数字1 9表示 数字越大优先级越高 打印机每次从队列头部取出第一个任务A 然后检查队列余下任务中有没有比A优先级更高的任务 如果有比A优先级高的任务 则将任务A放到
  • Mybatis持久层框架入门及底层逻辑分析

    Mybatis持久层框架入门及底层逻辑分析 关于作者 作者介绍 博客主页 作者主页 简介 JAVA领域优质创作者 一名在校大三学生 在校期间参加各种省赛 国赛 斩获一系列荣誉 关注我 关注我学习资料 文档下载统统都有 每日定时更新文章 励志
  • Flutter图片上传(Dio + Image_picker)

    PS 图片上传功能在项目中属于很常见的功能 网上也有蛮多图片上传的框架 看的眼花缭乱的 最后 本着自己最熟悉的才是最好的原则选择 Flutter Dio 所以项目中用的网络框架也是Flutter Dio 直接拿来写个简单的demo 也算记录