网络请求
Dio
官方https://github.com/flutterchina/dio
添加依赖
1 | dependencies: |
导入并创建dio实例:
1 | import 'package:dio/dio.dart'; |
设置配置参数
1 | var dio = Dio(BaseOptions( |
示例
发起 GET
请求 :
1 | Response response; |
对于GET
请求我们可以将query参数通过对象来传递,上面的代码等同于:
1 | response=await dio.get("/test",queryParameters:{"id":12,"name":"wendu"}) |
发起一个 POST
请求:
1 | response=await dio.post("/test",data:{"id":12,"name":"wendu"}) |
发起多个并发请求:
1 | response= await Future.wait([dio.post("/info"),dio.get("/token")]); |
下载文件:
1 | response=await dio.download("https://www.google.com/",_savePath); |
发送 FormData:
1 | FormData formData = new FormData.from({ |
如果发送的数据是FormData,则dio会将请求header的contentType
设为“multipart/form-data”。
通过FormData上传多个文件:
1 | FormData formData = new FormData.from({ |
值得一提的是,dio内部仍然使用HttpClient发起的请求,所以代理、请求认证、证书校验等和HttpClient是相同的,我们可以在onHttpClientCreate
回调中设置,例如:
1 | (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) { |
注意,onHttpClientCreate
会在当前dio实例内部需要创建HttpClient时调用,所以通过此回调配置HttpClient会对整个dio实例生效,如果你想针对某个应用请求单独的代理或证书校验策略,可以创建一个新的dio实例即可。
Retrofit For Dart
官网地址https://pub.flutter-io.cn/packages/retrofit
添加依赖
1 | dependencies: |
注意
json_serializable
必须要添加 否则实体类不会自动生成
一般步骤为:
(1) 引入json_annotation,即插入
1 | import 'package:json_annotation/json_annotation.dart'; |
(2) 指定此类的生成代码,
1 | part '类名.g.dart'; |
(3) 添加序列化标注,注意括号
1 | () |
(4) 新建类和属性(字段)以及带参构造方法,注意属性类型。
(5) 添加反序列化和序列化方法fromJson和toJson
即
1 | factory 类名.fromJson(Map<String, dynamic> json) =>_$类名FromJson(json); |
(6) 生成文件
1 | flutter pub run build_runner build |
Mac上已生成文件无法覆盖,可以按如下命令操作
1 | flutter pub run build_runner build --delete-conflicting-outputs |
示例
1 | import 'package:json_annotation/json_annotation.dart'; |
接口
1 | import 'package:retrofit/retrofit.dart'; |
调用
1 | client |
官方示例
1 | "/tasks/{id}") ( |
JSON解析
Dart不支持带有泛型的实体类直接转换。
读取本地JSON文件
比如要读取项目根目录下的assets/person.json
首先要在 pubspec.yaml
中做如下配置:
1 | flutter: |
导入如下几个依赖库:
1 | // 使用该库中的 rootBundle 对象来读取 perosn.json 文件 |
实体类
1 | class Person { |
读取转换
1 | import 'package:flutter/services.dart'; |
JSON和Map互转
添加引用
1 | import 'dart:convert'; |
JSON字符串转Map
1 | Map<String, dynamic> user = JSON.decode(json); |
对象转JSON字符串
1 | String json = JSON.encode(user); |
JSON字符串转Model类
简单对象转换
json
1 | { |
实体类
1 | class Person { |
调用
1 | final jsonMap = json.decode(personJson); |
输出如下
1 | jsonMap runType is _InternalLinkedHashMap<String, dynamic> |
可以看出 json.decode(personJson)
方法返回的类型为 _InternalLinkedHashMap
,意思就是这个 Map 的 key 为 String 类型,而 value 的类型为 dynamic 的,也就是动态的
数组的转换
1 | [ |
实体类
1 | class MemberList { |
调用
1 | List<dynamic> list = json.decode(memberListJson); |
带有数组的对象转换
1 | { |
实体类
1 | class Country { |
调用
1 | Map<String, dynamic> jsonMap = json.decode(countryJson); |
复杂的对象数组嵌套
json
1 | { |
实体
1 | class ClassInfo { |
调用
1 | Map<String, dynamic> jsonMap = json.decode(classInfoJson); |
使用插件生成实体类
FlutterJsonBeanFactory插件
除了上面的方式外,我们还可以使用FlutterJsonBeanFactory插件来辅助生成Bean类。
安装FlutterJsonBeanFactory插件很简单,
以Android Studio为例,
依次选择【Android Studio】->【Settings】->【Plugins】,然后搜索FlutterJsonBeanFactory
插件安装即可
使用方式
在要生成文件的文件夹上右键New
-> dart bean class File from JSON
该插件转换要求JSON的最外层为对象,不能为数组,为数组时无法转换。
在线生成实体类
https://www.psvmc.cn/zjtools/json_dart/index.html
无法抓包
默认Flutter网络请求是无法通过抓包软件抓包的,如果需要抓包按如下配置
1 | import 'package:dio/dio.dart'; |