1.開發環境Android studio 3.4.0
2.pubspec.yaml添加依賴如下:
dio: ^3.0.0 # HTTP網絡請求
crypto: ^2.1.3 #加密 md5 sha1 HMAC(i.e. HMAC-MD5, HMAC-SHA1, HMAC-SHA256)等
shared_preferences: ^0.5.0 # 添加sharedPreference依賴
path_provider: ^1.6.5 #文件讀寫
sqflite: ^1.3.0 #數據庫存儲
permission_handler: ^4.1.0 #權限管理
file_picker: ^1.4.3+2 #文件選擇
cached_network_image: ^2.0.0 #圖片選擇
common_utils: ^1.1.3 # 精度
3.網絡請求類
import 'package:common_utils/common_utils.dart';
import 'package:dio/dio.dart';
import 'urls.dart';
class HttpReqUtil {
Dio dio = null;
HttpReqUtil._() {
dio = new Dio();
// 添加攔截器
dio.interceptors
.add(InterceptorsWrapper(onRequest: (RequestOptions options) {
print("\n================== 請求數據 ==========================");
print("url = ${options.uri.toString()}");
print("headers = ${options.headers}");
print("params = ${options.data}");
}, onResponse: (Response response) {
print("\n================== 響應數據 ==========================");
print("code = ${response.statusCode}");
print("data = ${response.data}");
print("\n");
}, onError: (DioError e) {
print("\n================== 錯誤響應數據 ======================");
print("type = ${e.type}");
print("message = ${e.message}");
print("stackTrace = ${e.error}");
print("\n");
}));
}
static HttpReqUtil dbUtils;
static HttpReqUtil getInstance() {
if (null == dbUtils) dbUtils = HttpReqUtil._();
return dbUtils;
}
Future<Response> getData(String url) async {
return await dio.get(url);
}
Future<Response> postForm(String url, Map<String, Object> params) async {
var option = Options(
method: "POST", contentType: "application/x-www-form-urlencoded");
return await dio.post(url, data: params, options: option);
}
Future<Response> postJson(String url, Map<String, Object> params) async {
var option = Options(method: "POST", contentType: "application/json");
return await dio.post(url, data: params, options: option);
}
/**
* 上傳文件
* 注:file是服務端接受的字段字段,如果接受字段不是這個需要修改
*/
Future<Response> uploadFile(String filePath, String fileName) async {
var postData = FormData.fromMap(
{"file": await MultipartFile.fromFile(filePath, filename: fileName)});//file是服務端接受的字段字段,如果接受字段不是這個需要修改
var option = Options(method: "POST", contentType: "multipart/form-data");//上傳文件的content-type 表單
return await dio.post(
UPLOAD_FILE_N,
data: postData,
options: option,
onSendProgress: (int sent, int total) {
print("上傳進度:" +
NumUtil.getNumByValueDouble(sent / total * 100, 2)
.toStringAsFixed(2) +
"%"); //取精度,如:56.45%
},
);
}
/**
* 下載文件
*/
Future<Response> downloadFile(String resUrl, String savePath) async {
//還好我之前寫過服務端代碼,不然我根本沒有相對路勁的概念
return await dio.download(resUrl, savePath,
onReceiveProgress: (int loaded, int total) {
print("下載進度:" +
NumUtil.getNumByValueDouble(loaded / total * 100, 2)
.toStringAsFixed(2) +
"%"); //取精度,如:56.45%
});
}
}
4.調用方式:
login() async {
var pwd = sha1.convert(utf8.encode("11111111"));
HttpReqUtil.getInstance().postForm(LOGIN_N,
{'username': '156564556', 'password': pwd, 'type': 3}).then((result) {
print("返回數據:${result.toString()}");
}).whenComplete(() {
print("請求結束");
}).catchError((err) {
print("請求報錯:" + err.toString());
});
}
uploadFile() async {
//文件選擇 [jpg]格式,可以設置更多,權限問題filepicker會幫你處理
File file = await FilePicker.getFile(
type: FileType.custom, allowedExtensions: ["jpg"]);
print("上傳圖片地址:" + file.path);
var fileName =
file.path.substring(file.path.lastIndexOf("/") + 1, file.path.length);
HttpReqUtil.getInstance().uploadFile(file.path, fileName).then((result) {
print("返回數據:${result.toString()}");
}).whenComplete(() {
print("請求結束");
}).catchError((err) {
print("請求報錯:" + err.toString());
});
}
downloadFile()async{
var resUrl = 'http://static.maintenance.v3m2.ettda.com/files/fd/ec/2c/5ebb52dfca8ab0e479f15457/5ebb52dfca8ab0e479f15457.jpg';
await getTemporaryDirectory().then((result){//獲取臨時存放路徑
HttpReqUtil.getInstance().downloadFile(resUrl, result.path+"/123.jpg");
});
}
5.實現效果