Flutter+开源鸿蒙实战|企业级工具APP Day2 全局网络封装与 Dio 拦截器实战(鸿蒙兼容版)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

<!-- Schema.org 结构化SEO -->
<script type="application/ld+json">
{
  "@context":"https://schema.org",
  "type":"BlogPosting",
  "headline":"Flutter+开源鸿蒙实战 企业级工具APP Day2 全局网络封装与Dio拦截器实战",
  "author":{"type":"Person","name":"鸿蒙跨端开发者"},
  "publisher":{"type":"Organization","name":"开源鸿蒙跨平台开发者社区"},
  "description":"Flutter+开源鸿蒙企业级工具APP Day2,专注网络请求封装:Dio集成、全局拦截器、请求/响应统一处理、错误捕获、鸿蒙权限适配、多端稳定运行,教程详细可直接复用",
  "keywords":"Flutter,开源鸿蒙,OpenHarmony,Dio,网络封装,拦截器,跨端开发,企业级APP,鸿蒙适配"
}
</script>

一、前言

在 Day1 中,我们完成了Flutter+开源鸿蒙企业级工具APP的基础搭建:第三方库集成、全局Toast、本地存储、屏幕适配与权限检查。整个工程已经具备了可运行、可调试、可在鸿蒙设备上正常启动的基础能力。

但任何企业级应用都离不开稳定、统一、可维护的网络请求层。如果每个页面都单独写 Dio 请求、单独处理异常、单独加请求头,不仅代码冗余,还会出现:无统一日志、无统一错误提示、无Token统一处理、鸿蒙网络权限不兼容等问题。

因此,Day2 我们只聚焦一个核心点:网络请求封装
从 Dio 初始化 → 全局拦截器 → 请求/响应/异常统一处理 → 鸿蒙权限适配 → 业务调用,全程手把手、逐行讲解,让你真正掌握企业级跨端网络架构。

本文全程适配开源鸿蒙手机/平板,代码精简、注释详细、可直接用于毕设/项目/博客发布。


在这里插入图片描述

二、Day2 核心目标(只做网络,做深做透)

  1. 基于 Dio 完成开源鸿蒙兼容版全局网络工具封装
  2. 实现请求拦截器:统一添加请求头、公共参数、日志打印
  3. 实现响应拦截器:统一解析结构、状态码判断
  4. 实现异常拦截器:统一捕获 Dio 异常、网络异常、权限异常
  5. 对接 Day1 的 Toast,做到全局自动提示
  6. 适配开源鸿蒙网络权限,避免请求失败/闪退
  7. 提供最简调用示例,页面只需一行代码发起请求

三、为什么要封装 Dio?(开源鸿蒙场景特别重要)

  • 鸿蒙对网络权限管控更严格,需统一检查与提示
  • 跨端设备(手机/平板)网络环境复杂,需统一超时策略
  • 企业项目必须有请求日志,方便调试
  • 错误信息必须统一文案,避免用户困惑
  • 后续加 Token、加加密、加签名,只需改一处

四、第一步: Dio 全局初始化(鸿蒙稳定版)

我们先创建一个单例 Http 工具,确保整个 APP 只有一个 Dio 实例,避免多次创建导致的性能问题。

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

class HttpManager {
  static final HttpManager _instance = HttpManager._internal();
  factory HttpManager() => _instance;
  late Dio dio;

  HttpManager._internal() {
    // 初始化Dio(适配开源鸿蒙网络策略)
    dio = Dio(BaseOptions(
      baseUrl: "https://api.xxx.com", // 你的接口地址
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 10),
      headers: {"Content-Type": "application/json;charset=UTF-8"},
    ));
  }
}

要点:

  • 单例模式,全局唯一
  • 统一超时时间,适配鸿蒙弱网环境
  • 统一请求头,避免重复书写

五、第二步:添加请求拦截器(公共参数+日志)

请求拦截器用于:添加 Token、添加公共参数、打印请求日志、展示加载动画。

// 在 HttpManager._internal() 中添加
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 日志打印(调试用)
    debugPrint("🔌 请求地址: ${options.uri}");
    debugPrint("🔌 请求方法: ${options.method}");
    // 统一添加公共参数
    options.queryParameters["platform"] = "open_harmony";
    return handler.next(options);
  },
));

作用:

  • 自动带上 platform=open_harmony,后端可识别鸿蒙端
  • 控制台清晰日志,方便定位问题
  • 后续加 Token 只需这里加一行

六、第三步:添加响应拦截器(统一解析)

后端返回结构一般是 code + msg + data,我们统一解析。

onResponse: (response, handler) {
  debugPrint("✅ 响应成功: ${response.data}");
  // 可在此统一剥离 data
  return handler.next(response);
},

七、第四步:异常拦截器(鸿蒙最关键)

开源鸿蒙设备经常出现:无网络、权限未开、后台拒绝、超时。
我们统一捕获,并自动弹出 Toast。

onError: (DioException e, handler) {
  String msg = "请求失败";
  if (e.type == DioExceptionType.connectionTimeout) {
    msg = "连接超时,请检查网络";
  } else if (e.type == DioExceptionType.receiveTimeout) {
    msg = "服务器响应超时";
  } else if (e.type == DioExceptionType.connectionError) {
    msg = "网络异常,请开启Wi‑Fi/流量";
  } else {
    msg = e.message ?? "请求异常";
  }
  // 调用Day1的全局提示
  ToastUtil.showError(msg);
  debugPrint("❌ 错误: $msg");
  return handler.next(e);
}

效果:

  • 鸿蒙无网 → 自动提示:网络异常
  • 超时 → 自动提示:超时
  • 所有错误只在这里处理,页面无需写 try-catch

在这里插入图片描述

八、第五步:封装 GET/POST 最简调用

让页面调用像呼吸一样简单。

// GET
static Future<Response> get(String path, {Map<String, dynamic>? params}) {
  return HttpManager().dio.get(path, queryParameters: params);
}

// POST
static Future<Response> post(String path, {dynamic data}) {
  return HttpManager().dio.post(path, data: data);
}

九、第六步:页面调用示例(鸿蒙运行正常)

// 调用工具列表接口
void loadToolData() async {
  try {
    var res = await HttpUtil.get("/api/tool/list");
    if (res.statusCode == 200) {
      ToastUtil.showSuccess("加载成功");
      // 更新UI
    }
  } catch (_) {}
}

你没看错:一页只需要4行代码完成网络请求


十、开源鸿蒙特别适配(必看)

  1. 必须在鸿蒙侧配置网络权限:
    • ohos.permission.INTERNET
  2. 不配置会直接报连接错误,拦截器会自动提示
  3. 鸿蒙后台限制后台网络,封装后统一处理更稳定

十一、Day2 开发总结

Day2 我们只做了一件事:把网络请求彻底封装好

  • Dio 单例初始化
  • 三大拦截器(请求/响应/异常)
  • 统一日志、统一提示、统一参数
  • 极简调用,页面无冗余代码
  • 完全适配开源鸿蒙设备

整个架构已经达到企业级可用、可上线、可扩展标准。


在这里插入图片描述

十二、Day3 预告

Day3 将进入UI实战,专注:

  1. 企业级工具APP首页完整UI
  2. 功能入口卡片、网格布局
  3. 多设备(鸿蒙手机/平板)适配
  4. 点击跳转、状态管理
  5. 全套页面可直接用于毕业设计展示
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐