涉及一个联网应用,少不了http相关的东西了,dio就封装了网络功能.pub里搜索dio,说明也详细,使用简单.
参考了干货官方的示例,我把应用的http修改了,使用dio的.
_GankJsonListPageState里的修改:
loadData() async {
String dataURL = "http://gank.io/api/today";
HttpResponse httpResponse = await HttpClient.instance.get(dataURL);
setState(() {
gankToday = GankToday.fromJson(httpResponse.data);
length = gankToday.beans.length;
print("length:${gankToday.category}, content:${gankToday.items.length}");
});
}
建立一个返回类:
class HttpResponse {
int code;
var data;
bool isSuccess;
HttpResponse(this.data, this.isSuccess, this.code);
}
添加工具类:
class HttpClient {
static HttpClient get instance => _getInstance();
static HttpClient _instance;
Dio dio;
HttpClient._init() {
if (dio == null) {
//dio.interceptors.add(HttpLogInterceptor());
// 或者通过传递一个 `options`来创建dio实例
Options options = new Options(
//baseUrl: "https://www.xx.com/api",
connectTimeout: 5000,
receiveTimeout: 3000);
dio = new Dio();
}
}
static HttpClient _getInstance() {
if (_instance == null) {
_instance = new HttpClient._init();
}
return _instance;
}
Future get(url, {params, header}) async {
///Headers
Map<String, String> headers = HashMap();
if (header != null) {
headers.addAll(header);
}
///Options
Options option = new Options();
option.headers = headers;
option.method = 'get';
//Response response;
//response = await dio.get("/test", options: option);
//print(response.data.toString());
return request(url, options: option);
}
Future post(url, {params, header}) async {
///Headers
Map<String, String> headers = HashMap();
if (header != null) {
headers.addAll(header);
}
///Options
Options option = new Options();
option.headers = headers;
option.method = 'post';
return request(url, options: option);
}
Future postForm(url, {params, header}) async {
FormData formData = new FormData.from({
"name": "wendux",
"age": 25,
//"file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt")
//"file2": new UploadFileInfo(new File("./upload.txt"), "upload2.txt")
});
Response response;
response = await dio.post("/info", data: formData);
}
Future<HttpResponse> request(url, {options, params, header}) async {
Response response;
///dio request
try {
response = await dio.request(url, data: params, options: options);
} on DioError catch (e) {
Response errorResponse = e.response ?? Response();
if (e.type == DioErrorType.CONNECT_TIMEOUT) {
errorResponse.statusCode = 503;
}
return HttpResponse(e.message, false, errorResponse.statusCode);
}
///result
try {
if (response.statusCode == 200 || response.statusCode == 201) {
return HttpResponse(response.data, true, 200);
}
} catch (e) {
print("params:$params, headers:$header");
print("net error:${e.toString()}");
return HttpResponse(e.toString(), false, response.statusCode);
}
print("some error:");
return HttpResponse("net work error", false, response.statusCode);
}
}
这样就完成了,现在的文件是:
.
pub文件:
version: 1.0.0+1
environment:
sdk: ">=2.2.2 <3.0.0"
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.2
english_words: ^3.1.5
json_annotation: 3.0.0
http: 0.12.0+2
cached_network_image: 1.1.1
dio: 2.1.13
dev_dependencies:
flutter_test:
sdk: flutter
json_serializable: 3.2.0