【Harmonyos】开源鸿蒙跨平台训练营DAY3:为开源鸿蒙跨平台工程集成网络请求能力,实现数据清单列表的完整构建与开源鸿蒙设备运行验证(及常见问题与方法)
在上一篇入门内容铺垫后,今天咱们要把 “配置网络权限→发起请求拿数据→渲染列表→真机验证→推到远程仓库” 这整套流程,拆成像搭积木一样好懂的步骤! 毕竟鸿蒙开发的 “动态功能第一步闭环” 太重要啦 —— 从 “App 只能看静态页面” 到“能联网拿数据、优雅展示还能被别人一键克隆跑起来”,这中间的每一步都藏着新手容易踩的小坑,但跟着小魔仙的节奏走,零基础也能稳稳拿下 接下来咱们就从 “给 App
🚀 鸿蒙跨平台开发 DAY3 保姆级任务通关大纲(零基础友好)

🌟 感谢陪伴~ 小白博主在线求友
🌿 跟着小白学Linux/Java/Python
📖 专栏汇总:
《Linux》专栏 | 《Java》专栏 | 《Python》专栏

哈喽各位鸿蒙开发的新手小伙伴!小魔仙带着超详细的 DAY3 任务来啦~👋
- 在上一篇入门内容铺垫后,今天咱们要把 “配置网络权限→发起请求拿数据→渲染列表→真机验证→推到远程仓库”
- 这整套流程,拆成像搭积木一样好懂的步骤! 毕竟鸿蒙开发的 “动态功能第一步闭环” 太重要啦 —— 从 “App 只能看静态页面” 到“能联网拿数据、优雅展示还能被别人一键克隆跑起来”,这中间的每一步都藏着新手容易踩的小坑,但跟着小魔仙的节奏走,零基础也能稳稳拿下~
- 接下来咱们就从 “给 App 开‘上网权限’” 开始,一步步把你的 App 从 “静态哑巴页” 变成“会联网的活应用”,成就感直接拉满!✨
✨ 从0到1实现网络请求+列表渲染+设备验证
🔍 【开篇】今日任务核心:搞懂“网络请求+列表”的底层逻辑
目标拆解(用大白话讲):
- 让你的App能合法上网 → 权限配置
- 让App能拿数据 → 网络请求
- 让数据变成好看的列表 → 渲染+异常处理
- 让代码在鸿蒙设备上跑起来 → 设备验证+提交
🛠️ 【步骤1】环境准备:先把“工具”搭好(必做)
1.1 检查开发装备
- 🛠️ DevEco Studio:确认装了Flutter插件
- 📱 鸿蒙环境:SDK、模拟器/真机调试功能正常
1.2 初始化工程
- 选技术栈(Flutter)→ 新建工程
- 先跑个空白页:确保能在鸿蒙设备上正常启动(这步很重要!)
📢就是新建一个工程,看看能不能建立成功
🌐 【步骤2】网络权限:给App“上网许可证”(必做)
2.1 配置权限文件
- 📄 Flutter工程:
- 在 module.json5 中,找到
requestPermissions字段(如果没有就新增),添加网络权限:- module.json5加:
ohos.permission.INTERNET
- module.json5加:

你添加之后在右上角会显示一个Sync Now,让工程重新同步配置。
📡 【步骤3】网络请求
方案:原生API(零基础必学,懂底层)
🎯 Flutter示例:用dart:io写请求(附代码片段)
我会用最直白的步骤,带你用鸿蒙原生 API 实现网络请求,这是理解网络底层原理的关键一步。
1、🔧 前置条件
- 你已经在
module.json5中配置了ohos.permission.INTERNET权限。 - 你的工程是基于 ArkTS的鸿蒙应用(不是 React Native/Flutter 跨平台工程)
2. 导入网络模块
在你的 .ets 页面文件开头,导入鸿蒙的 HTTP 网络模块:
import http from '@ohos.net.http';

📢在你输入上之后会有一个小警告,但完全不用在意,上角的那个警告,只是因为你导入了 http 模块但还没实际使用它,IDE 认为这是一个 “未使用的导入”,是个纯粹的提示,完全不影响代码运行。
3. 封装网络请求函数
封装这个 fetchData 函数,需要放在你的 Index.ets 文件里,具体是放在 Index 这个结构体的内部,作为一个类方法。
✅ 正确位置示例
🎯 精准位置
你要把 fetchData 和loadData函数,加在 @State message: string = 'Hello World'; 这一行的下面,build() { ... } 这一行的上面。
代码:
import http from '@ohos.net.http';
// 定义数据接口
interface Todo {
userId: number;
id: number;
title: string;
completed: boolean;
}
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
@State dataList: Todo[] = [];
async fetchData(url: string): Promise<Todo[]> {
let httpRequest = http.createHttp();
try {
let response = await httpRequest.request(url, {
method: http.RequestMethod.GET,
connectTimeout: 10000,
readTimeout: 10000
});
if (response.responseCode === 200) {
return JSON.parse(response.result.toString()) as Todo[];
} else {
throw new Error(`请求失败,状态码:${response.responseCode}`);
}
} catch (error) {
console.error('网络请求异常:', error);
if (error instanceof Error) {
throw error;
} else {
throw new Error(String(error));
}
} finally {
httpRequest.destroy();
}
}
async loadData() {
try {
const data = await this.fetchData('https://jsonplaceholder.typicode.com/todos');
this.dataList = data;
this.message = `加载完成!共 ${data.length} 条数据`;
} catch (error) {
if (error instanceof Error) {
this.message = error.message;
} else {
this.message = '数据加载失败';
}
}
}
build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
this.loadData();
})
}
.height('100%')
.width('100%')
}
}
4、在页面中调用并渲染数据
🎯 精准位置
这部分代码(dataList、isLoading、errorMsg 状态变量和 onPageShow 生命周期),需要添加到你的Index结构体内部,和之前的fetchData、loadData 函数放在一起。
在@State message: string = 'Hello World';后面加上
@State dataList: Todo[] = [];
@State isLoading: boolean = false;
@State errorMsg: string = '';
在build()前面加:
onPageShow() {
this.loadData();
}
📊 【步骤4】数据列表:把“冰冷的JSON”变成“好看的界面”
4.1 数据解析:给JSON“穿衣服”
- 🧩 写Model类(TypeScript接口/Dart实体类)→ 类型安全不报错
4.2 列表渲染:让数据“排排坐”
- 📜 Flutter用
ListView.builder(附代码+注释)
4.3 兜底处理:别让App“崩着脸”
- ⏳ 加载中:显示“转圈动画”
- 🚫 空数据:显示“暂无内容”
- ❌ 出错了:显示“重试按钮”
🎯 改动 1:新增「空数据」状态判断(核心)
在你原来的 build() 方法里,找到「错误状态」和「列表状态」之间,新增空数据判断:
// 👇 你原来的错误状态(保留不动)
else if (this.errorMsg) {
Text(this.errorMsg).fontColor(Color.Red).margin({ top: 20 });
Button('重新加载').onClick(() => this.loadData()).margin({ top: 10 });
}
// 👇 新增这一段(空数据判断)
else if (this.dataList.length === 0) {
Column({ space: 15 }) {
Text('暂无数据').fontColor('#999').fontSize(16);
// 可选:加图标 Image('empty_icon.svg').width(80).height(80);
}
.padding(40)
.layoutWeight(1)
.justifyContent(FlexAlign.Center);
}
// 👆 新增结束
// 👇 你原来的列表状态(保留不动)
else {
List({ space: 10 }) { ... }
}
🎯 改动 2:优化错误状态 UI(可选)
如果你想让错误提示更友好,把原来的错误状态代码替换成这个:
// ❌ 你原来的错误状态代码
else if (this.errorMsg) {
Text(this.errorMsg).fontColor(Color.Red).margin({ top: 20 });
Button('重新加载').onClick(() => this.loadData()).margin({ top: 10 });
}
// ✅ 替换后的优化版(可选改)
else if (this.errorMsg) {
Column({ space: 15 }) {
Text(this.errorMsg).fontColor('#999').fontSize(16);
Button('重新加载').onClick(() => this.loadData()).backgroundColor('#007AFF');
}
.padding(40)
.layoutWeight(1)
.justifyContent(FlexAlign.Center);
}
🎯 改动 3:简化生命周期(可选)
把你原来单独的 onPageShow() 函数:
// ❌ 你原来的写法(保留也能用,不用改)
onPageShow(): void {
this.loadData();
}
替换成 Column 的链式调用(写在 build() 里的 Column 最后):
// ✅ 简化写法(可选改)
Column() {
// 里面的加载/错误/空数据/列表逻辑
}
.width('100%')
.height('100%')
.padding(10)
.onPageShow(() => this.loadData()); // 把生命周期写在这
🧪 【步骤5】真机验证:让代码“在鸿蒙设备上活起来”
5.1 设备连接
- 🖥️ 模拟器:启动鸿蒙模拟器
5.2 运行+截图
- 点击“Run”→ 看设备上的列表是否正常加载


📤 【步骤6】代码提交:让别人也能“抄作业”
6.1 Git提交
✅ 已包含的必要文件
配置文件:build-profile.json5、hvigorfile.ts、oh-package.json5 都齐全,这是工程能正常编译的基础。
源码目录:entry 和 AppScope 都在,包含了你的页面和应用配置。
忽略规则:.gitignore 已存在,能避免提交不必要的缓存文件。
先执行以下命令,确认本地已有 Git 仓库(有输出则说明已初始化):
git status
如果显示 On branch main 等信息,说明仓库正常,直接往下做即可。
添加本次修改的文件到暂存区
添加所有修改 / 新增文件:
git add .

git commit -m "feat: <你自己的任务名称>"
6.2 推到AtomGit
- 📦 建公开仓库→ 推代码→ 确保
git clone能直接跑
⚠️ 【避坑指南】新手常踩的5个“坑”
- ❌ 忘开权限:网络请求直接被系统“拦截”
- ❌ HTTP没配置:App连不上非HTTPS接口
- ❌ 三方库不兼容:先查“鸿蒙SDK版本+库版本”是否匹配
- ❌ 没做异常处理:断网时App直接崩溃
- ❌ 长列表用错组件:滑动卡顿(必须用
builder类组件)
🎯 【收尾】今日学习总结+延伸建议
- 📚 必回顾:权限→请求→解析→渲染→验证的全流程
- 🚀 进阶方向:封装网络请求工具类、列表性能优化
欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net
📕个人领域 :Linux/C++/java/AI
🚀 个人主页 :有点流鼻涕 · CSDN
💬 座右铭 : “向光而行,沐光而生。”

更多推荐



所有评论(0)