准备工作
1、添加网络权限
在android项目目录里的AndroidManifest.xml新增网络权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2、添加网络库
dependencies:
dio: ^4.0.6
3、测试
void getHttp() async {
try {
var response = await Dio().get('http://www.baidu.com');
print(response);
} catch (e) {
print(e);
}
}
4、json转实体类
使用工具,首先导入工具库(最新版本可在pub.dev/ 或 github.com/ 查询)
dependencies:
dio: ^4.0.6 #网络
json_annotation: ^4.7.0 #网络,序列化
dev_dependencies:
build_runner: ^2.3.2 #用于执行命令
json_serializable: ^6.5.4 #网络,序列化
json_model: ^1.0.0 #一行命令,将Json文件转为Dart model类。
//json_model的使用:在项目根目录下创建jsons目录.
//在jsons目录下新增json文件,比如loginResult.json
{
"msg":"success",
"code":200,
}
//然后在控制台输入命令:flutter packages pub run json_model
//就会生成对应的实体类文件
网络请求
dio get请求
void getHttp() async {
try {
// var response = await Dio().get('http://www.baidu.com/');
// print(response);
var dio = Dio(BaseOptions(
baseUrl: "https://www.wanandroid.com/",
connectTimeout: 5000,
receiveTimeout: 100000,
headers: {
"api": "1.0.0",
},
contentType: Headers.jsonContentType,
responseType: ResponseType.plain,
));
Response response = await dio.get("/article/list/0/json");
print(response.data);
} catch (e) {
print(e);
}
}
dio pos请求及解析
Response response = await dio.post("login", data: {
"username": "username",
"password": "password",
});
//使用jsonDecode将json字符串转化为map对象,
var result = LoginResult.fromJson(jsonDecode(response.data));
简单封装
目标:如同使用viewmodel请求网络般使用。
3+n个文件:http、api、api_service。
http(基础配置+网络拦截等)
class Http extends DioForNative {
Http() {
options = BaseOptions(
baseUrl: DioConfig.baseUrl,
headers: {
"versionCode": DioConfig.versionCode,
"versionName": DioConfig.versionName,
},
contentType: Headers.jsonContentType,
responseType: ResponseType.plain,
connectTimeout: DioConfig.connectTimeout,
receiveTimeout: DioConfig.receiveTimeout,
);
interceptors.add(InterceptorsWrapper(onRequest: (options, handler) async {
options.headers.addAll({"token": await SharedPreferencesUtil.getData<String>("token")}); //这里添加token
print('request: uri is ${options.uri.toString()} param is ${options.queryParameters.toString()}');
return handler.next(options);
}, onResponse: (response, handler) {
print('result:$response');
handler.next(response);
}, onError: (DioError e, handler) {
print('error:${e.message}');
return handler.next(e);
}));
}
}
api(所有的请求地址)
class Api {
//Prefer using lowerCamelCase for constant names. (Documentation)
//dart提示,将常量的编码格式为小写开头的驼峰式。
static const String baseUrl = "https://www.wanandroid.com/";
static const String login = "${baseUrl}login";
}
api_service(网络请求)
class ApiService {
//登录
static Future login(String account, String password) async {
var response = await http.get(Api.login, queryParameters: {'account': account, 'password': password});
return LoginResult.fromJson(jsonDecode(response.data)).data;
}
//首页
//导航
}
n(使用)
var result = await ApiService.login("imfondof", "password");