Flutter-OH 网络请求功能实现与 http 库集成全流程
本次为 Flutter 鸿蒙工程集成了网络请求能力,选择了 Flutter 官方轻量网络库http进行适配,实现了数据接口的请求与列表渲染,过程中解决了鸿蒙网络权限、跨域请求等关键问题。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
前言
环境搭建完成后,第一个核心功能就是网络请求,这是所有数据类应用的基础。Flutter 鸿蒙端的网络请求和安卓端逻辑基本一致,但需要注意鸿蒙端的权限配置和库的兼容性问题,很多安卓端能用的库,在鸿蒙端需要做少量适配才能正常运行。
本文将完整记录 Flutter 鸿蒙应用的网络请求功能开发全流程,从 http 库选型、依赖引入、请求封装、接口实现到数据解析和测试,每一步都附带完整可复用的代码,全程以功能实现为核心,帮大家快速完成网络模块的开发。
一、http 库选型与依赖引入
Flutter 开发最常用的网络库是 dio,也是目前对鸿蒙端兼容性最好的网络库,功能完整、性能稳定,支持拦截器、取消请求、文件上传下载等所有常用功能。
1.1 依赖引入
在工程的依赖配置文件中添加 dio 库的依赖,推荐使用 5.0 + 的稳定版本,兼容性最好:
dependencies:
flutter:
sdk: flutter
dio: ^5.4.0
添加完成后执行依赖拉取命令:
flutter pub get
1.2 网络权限配置
鸿蒙应用进行网络请求必须配置网络权限,在鸿蒙模块配置文件中添加网络访问权限,否则会出现请求失败的问题。
二、网络请求基础封装
为了方便后续使用和统一管理,我们对 dio 进行基础封装,统一配置基础地址、超时时间、请求头和拦截器。
2.1 基础配置类创建
创建网络请求配置类,统一配置全局参数:
import 'package:dio/dio.dart';
class HttpConfig {
// 基础请求地址
static const String baseUrl = "https://api.example.com";
// 连接超时时间
static const int connectTimeout = 10000;
// 响应超时时间
static const int receiveTimeout = 10000;
// 通用请求头
static const Map<String, dynamic> headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
}
2.2 Dio 实例封装
创建单例的 Dio 实例,统一初始化配置:
class HttpRequest {
static final HttpRequest _instance = HttpRequest._internal();
factory HttpRequest() => _instance;
late Dio _dio;
HttpRequest._internal() {
_dio = Dio(BaseOptions(
baseUrl: HttpConfig.baseUrl,
connectTimeout: const Duration(milliseconds: HttpConfig.connectTimeout),
receiveTimeout: const Duration(milliseconds: HttpConfig.receiveTimeout),
headers: HttpConfig.headers,
));
}
}
三、GET 请求实现
GET 请求是最常用的请求方式,用于获取数据,我们封装通用的 GET 请求方法。
3.1 通用 GET 方法封装
在 HttpRequest 类中添加 GET 请求方法:
Future<Response> get(String url, {Map<String, dynamic>? params}) async {
try {
Response response = await _dio.get(url, queryParameters: params);
return response;
} catch (e) {
rethrow;
}
}
3.2 GET 请求使用示例
调用封装好的 GET 方法获取数据:
void getListData() async {
try {
Response response = await HttpRequest().get(
"/list",
params: {"page": 1, "size": 10},
);
print("请求成功:${response.data}");
} catch (e) {
print("请求失败:$e");
}
}
四、POST 请求实现
POST 请求用于提交数据,比如表单提交、数据新增等场景。
4.1 通用 POST 方法封装
在 HttpRequest 类中添加 POST 请求方法:
Future<Response> post(String url, {Map<String, dynamic>? data}) async {
try {
Response response = await _dio.post(url, data: data);
return response;
} catch (e) {
rethrow;
}
}
4.2 POST 请求使用示例
调用封装好的 POST 方法提交数据:
void submitData() async {
try {
Response response = await HttpRequest().post(
"/submit",
data: {"name": "测试", "content": "提交内容"},
);
print("提交成功:${response.data}");
} catch (e) {
print("提交失败:$e");
}
}
五、请求参数与头部配置
实际开发中经常需要动态配置请求头和参数,比如添加用户 token、自定义请求头等。
5.1 动态请求头配置
封装添加动态请求头的方法:
void setHeader(String key, String value) {
_dio.options.headers[key] = value;
}
// 使用示例:添加用户token
void setUserToken(String token) {
HttpRequest().setHeader("Authorization", "Bearer $token");
}
5.2 全局参数配置
添加全局公共参数,所有请求都会自动携带:
void addCommonParams(Map<String, dynamic> params) {
_dio.options.queryParameters.addAll(params);
}
// 使用示例:添加全局设备信息
void addDeviceInfo() {
HttpRequest().addCommonParams({
"device": "harmony",
"version": "1.0.0",
});
}
六、响应数据解析
接口返回的 JSON 数据需要解析成实体类,方便后续使用。
6.1 基础响应实体类
创建通用的响应实体类,统一处理接口返回格式:
class BaseResponse {
int code;
String message;
dynamic data;
BaseResponse({
required this.code,
required this.message,
required this.data,
});
factory BaseResponse.fromJson(Map<String, dynamic> json) {
return BaseResponse(
code: json["code"],
message: json["message"],
data: json["data"],
);
}
}
6.2 响应数据解析示例
将接口返回的数据解析成实体类:
void parseResponseData(Response response) {
BaseResponse baseResponse = BaseResponse.fromJson(response.data);
if (baseResponse.code == 200) {
print("请求成功,数据:${baseResponse.data}");
} else {
print("请求失败:${baseResponse.message}");
}
}
七、真机网络测试
功能开发完成后,需要在真机上进行测试,验证网络请求是否正常。
7.1 测试接口准备
使用公开的测试接口进行验证,比如获取公开的列表数据接口:
void testNetwork() async {
try {
Response response = await HttpRequest().get(
"https://jsonplaceholder.typicode.com/posts",
params: {"_limit": 5},
);
print("测试成功,返回数据条数:${response.data.length}");
} catch (e) {
print("测试失败:$e");
}
}
7.2 测试验证步骤
- 重新编译应用安装到真机
- 触发网络请求,查看日志输出
- 验证数据返回正常,没有报错
- 测试无网络场景下的异常处理
测试正常即代表网络模块开发完成。
八、网络功能开发总结
Flutter 鸿蒙端的网络功能开发和安卓端基本一致,核心注意点总结如下:
- 优先使用 dio 库,是目前对鸿蒙端兼容性最好的网络库
- 一定要提前配置网络权限,否则所有请求都会失败
- 建议对网络请求进行统一封装,方便后续维护和扩展
- 统一处理响应格式和异常,避免每个接口重复写逻辑
- 所有功能开发完成后一定要在真机上测试,不要只在模拟器上验证
网络模块是所有应用的基础,封装好之后后续的业务功能开发就会非常顺畅。
更多推荐
所有评论(0)