flutter网络

179 阅读1分钟

准备工作

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");