Flutter - 网络请求 dio
详细代码参见Demo
dio 是国人开发的一个网络请求的插件,对http 进行了封装 。同时有中文的文档可以查阅,是比较方便易用的。
pub.dev 地址:
https://github.com/flutterchina/dio/blob/master/README-ZH.md
1、导入 dio 插件
2、导入头
http 里面有get post 请求
dio 也有get 和 post 请求就会冲突报错,所以在引入包的时候就需要加上 as
as 是为了解决方法名冲突的问题!通过重命名 .方法名 调用
import 'package:wechat/tools/http_manager.dart' as http;
import 'package:http/http.dart' as http;
hide 隐藏某个不要导入的方法
show 只导入某些内容
3、pubspec.yaml
name: wechat
description: A new Flutter application.
publish_to: 'none'
version: 1.0.0+1
name 是项目名称
description 项目描述
publish_to 发包位置,默认是pub.dev ‘none’ 是阻止发布
version: 项目版本号
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.3
http: 0.12.1
dio: ^3.0.9
image_picker: ^0.6.7dev_dependencies:
flutter_test:
sdk: flutter
dependencies:
dev_dependencies:
这两个都是放第三方插件的
dependencies 是这里加入的插件,打包发布的时候都会打包进入并发布
dev_dependencies 仅仅在开发调试的时候用,打包的时候并不会放进去
http: 0.12.1 #指定版本
dio: ^3.0.9 #大版本不变的区间写法 相当于‘>=3.0.9 <4.0.0’
#dio: ‘>3.0.9’ # 大于3.0.9
#dio: any #任意版本,很好用到
#dio:“>=3.0.9 <4.0.0”
4、网络请求 dio
import 'dart:async';
import 'dart:io';
import 'dart:isolate';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
void main() {
testDioDemo(); //网络请求
}
// ******************************* 网络请求 ****************************
void testDioDemo() {
dioDemo(); //get请求
dioDemo1(); //下载
}
4.1、 get
//-------------------------------- get请求 -----------------------------
void dioDemo() {
// 1、创建dio 对象
final dio = Dio();
//2、发送请求
dio.get('http://www.baidu.com').then((value) => print(value));
}
get 请求,请求得到的就是百度的HTML
flutter: <!DOCTYPE html><!--STATUS OK-->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球最大的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg"><link rel="dns-prefetch" href="//dss0.bdstatic.com"/><link rel="dns-prefetch" href="//dss1.bdstatic.com"/><link rel="dns-prefetch" href="//ss1.bdstatic.com"/><link rel="dns-prefetch" href="//sp0.baidu.com"/><link rel="dns-prefetch" hre<…>
Debug service listening on ws://127.0.0.1:57662/cW6lCv98F50=/ws
4.2、下载
//-------------------------------- 下载请求 -----------------------------
void dioDemo1() {
// 1、创建dio 对象
final dio = Dio();
// 2、下载数据
final downloadUrl =
'http://pub.idqqimg.com/pc/misc/groupgift/fudao/CourseTeacher_1.3.16.80_DailyBuild.dmg';
// 3、下载存储路径好保存的文件名,如果路径中有不存在的文件夹,会自动创建
String savePath = '/Users/liujilou/Desktop/腾讯课堂.dmg';
// 获取沙盒路径
String savePath2 = Directory.systemTemp.path + '/腾讯课堂.dmg';
print(savePath2);
download1(dio, downloadUrl, savePath);
}
download 里面的 savePath 可以是一个字符串,也可以是一个回调
4.2.1、savePath 字符串
// download 里面的 savePath 可以是一个字符串,也可以是一个回调
// savePath 字符串 --------------------------------------
void download1(Dio dio, String downloadUrl, String savePath) {
dio
.download(downloadUrl, savePath, onReceiveProgress: showDownloadProgress)
.then((value) => print(value))
.whenComplete(() => print('结束了'));
}
4.2.2、savePath 回调
// savePath 回调 --------------------------------------
void download2(Dio dio, String downloadUrl, String savePath) {
// onReceiveProgress 监听进度
dio.download(downloadUrl, (header) {
return savePath;
}, onReceiveProgress: showDownloadProgress);
}
下载的进度
//下载的进度
void showDownloadProgress(int count, int total) {
// toStringAsFixed 取整不要小数
// count 当前下载大小, total 总大小
if (total != -1) {
print((count / total * 100).toStringAsFixed(0) + "%");
}
}
dio的下载使用get 也能实现,但是dio提供的有专门下载同时有下载进度所以就使用功能。