摘要

网络请求是移动应用开发的核心基础能力,Dio 是 Flutter 生态中使用最广泛的高性能网络请求三方库,支持拦截器、超时配置、数据封装、异常统一处理等能力。OpenHarmony 鸿蒙系统拥有独立的权限管控、网络安全策略,原生 Flutter 三方库直接接入会出现请求拦截、权限失效、明文访问受限等问题。本文基于 DevEco Studio 开发环境,从零讲解 Flutter-OH 项目搭建、Dio 依赖引入、鸿蒙权限配置、网络策略适配、完整代码编写、真机 / 模拟器运行验证全流程,总结 Dio 在鸿蒙平台适配的常见问题与解决方案,为 Flutter 三方库鸿蒙化网络能力开发提供参考。

一、引言

1.1 三方库适配背景

随着 OpenHarmony 开源生态快速发展,Flutter 跨平台框架成为鸿蒙应用高效开发的重要方案。原生 Flutter 拥有海量成熟三方库,可大幅降低开发成本,但大部分第三方库未针对鸿蒙系统做专属适配。

网络功能作为 App 必备模块,普通 http 库功能简陋,无法满足项目复杂业务需求。Dio 凭借轻量、高扩展、易封装的优势,成为企业级 Flutter 项目首选网络库。但在 OpenHarmony 环境下,受限于系统权限机制、网络安全拦截规则,直接引入 Dio 会出现请求失败、构建报错、接口无响应等兼容问题。

1.2 开发环境介绍

  • 开发工具:DevEco Studio
  • 运行平台:OpenHarmony 模拟器 / 鸿蒙真机
  • 开发框架:Flutter-OH(鸿蒙定制版 Flutter)
  • 适配三方库:dio: ^5.4.0
  • 测试接口:免费公共 HTTPS 测试接口,规避鸿蒙明文限制

二、前期环境准备

2.1 创建 Flutter-OH 项目

  1. 打开 DevEco Studio,选择「新建项目」;
  2. 选择 Flutter for OpenHarmony 模板,命名项目为 flutter_dio_oh_demo
  3. 等待项目初始化完成,自动生成鸿蒙工程目录结构;
  4. 终端输入以下命令,校验 Flutter-OH 环境正常:
    flutter --version
    flutter devices

      能识别到 ohos 设备 / 模拟器,代表环境配置无误。

2.2 鸿蒙核心权限配置

OpenHarmony 采用严格权限管理,未声明网络权限会直接拦截所有网络请求。找到项目路径:ohos/app/src/main/module.json5requestPermissions 节点内添加网络权限:

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
    "reason": "应用需要访问网络接口数据",
    "usedScene": {
      "abilities": [".MainAbility"],
      "when": "inuse"
    }
  }
]

2.3 解除明文网络限制(开发必备)

鸿蒙默认禁止 HTTP 明文请求,开发调试阶段需手动开启,在同文件内新增网络配置:

"network": {
  "cleartextTraffic": true
}

注意:生产环境需删除该配置,统一使用 HTTPS 安全请求。

三、Dio 三方库引入与基础配置

3.1 引入 Dio 依赖

打开项目根目录 pubspec.yaml,在依赖项中添加:

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.4.0

3.2 安装依赖

打开编辑器终端,执行依赖拉取命令,完成三方库集成:

flutter pub get

控制台无报错、依赖安装成功,代表 Dio 库引入完成。

3.3 鸿蒙适配说明

Dio 属于纯 Dart 编写三方库,无原生 Android/iOS 代码,无需修改原生层代码,只需配合鸿蒙权限、网络策略即可直接运行,适配难度低,是鸿蒙 Flutter 项目最优网络方案。

四、完整代码实现

4.1 全局 Dio 工具类封装

新建工具类 utils/dio_client.dart,统一管理请求配置、拦截器、异常捕获,适配鸿蒙稳定请求:

import 'package:dio/dio.dart';

class DioClient {
  // 单例模式
  static final DioClient _instance = DioClient._internal();
  factory DioClient() => _instance;

  late Dio dio;

  // 初始化配置
  DioClient._internal() {
    BaseOptions options = BaseOptions(
      baseUrl: "https://jsonplaceholder.typicode.com",
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 10),
      headers: {
        "Content-Type": "application/json;charset=UTF-8"
      },
    );
    dio = Dio(options);
    // 拦截器配置
    dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) {
        print("请求地址:${options.uri}");
        handler.next(options);
      },
      onResponse: (response, handler) {
        print("响应码:${response.statusCode}");
        handler.next(response);
      },
      onError: (error, handler) {
        print("网络请求异常:${error.message}");
        handler.next(error);
      },
    ));
  }

  // GET 请求封装
  Future<Response?> get(String url,
      {Map<String, dynamic>? params}) async {
    try {
      return await dio.get(url, queryParameters: params);
    } on DioException catch (e) {
      errorHandle(e);
      return null;
    }
  }

  // POST 请求封装
  Future<Response?> post(String url,
      {Map<String, dynamic>? data}) async {
    try {
      return await dio.post(url, data: data);
    } on DioException catch (e) {
      errorHandle(e);
      return null;
    }
  }

  // 统一异常处理
  void errorHandle(DioException e) {
    switch (e.type) {
      case DioExceptionType.connectionTimeout:
        print("连接超时,请检查设备网络");
        break;
      case DioExceptionType.receiveTimeout:
        print("数据接收超时");
        break;
      case DioExceptionType.badResponse:
        print("服务器异常:${e.response?.statusCode}");
        break;
      default:
        print("未知网络错误");
    }
  }
}

4.2 页面功能代码

修改 main.dart,搭建可视化测试页面,实现按钮点击发起 GET/POST 请求,展示返回结果:

import 'package:flutter/material.dart';
import 'utils/dio_client.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Dio 鸿蒙适配实战",
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final DioClient dioClient = DioClient();
  String result = "等待请求操作";

  // GET 请求测试
  Future<void> getRequest() async {
    setState(() => result = "请求加载中...");
    var res = await dioClient.get("/posts/1");
    if (res != null && res.statusCode == 200) {
      setState(() {
        result = "GET 请求成功\n${res.data.toString()}";
      });
    } else {
      setState(() => result = "GET 请求失败");
    }
  }

  // POST 请求测试
  Future<void> postRequest() async {
    setState(() => result = "请求加载中...");
    Map<String, dynamic> postData = {
      "title": "Flutter-OH 三方库适配",
      "body": "Dio 鸿蒙适配测试",
      "userId": 1
    };
    var res = await dioClient.post("/posts", data: postData);
    if (res != null && res.statusCode == 201) {
      setState(() {
        result = "POST 请求成功\n${res.data.toString()}";
      });
    } else {
      setState(() => result = "POST 请求失败");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("OpenHarmony Dio 适配")),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: getRequest,
              child: const Text("发起GET网络请求"),
            ),
            const SizedBox(height: 15),
            ElevatedButton(
              onPressed: postRequest,
              child: const Text("发起POST网络请求"),
            ),
            const SizedBox(height: 30),
            Text(
              "请求结果:\n$result",
              style: const TextStyle(fontSize: 14),
            )
          ],
        ),
      ),
    );
  }
}

五、项目运行与功能验证

5.1 启动运行

  1. 开启 OpenHarmony 模拟器,保证模拟器网络正常;
  2. DevEco Studio 选择 ohos 运行设备,点击运行按钮;
  3. 自动编译、打包、安装应用至鸿蒙模拟器。

5.2 功能测试

  1. 应用启动成功,界面显示两个功能按钮;
  2. 点击「发起 GET 网络请求」,页面正常返回接口 JSON 数据;
  3. 点击「发起 POST 网络请求」,成功提交数据并接收后端响应;
  4. 查看控制台日志,可正常打印请求地址、响应码,适配完全生效。

六、鸿蒙适配常见问题与解决方案

问题 1:请求无响应、一直超时  

解决:检查 module.json5 是否添加 ohos.permission.INTERNET 网络权限,重启模拟器生效。

问题 2:http 接口访问失败

解决:鸿蒙禁止明文请求,统一替换为 HTTPS 接口,开发阶段可开启 cleartextTraffic

问题 3:pub get 依赖冲突

解决:降低 dio 版本至 5.3.3,适配低版本 Flutter-OH 工程。

问题 4:日志无报错但接口无数据

解决:检查模拟器网络连通性,确认测试接口可正常访问。

七、总结

本文以 Dio 网络三方库 为例,完整完成了 Flutter-OH 在 OpenHarmony 平台的三方库适配全流程。

  1. 纯 Dart 类 Flutter 三方库适配鸿蒙门槛低,无需修改原生代码,核心在于权限配置与系统安全策略适配;
  2. Dio 功能完善、扩展性强,完全满足鸿蒙 Flutter 应用的网络开发需求;
  3. 鸿蒙系统权限管控严格,所有设备能力类三方库使用前,必须提前声明对应权限;
  4. 本次适配实践,可为下拉刷新、图片选择、本地存储等更多 Flutter 三方库的鸿蒙化适配提供通用思路。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐