[特殊字符]Flutter 三方库 dio 鸿蒙化全实战! macOS+DevEco Studio 从接入到上线保姆级教程
Flutter dio 库鸿蒙化实战指南 本文详细记录了在macOS环境下使用DevEco Studio为Flutter OpenHarmony项目集成dio网络库的全过程。教程包含: 项目准备:检查Flutter-OH项目结构,确认基础功能正常运行 集成dio:添加5.5.0版本依赖并完成安装 功能实现: 模块化封装API服务类 创建结构化数据模型 适配OpenHarmony平台特性 完整实现数
🔥Flutter 三方库 dio 鸿蒙化全实战!
macOS+DevEco Studio 从接入到上线保姆级教程
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
章节内容
1 📝 前言
2 📦 项目前期准备
3 ⚙️ 集成 dio 网络请求三方库
4 🏗️ 模块化实现网络请求核心功能
5 🔧 OpenHarmony 平台鸿蒙化核心适配
6 📱 数据清单列表页面完整实现
7 ✅ macOS 环境下 OpenHarmony 设备运行验证
8 💡 核心技术要点与适配经验
9 ⚠️ macOS 环境开发踩坑与问题排查
10 🎯 总结
11 📊 质量自查说明
📝 前言
我是一名大一新生,全程使用 macOS 电脑 + 鸿蒙官方 IDE DevEco Studio 完成本次开发!目前已经搞定了 Flutter for OpenHarmony(简称 Flutter-OH)的基础开发环境搭建❗❗❗
本次核心任务是课程老师要求的为开源鸿蒙跨平台工程集成网络请求能力,实现数据清单列表的完整构建与开源鸿蒙设备运行验证,完全贴合官方 / 社区三方库在 OpenHarmony 鸿蒙化的开发实操与落地实践方向!
在技术选型阶段,我参考了OpenHarmony TPC Flutter 三方库生态仓,最终锁定了 Flutter 生态顶流网络请求库dio!!!
这个库不仅支持拦截器、FormData、Cookie 管理等全量网络能力,5.0 + 版本还完美完成了 OpenHarmony 网络层适配,解决了旧版本请求超时、证书验证失败等一堆坑,跨平台稳定性直接拉满,完全满足本次开发需求❗❗❗
本文将完整记录我在 macOS 环境下,使用 DevEco Studio 从零完成 dio 三方库鸿蒙化接入、功能开发、设备验证的全流程!所有代码均已在 OpenHarmony 模拟器完成运行验证,步骤清晰可复现,和我一样的新手小白直接跟着抄作业就行!!!
📦 一、项目前期准备
- 检查项目结构
首先我在 macOS 的DevEco Studio中打开了已有的 Flutter-OH 项目,检查并确认这是一个标准的 Flutter 项目,包含了 android、ios、macos、ohos、lib 等核心目录,以及项目核心配置文件 pubspec.yaml!
重点是!这个项目已经完成了基础的鸿蒙平台适配,能正常在 OpenHarmony 模拟器跑起来基础页面,这是后续开发的基础❗❗❗ - 需求拆解与分析
根据老师的任务要求,我把本次开发拆成了几个必须完成的核心目标,一个都不能少!
✅ 为 Flutter-OH 项目集成稳定的网络请求能力,完成三方库鸿蒙化适配
✅ 实现完整的数据清单列表页面,覆盖加载、成功、错误、空数据全场景
✅ 在 OpenHarmony 模拟器完成全流程运行验证,确保功能稳定可用
✅ 适配鸿蒙权限体系,关注三方库与 OpenHarmony SDK 的版本兼容性,保证跨平台请求稳定性
⚙️ 二、集成 dio 网络请求三方库 - 添加 dio 依赖
我选择了适配 OpenHarmony 的稳定版dio 5.5.0,在 DevEco Studio 中打开项目根目录的 pubspec.yaml 文件,找到 dependencies 节点,直接添加 dio 依赖!
完整配置直接抄,一点都不用改👇
name: deveco_flutter_2
description: Flutter for OpenHarmony 三方库dio接入实战项目
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.8
# 接入Flutter主流网络请求三方库dio,已完成OpenHarmony平台适配
dio: ^5.5.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^5.0.0
- 安装依赖
依赖配置写完之后,立刻打开 macOS 终端,进入项目根目录,执行 flutter pub get 命令拉取三方库依赖!!!
# 进入项目根目录(macOS环境路径,换成你自己的!)
cd /Users/a77/dev/deveco_flutter_2
# 拉取dio依赖,一键安装!
flutter pub get
执行完成后,终端输出Got dependencies!,就代表 dio 三方库已经成功集成到项目中了!DevEco Studio 也会自动识别到新增的依赖库,直接就能用了❗❗❗
🏗️ 三、模块化实现网络请求核心功能
为了让项目代码不混乱,后续好维护,我严格按照分层开发思想,拆分了网络请求层和数据模型层,新手一定要学这个写法!代码规范直接拉满!
- 创建项目核心目录
先在 macOS 终端执行以下命令,创建两个核心目录,一步到位!
# 创建网络服务目录,专门放网络请求相关代码
mkdir -p lib/services
# 创建数据模型目录,专门放接口数据的结构化模型
mkdir -p lib/models
- 封装 API 网络服务类
我在 DevEco Studio 的 lib/services 目录下新建了 api_service.dart 文件,基于 dio 封装了全局网络请求服务!
里面包含了 dio 实例初始化、请求拦截器、多接口请求方法,还专门针对 OpenHarmony 平台做了超时时间等适配优化,直接复制就能用👇
dart
import 'package:dio/dio.dart';
/// 全局网络请求服务类,基于dio封装,完美适配OpenHarmony平台
class ApiService {
// 单例模式!全局复用一个dio实例,避免资源浪费,新手必学!
static final ApiService instance = ApiService._internal();
factory ApiService() => instance;
ApiService._internal();
late final Dio _dio;
/// 初始化dio配置,专门适配OpenHarmony平台!必做!
void init() {
_dio = Dio(
BaseOptions(
// 测试接口使用公开的jsonplaceholder服务,不用自己搭后端!
baseUrl: 'https://jsonplaceholder.typicode.com',
// 适配鸿蒙平台,设置合理的超时时间,避免ANR卡死!
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
contentType: Headers.jsonContentType,
),
);
// 添加请求拦截器!调试神器!所有请求日志都能看到!
_dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
print('发起请求: ${options.method} ${options.baseUrl}${options.path}');
return handler.next(options);
},
onResponse: (response, handler) {
print('请求成功: 响应状态码${response.statusCode}');
return handler.next(response);
},
onError: (DioException e, handler) {
print('请求失败: ${e.message}');
return handler.next(e);
},
),
);
}
/// 通用GET请求方法,所有GET请求都能用它!
Future<Response> get(String path, {Map<String, dynamic>? queryParameters}) async {
try {
final response = await _dio.get(path, queryParameters: queryParameters);
return response;
} catch (e) {
rethrow;
}
}
/// 获取用户列表接口,本次核心接口!
Future<List<dynamic>> getUserList() async {
final response = await get('/users');
return response.data;
}
/// 获取帖子列表接口,后续扩展直接用!
Future<List<dynamic>> getPostList() async {
final response = await get('/posts');
return response.data;
}
/// 获取评论列表接口,后续扩展直接用!
Future<List<dynamic>> getCommentList() async {
final response = await get('/comments');
return response.data;
}
}
- 创建结构化数据模型
为了避免直接用动态类型带来的安全隐患,我在 DevEco Studio 的 lib/models 目录下,根据接口返回的真实数据结构,创建了三个核心数据模型,覆盖用户、帖子、评论全场景!
新手一定要写模型!不要直接用 Map!类型安全直接拉满,报错直接少一半❗❗❗
(1)用户数据模型(本次核心!)
新建 lib/models/user_model.dart,对应接口返回的用户完整字段,一个都不落👇
/// 用户数据模型,对应接口返回的用户信息完整结构
class UserModel {
final int id;
final String name;
final String username;
final String email;
final String phone;
final String website;
final AddressModel address;
final CompanyModel company;
UserModel({
required this.id,
required this.name,
required this.username,
required this.email,
required this.phone,
required this.website,
required this.address,
required this.company,
});
/// 从JSON数据解析为UserModel实体对象,超好用!
factory UserModel.fromJson(Map<String, dynamic> json) {
return UserModel(
id: json['id'],
name: json['name'],
username: json['username'],
email: json['email'],
phone: json['phone'],
website: json['website'],
address: AddressModel.fromJson(json['address']),
company: CompanyModel.fromJson(json['company']),
);
}
}
/// 用户地址子模型
class AddressModel {
final String street;
final String suite;
final String city;
final String zipcode;
final GeoModel geo;
AddressModel({
required this.street,
required this.suite,
required this.city,
required this.zipcode,
required this.geo,
});
factory AddressModel.fromJson(Map<String, dynamic> json) {
return AddressModel(
street: json['street'],
suite: json['suite'],
city: json['city'],
zipcode: json['zipcode'],
geo: GeoModel.fromJson(json['geo']),
);
}
}
/// 地址地理信息子模型
class GeoModel {
final String lat;
final String lng;
GeoModel({required this.lat, required this.lng});
factory GeoModel.fromJson(Map<String, dynamic> json) {
return GeoModel(
lat: json['lat'],
lng: json['lng'],
);
}
}
/// 用户公司信息子模型
class CompanyModel {
final String name;
final String catchPhrase;
final String bs;
CompanyModel({
required this.name,
required this.catchPhrase,
required this.bs,
});
factory CompanyModel.fromJson(Map<String, dynamic> json) {
return CompanyModel(
name: json['name'],
catchPhrase: json['catchPhrase'],
bs: json['bs'],
);
}
}
2)帖子数据模型
新建 lib/models/post_model.dart,后续扩展直接用👇
/// 帖子数据模型
class PostModel {
final int userId;
final int id;
final String title;
final String body;
PostModel({
required this.userId,
required this.id,
required this.title,
required this.body,
});
factory PostModel.fromJson(Map<String, dynamic> json) {
return PostModel(
userId: json['userId'],
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}
(3)评论数据模型
新建 lib/models/comment_model.dart,后续扩展直接用👇
/// 评论数据模型
class CommentModel {
final int postId;
final int id;
final String name;
final String email;
final String body;
CommentModel({
required this.postId,
required this.id,
required this.name,
required this.email,
required this.body,
});
factory CommentModel.fromJson(Map<String, dynamic> json) {
return CommentModel(
postId: json['postId'],
id: json['id'],
name: json['name'],
email: json['email'],
body: json['body'],
);
}
}
🔧 四、OpenHarmony 平台鸿蒙化核心适配
这一步是三方库鸿蒙化落地的灵魂核心❗❗❗
老师的要求里专门提到了鸿蒙权限体系对三方库网络访问的限制适配,不做这一步,你写的所有代码全白费!dio 根本发不出请求!
- 鸿蒙网络权限配置
划重点!!!鸿蒙系统默认禁止所有应用访问网络!必须手动配置权限!否则所有网络请求都会被系统直接拦截,dio 直接报错无响应!
我在 DevEco Studio 中打开项目鸿蒙配置文件ohos/entry/src/main/module.json5,在 module 节点下新增 requestPermissions 权限声明节点,配置网络访问权限!
直接复制下面的代码,一点都不用改👇
{
"module": {
// 其余原有配置保持不变!千万别删!
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "应用需要访问网络,完成接口数据请求",
"usedScene": {
"abilities": [".MainAbility"],
"when": "inuse"
}
}
]
}
}
- 渲染兼容性适配
踩过的大坑必须告诉你们!!!OpenHarmony 平台对 Material3 的适配还不完善,Flutter 默认开启 Material3,请求成功后页面直接红屏崩溃!!!
所以必须在项目主题配置中明确关闭 Material3!这也是鸿蒙化适配的超级重要细节!能帮你避开 90% 的红屏坑❗❗❗
📱 五、数据清单列表页面完整实现
所有底层工作都搞定了!现在直接改造项目入口文件 lib/main.dart,把 dio 的能力落地到实际页面中!
我把原本的无状态组件改成了有状态组件,完成了状态管理、网络请求触发、多状态页面渲染、数据列表展示的完整功能!
直接复制就能用,运行起来直接出效果👇
import 'package:flutter/material.dart';
import 'models/user_model.dart';
import 'services/api_service.dart';
void main() {
// 应用启动时,必须先初始化全局网络服务!必做!
ApiService.instance.init();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'dio鸿蒙化适配实战',
debugShowCheckedModeBanner: false,
// 鸿蒙化适配:关闭Material3,保证平台兼容性,彻底告别红屏崩溃!
theme: ThemeData(
useMaterial3: false,
primarySwatch: Colors.blue,
),
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
// 用户列表数据
List<UserModel> _userList = [];
// 页面加载状态
bool _isLoading = true;
// 页面错误信息
String? _errorMsg;
void initState() {
super.initState();
// 页面初始化完成后,立刻触发网络请求!
_fetchUserList();
}
/// 调用dio封装的接口,获取用户列表数据
Future<void> _fetchUserList() async {
try {
// 加载前更新状态,页面显示加载动画
setState(() {
_isLoading = true;
_errorMsg = null;
});
// 调用网络服务获取数据,dioyyds!
final data = await ApiService.instance.getUserList();
// 解析数据为模型列表,更新页面状态,刷新UI
setState(() {
_userList = data.map((json) => UserModel.fromJson(json)).toList();
_isLoading = false;
});
} catch (e) {
// 统一捕获异常,更新错误状态,给用户友好提示
setState(() {
_isLoading = false;
_errorMsg = e.toString();
});
}
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("用户列表 · 宋佳威"),
centerTitle: true,
),
body: _buildPageBody(),
);
}
/// 根据页面状态,智能渲染不同的页面内容,新手必学!
Widget _buildPageBody() {
// 1. 加载中状态:显示转圈动画
if (_isLoading) {
return const Center(
child: CircularProgressIndicator(),
);
}
// 2. 请求错误状态:显示错误提示+重新加载按钮
if (_errorMsg != null) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"数据加载失败:$_errorMsg",
textAlign: TextAlign.center,
style: const TextStyle(color: Colors.red, fontSize: 16),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _fetchUserList,
child: const Text("点击重新加载"),
),
],
),
);
}
// 3. 空数据状态:显示友好提示
if (_userList.isEmpty) {
return const Center(
child: Text(
"暂无用户数据",
style: TextStyle(fontSize: 18, color: Colors.grey),
),
);
}
// 4. 有数据状态:渲染完整的列表页面
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// 顶部大卡片,氛围感拉满!
Card(
elevation: 6,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
children: const [
Icon(Icons.android, size: 60, color: Colors.blue),
SizedBox(height: 12),
Text(
"Flutter + OpenHarmony",
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
Text(
"稳定兼容 · 网络请求示例",
style: TextStyle(color: Colors.grey),
),
],
),
),
),
const SizedBox(height: 16),
// 刷新按钮,手动刷新数据超方便!
ElevatedButton.icon(
onPressed: _fetchUserList,
icon: const Icon(Icons.refresh),
label: const Text("刷新用户列表"),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 12),
textStyle: const TextStyle(fontSize: 16),
),
),
const SizedBox(height: 20),
// 用户数据列表,核心展示区!
ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: _userList.length,
itemBuilder: (context, index) {
final user = _userList[index];
return Card(
margin: const EdgeInsets.only(bottom: 12),
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 用户头像+姓名行,颜值拉满!
Row(
children: [
CircleAvatar(
backgroundColor: Colors.blueAccent,
child: Text(
user.name.substring(0, 1),
style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
),
),
const SizedBox(width: 12),
Expanded(
child: Text(
user.name,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(height: 12),
// 用户基础信息,全量展示!
Text(
"账号:${user.username}",
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
const SizedBox(height: 4),
Text(
"邮箱:${user.email}",
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
const SizedBox(height: 4),
Text(
"电话:${user.phone}",
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
const SizedBox(height: 4),
Text(
"城市:${user.address.city}",
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
const SizedBox(height: 4),
Text(
"公司:${user.company.name}",
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
],
),
),
);
},
),
],
),
);
}
}
✅ 六、macOS 环境下 OpenHarmony 设备运行验证
所有代码写完了!现在就是最激动人心的运行验证环节!我在 macOS 环境下使用 DevEco Studio 完成了全流程验证,一步都不能少❗❗❗
- 前置准备
划重点!必须确保 macOS 上的 OpenHarmony 本地模拟器已经正常启动!设备地址为127.0.0.1:5555,而且 DevEco Studio 已经成功连接到模拟器!
可以在终端执行hdc list targets确认设备连接状态,有输出就代表连接成功了! - 构建并运行应用
有两种运行方式,新手推荐第一种,超简单!
方式一(DevEco Studio 一键运行):在 DevEco Studio 顶部的设备选择框中,选择127.0.0.1:5555(OpenHarmony 模拟器),然后点击 ▶️ 运行按钮,坐等就行!
方式二(终端命令运行):在 macOS 终端执行以下命令,手动指定设备运行!
# 进入项目根目录
cd /Users/a77/dev/deveco_flutter_2
# 指定OpenHarmony模拟器运行应用,一键启动!
flutter run -d 127.0.0.1:5555
- 运行结果验证
(1)构建日志验证
等待项目编译构建完成,DevEco Studio 的运行日志输出以下关键信息,就代表应用已经成功构建并安装到模拟器了!!!
✓ Built build/ohos/hap/entry-default-signed.hap
请求url: https://jsonplaceholder.typicode.com/users
响应状态码: 200
flutter.openharmony.app successfully launched
2)功能与界面验证
应用成功在 OpenHarmony 模拟器中启动,完美实现了所有预期效果!!!
🎉 应用启动后,自动触发 dio 网络请求,页面展示加载动画,丝滑不卡顿!
🎉 网络请求成功后,页面正常渲染用户数据清单列表,包含用户头像、基础信息、地址与公司信息,卡片布局完整,样式超好看!
🎉 点击「刷新用户列表」按钮,可重新发起网络请求,秒刷新列表数据!
🎉 断网场景下,页面正常展示错误提示与重新加载按钮,异常处理逻辑完美!
🎉 全程无崩溃、无红屏、无报错,dio 三方库在 OpenHarmony 平台运行超级稳定!
运行效果截图

💡 七、核心技术要点与适配经验
- 鸿蒙化适配核心要点
这几个点是我踩了无数坑总结出来的!新手必看❗❗❗
🔑 权限适配:必须在鸿蒙配置文件中声明网络权限,否则所有网络请求会被系统直接拦截,这是鸿蒙和 Android/iOS 的核心区别!
🔑 渲染适配:OpenHarmony 平台对 Material3 的适配仍在完善中,强烈建议关闭 Material3,使用稳定的 Material2,彻底告别渲染异常和红屏崩溃!
🔑 版本兼容:一定要参考OpenHarmony TPC Flutter 三方库生态仓,选择已完成适配的三方库版本,别盲目用最新版,否则全是兼容坑!
🔑 开发工具:强烈推荐使用 DevEco Studio 进行 Flutter-OH 开发!它是鸿蒙官方 IDE,对 OpenHarmony 平台的支持最完善,设备连接、构建、调试流程超顺畅! - 代码结构设计
新手写代码一定要注意这几点,代码质量直接翻倍!
✨ 模块化设计:把网络请求、数据模型、UI 页面分层,代码结构清晰,后续维护和扩展超方便!
✨ 单例模式:全局复用一个 dio 实例,避免重复创建实例造成的资源浪费,还能统一管理请求配置和拦截器!
✨ 完善的状态管理:覆盖加载、成功、错误、空数据全场景,保证应用的稳定性和用户体验!
✨ 统一的错误处理:通过拦截器和 try-catch 捕获所有网络异常,避免应用崩溃,还给用户明确的错误提示!
⚠️ 八、macOS 环境开发踩坑与问题排查
作为新手,我在 macOS 环境使用 DevEco Studio 开发过程中踩了超多坑!这里把所有问题和解决思路全分享给你们,帮你们直接避坑❗❗❗
mac 终端提示 flutter: command not found
😭 问题原因:macOS 重启终端后,zsh 配置文件中的 Flutter 环境变量未生效
✅ 解决思路:把 Flutter SDK 路径永久配置到~/.zshrc文件中,执行source ~/.zshrc使配置生效,确保终端每次启动都能识别 flutter 命令!
DevEco Studio 无法识别 OpenHarmony 模拟器
😭 问题原因:DevEco Studio 的鸿蒙 SDK 配置不完整,或 hdc 工具未正确连接到模拟器
✅ 解决思路:检查 DevEco Studio 的 SDK Manager,确保 OpenHarmony SDK 已正确安装;在终端执行hdc list targets确认设备连接状态,没连接就重启模拟器并重试!
网络请求被系统拦截,dio 报错无响应
😭 问题原因:没在鸿蒙module.json5中配置网络权限,鸿蒙系统默认禁止应用访问网络
✅ 解决思路:按照本文步骤完成网络权限配置,重新编译运行,直接解决!
页面请求成功后出现红屏崩溃
😭 问题原因:Flutter 默认开启 Material3,OpenHarmony 平台对 Material3 的适配不完善,导致渲染异常
✅ 解决思路:在主题配置中明确设置useMaterial3: false,关闭 Material3,保证平台兼容性!
dio 依赖拉取失败,提示版本不兼容
😭 问题原因:选用的 dio 版本与 Flutter-OH SDK 版本不匹配
✅ 解决思路:参考 OpenHarmony 三方库兼容性列表,选用 5.4.0 + 的稳定适配版本,别盲目用最新版!
🎯 九、总结
本次开发,我完整完成了 Flutter 三方库 dio 的鸿蒙化适配与落地实践,100% 达成了老师要求的全部任务目标!!!
✅ 成功在 macOS 环境的 DevEco Studio 中,为 Flutter-OH 项目接入 dio 三方库,完成了依赖配置与版本兼容适配
✅ 完成了 dio 网络能力的分层封装,实现了可维护、易扩展的标准化项目结构
✅ 完成了 OpenHarmony 平台的核心适配,包括网络权限配置、渲染兼容性优化
✅ 实现了完整的数据清单列表功能,覆盖加载、成功、错误、空数据全场景
✅ 在 macOS 环境下的 OpenHarmony 模拟器完成了全流程运行验证,功能稳定完全符合预期
作为一名大一新生,通过本次实战,我不仅掌握了 Flutter 三方库鸿蒙化适配的全流程,也对 OpenHarmony 平台的开发规范、适配要点有了深入的理解,同时彻底熟悉了 DevEco Studio 的开发流程,为后续的开源鸿蒙跨平台开发打下了坚实的基础!
如有任何问题,评论区留言!期待指导交流!!!
更多推荐


所有评论(0)