flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

这篇具有很好参考价值的文章主要介绍了flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

问题1:当你使用FormData.from(Flutter3直接不能用)的时候,可能会提示没有这个方法,或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有,这时候可能就是和get库里面的Formdata冲突了

问题1:The method 'fromMap' isn't defined for the type 'FormData'. (Documentation)  Try correcting the name to the name of an existing method, or defining a method named 'fromMap'

解决办法:有可能是库冲突了,因为get和dio库里面都有FormData导致的,使用别名更换一下

The method 'from' isn't defined for the type 'FormData'. (Documentation)  Try correcting the name to the name of an existing method, or defining a method named 'from' 

解决办法:更换使用 FormData.fromMap 这个方法 FormData.fromMap({})

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata

然后你点击进去这个库的源代码看一下:发现确实没有from或者fromMap方法,而且会默认跳转到get库里面的FormData,怎么回事?我们应该使用的是dio库里面的啊

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata 这个时候就应该意识到是库冲突了,所以单独引入dio库:

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata

这个时候就会报另外一个问题:

The name 'FormData' is defined in the libraries 'package:dio/src/form_data.dart (via package:dio/dio.dart)' and 'package:get/get_connect/http/src/multipart/form_data.dart'. (Documentation)  Try using 'as prefix' for one of the import directives, or hiding the name from all but one of the imports. 

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata 

解决办法

意思是:这个get库和dio库里面都有这个FormData,所以需要使用别名指定一下 

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

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata

然后使用这个前缀来引用:

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata 

      Map<String, String> data = {
        "cardno": system.nfcId.toString(),
        "gender": system.gender.toString(),
        "username": system.nickName.toString(),
        "headpicurl": system.avatar.toString()
      };
      dio_package.FormData formData = dio_package.FormData.fromMap(data);

然后在使用dio发送请求的时候:直接使用post,然后把data放进去就好了(因为dio底层做了判断是不是FormData,是的话,默认会加上contentType)

    var result = await Request()
        .request("/v1/server/nfcadduser", method: DioMethod.post, data: data);
    // 返回数据
    // print("getDetail:$result");
    return result;

dio底层做的判断: 

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata然后服务器就可以接收到这个数据了:

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法,多端开发,flutter,dio,formdata

封装好的Dio对象

我这里封装了一个Request对象:

import 'package:dio/dio.dart';
import 'package:flutter_windows/utils/storeage.dart';

/// 请求方法:枚举类型
enum DioMethod {
  get,
  post,
  put,
  delete,
  patch,
  head,
}

// 创建请求类:封装dio
class Request {
  /// 单例模式
  static Request? _instance;

  // 本地存储对象
  final storage = Storage();

  // 工厂函数:执行初始化
  factory Request() => _instance ?? Request._internal();

  // 获取实例对象时,如果有实例对象就返回,没有就初始化
  static Request? get instance => _instance ?? Request._internal();

  /// Dio实例
  static Dio _dio = Dio();

  // 初始化ip和端口
  String ip = "baseUrl地址";
  int port = 9080;

  /// 初始化
  Request._internal() {
    // 初始化基本选项
      BaseOptions options = BaseOptions(
          baseUrl: 'http://$ip:$port',
          connectTimeout: const Duration(seconds: 3),
          receiveTimeout: const Duration(seconds: 3));
      _instance = this;
      // 初始化dio
      _dio = Dio(options);
      // 添加拦截器
      _dio.interceptors.add(InterceptorsWrapper(
          onRequest: _onRequest, onResponse: _onResponse, onError: _onError));
  }

  // 重置ip地址
  void setIP(String ip) {
    _dio.options.baseUrl = ip;
  }

  /// 请求拦截器
  void _onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    // 对非open的接口的请求参数全部增加userId
    if (!options.path.contains("open")) {
      // options.queryParameters["userId"] = "xxx";
    }
    // 头部添加token
    // options.headers["token"] = "xxx";
    // 更多业务需求
    handler.next(options);
    // super.onRequest(options, handler);
  }

  /// 相应拦截器
  void _onResponse(
      Response response, ResponseInterceptorHandler handler) async {
    // 请求成功是对数据做基本处理
    if (response.statusCode == 200) {
      // 处理成功的响应
      // print("响应结果: $response");
    } else {
      // 处理异常结果
      print("响应异常: $response");
    }
    handler.next(response);
  }

  /// 错误处理: 网络错误等
  void _onError(DioException error, ErrorInterceptorHandler handler) {
    handler.next(error);
  }

  /// 请求类:支持异步请求操作
  Future<T> request<T>(
    String path, {
    DioMethod method = DioMethod.get,
    Map<String, dynamic>? params,
    dynamic data,
    CancelToken? cancelToken,
    Options? options,
    ProgressCallback? onSendProgress,
    ProgressCallback? onReceiveProgress,
  }) async {
    const methodValues = {
      DioMethod.get: 'get',
      DioMethod.post: 'post',
      DioMethod.put: 'put',
      DioMethod.delete: 'delete',
      DioMethod.patch: 'patch',
      DioMethod.head: 'head'
    };
    // 默认配置选项
    options ??= Options(method: methodValues[method]);
    try {
      Response response;
      // 开始发送请求
      response = await _dio.request(path,
          data: data,
          queryParameters: params,
          cancelToken: cancelToken,
          options: options,
          onSendProgress: onSendProgress,
          onReceiveProgress: onReceiveProgress);
      return response.data;
    } on DioException catch (e) {
      // print("发送请求异常: $e");
      rethrow;
    }
  }

  /// 开启日志打印
  /// 需要打印日志的接口在接口请求前 Request.instance?.openLog();
  void openLog() {
    _dio.interceptors
        .add(LogInterceptor(responseHeader: false, responseBody: true));
  }
}

 文章来源地址https://www.toymoban.com/news/detail-803489.html

到了这里,关于flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter dio使用proxyman抓包进行网络调试

    证书 wifi 手机和电脑连上同一个wifi,并且手机wifi使用代理,代理地址为电脑的ip和proxyman设置的监听端口 代码 使用方式 proxyIP 为电脑ip

    2024年02月03日
    浏览(44)
  • flutter2.1升级flutter3.0

    下载最新fluttert版本 for github 升级kotlin版本 及 gradle版本 Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.15. Failed to apply plugin ‘kotlin-android’. [ +4 ms] The current Gradle version 6.7 is not compatible with the Kotlin Gradle plugin. Please use Gradle 6

    2023年04月09日
    浏览(36)
  • 微信小程序接口请求使用formData格式

    参考地址:使用wx.request发送multipart/form-data请求的方法

    2024年02月14日
    浏览(46)
  • 使用纯flutter3.0版本,2个dart文件,搭建ChatGPT简易版聊天客户端程序(含openai与api2d版本)

    使用纯Flutter 3.0版本,仅需2个Dart文件,即可搭建ChatGPT简易版聊天客户端程序(包括OpenAI与API2D版本) 随着人工智能的快速发展,聊天机器人成为了现代社交和客户服务的重要工具。ChatGPT是OpenAI开发的一款基于深度学习的语言模型,能够模拟人类对话,实现智能化的对话交互

    2024年02月07日
    浏览(41)
  • Flutter之dio请求封装

    dio是一个http请求库,功能十分强大,支持Restful API、请求取消、FormData、拦截器等,下面我们对dio进行简单的封装,这样我们在项目中使用时会更顺手,这里还需要配合AndroidStudio的 jsonToDartBeanAction插件配合使用 打开我们的flutter的项目的pubspec.yaml 文件,然后在dependencies 中添加依

    2024年02月14日
    浏览(43)
  • Flutter Dio 库的简单封装

    dio 库Flutter 中是比较流行的网络请求库。 其中在拦截器可以拦截请求,响应以及错误 权限验证:比如接口请求后端返回401未授权时可以跳到登录页,403跳到未授权页面; 异常监控:可以在拦截器处理异常,并且上报到异常监控后台或者发送异常预警消息; 缓存接口:可以对

    2024年02月11日
    浏览(52)
  • flutter dio 请求封装(空安全)

    2024年02月06日
    浏览(56)
  • Flutter之Dio封装+实例(自己梳理)

    https://github.com/cfug/dio/blob/main/dio/README-ZH.md  手动添加到pubspec.yaml: 在终端使用以下命令: dio 是一个强大的 HTTP 网络请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时、自定义适配器、转换器等。 单例模式详见:Flutter之单例模式

    2024年02月08日
    浏览(89)
  • 【Flutter】Dio 强大的Dart/Flutter HTTP客户端

    Dio是一个强大的Dart/Flutter HTTP客户端,支持全局配置、拦截器、FormData、请求取消、文件上传/下载、超时等功能。 首先,

    2024年02月11日
    浏览(46)
  • flutter开发实战-dio文件下载实现

    flutter开发实战-dio文件下载实现 在开发中,需要下载文件,这里使用的是dio dio 是一个强大的 Dart HTTP 请求库,支持全局配置、Restful API、FormData、拦截器、 请求取消、Cookie 管理、文件上传/下载、超时以及自定义适配器等。 在工程中pubspec.yaml引入dio 我们对dio进行封装 文件下

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包