🚀 鸿蒙跨平台开发 DAY3 保姆级任务通关大纲(零基础友好)

在这里插入图片描述

🌸你好呀!我是 lbb小魔仙
🌟 感谢陪伴~ 小白博主在线求友
🌿 跟着小白学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

在这里插入图片描述
你添加之后在右上角会显示一个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 这个结构体的内部,作为一个类方法。
✅ 正确位置示例
在这里插入图片描述
🎯 精准位置
你要把 fetchDataloadData函数,加在 @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结构体内部,和之前的fetchDataloadData 函数放在一起。
@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.json5hvigorfile.tsoh-package.json5 都齐全,这是工程能正常编译的基础。
源码目录:entryAppScope 都在,包含了你的页面和应用配置。
忽略规则:.gitignore 已存在,能避免提交不必要的缓存文件。
先执行以下命令,确认本地已有 Git 仓库(有输出则说明已初始化):

git status

如果显示 On branch main 等信息,说明仓库正常,直接往下做即可。
在这里插入图片描述

添加本次修改的文件到暂存区
添加所有修改 / 新增文件:

git add .

在这里插入图片描述

git commit -m "feat: <你自己的任务名称>"

6.2 推到AtomGit

  • 📦 建公开仓库→ 推代码→ 确保git clone能直接跑
    在这里插入图片描述

⚠️ 【避坑指南】新手常踩的5个“坑”

  1. ❌ 忘开权限:网络请求直接被系统“拦截”
  2. ❌ HTTP没配置:App连不上非HTTPS接口
  3. ❌ 三方库不兼容:先查“鸿蒙SDK版本+库版本”是否匹配
  4. ❌ 没做异常处理:断网时App直接崩溃
  5. ❌ 长列表用错组件:滑动卡顿(必须用builder类组件)

🎯 【收尾】今日学习总结+延伸建议

  • 📚 必回顾:权限→请求→解析→渲染→验证的全流程
  • 🚀 进阶方向:封装网络请求工具类、列表性能优化

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

📕个人领域 :Linux/C++/java/AI
🚀 个人主页有点流鼻涕 · CSDN
💬 座右铭“向光而行,沐光而生。”

在这里插入图片描述

Logo

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

更多推荐