在这里插入图片描述

引言

关于页面是应用的重要组成部分,向用户展示应用信息、版本号、隐私政策和用户协议。本文将实现:

  • 应用介绍
  • 版本信息
  • 隐私政策展示
  • 用户协议展示
  • 更新日志

通过本文,你将掌握如何构建一个完整的关于页面。


学习目标

完成本文后,你将能够:

  • ✅ 实现应用介绍页面
  • ✅ 显示版本信息
  • ✅ 添加隐私政策
  • ✅ 展示用户协议
  • ✅ 添加更新日志

需求分析

功能模块设计

模块 功能描述 技术要点
应用介绍 展示应用功能和特色 图文展示、段落排版
版本信息 显示当前版本号 文本展示、更新检查
隐私政策 展示隐私声明 WebView或文本展示
用户协议 展示服务条款 WebView或文本展示
更新日志 展示版本更新内容 列表展示

设计思路

方案对比

方案 优点 缺点 适用场景
图文介绍 视觉效果好,品牌形象突出 加载稍慢,图片资源占用大 推荐 - 适合大多数应用
纯文字介绍 加载快,资源占用小 视觉效果一般,吸引力不足 工具类或轻量应用
视频介绍 生动形象,信息传递更全面 流量消耗大,加载时间长 大型应用或品牌宣传
卡片式介绍 层次分明,信息结构清晰 设计复杂度较高 功能较多的应用

关键决策

决策1: 使用大图背景+渐变遮罩

  • 原因:增加视觉吸引力,突出品牌形象,营造主题氛围
  • 优势:用户进入页面就能感受到应用的主题和风格
  • 技术实现:使用 Stack 组件叠加背景图和渐变遮罩,确保文字可读

决策2: 更新日志使用列表展示

  • 原因:日志内容结构化展示,便于阅读和快速浏览
  • 优势:用户可以快速了解每个版本的更新内容
  • 设计细节:版本号加粗突出,日期用灰色弱化,更新项用圆形标记

决策3: 法律信息使用独立入口

  • 原因:法律文件内容较多,需要单独页面展示以确保可读性
  • 优势:符合合规要求,用户体验更好
  • 入口设计:使用列表项形式,点击跳转详情页

决策4: 检查更新功能

  • 原因:方便用户获取最新版本功能
  • 优势:提升用户体验,促进版本更新
  • 实现方式:点击后检查版本并提示用户

架构设计

// 更新日志数据模型
interface ChangelogItem {
  version: string;    // 版本号
  date: string;       // 更新日期
  content: string[];  // 更新内容列表
}

// 页面状态管理
@State version: string = '1.0.0';           // 当前版本号
@State changelog: ChangelogItem[] = [];      // 更新日志列表
@State isCheckingUpdate: boolean = false;    // 更新检查状态

页面结构规划

区域 功能 组件
顶部导航 返回按钮 + 标题 Row + Image + Text
应用介绍 背景图 + Logo + 名称 + 描述 Stack + Image + Column
功能特色 功能列表展示 Card + Column + Row
版本信息 当前版本 + 检查更新 Card + Row
更新日志 版本更新记录列表 Card + ForEach
法律信息 隐私政策、用户协议入口 Card + Column + Divider
底部版权 版权信息 Column + Text

视觉设计要点

  1. 色彩方案

    • 主色调:#4A9B6D(绿色系,体现自然、节气主题)
    • 背景色:#F8F7F2(浅米色,舒适阅读体验)
    • 文字颜色:标题 #333333,描述 #666666,辅助 #999999
  2. 间距规范

    • 卡片间距:12vp
    • 内边距:16vp
    • 元素间距:8-16vp
  3. 卡片设计

    • 使用 Card 组件增加层次感
    • 圆角:8vp
    • 阴影:轻微阴影提升立体感

核心实现

步骤1: 页面结构设计

完整代码
// pages/About.ets

import router from '@ohos.router';
import prompt from '@ohos.prompt';

@Entry
@Component
struct About {
  // 当前版本
  @State version: string = '1.0.0';
  
  // 更新日志
  @State changelog: ChangelogItem[] = [
    { version: '1.0.0', date: '2024-01-15', content: ['首次发布', '支持24节气信息展示', '添加节气详情页面', '实现测验功能'] },
    { version: '0.9.0', date: '2024-01-10', content: ['新增文章模块', '优化首页布局', '修复已知bug'] },
    { version: '0.8.0', date: '2024-01-05', content: ['实现收藏功能', '添加学习记录', '优化性能'] }
  ];
  
  /**
   * 检查更新
   */
  checkUpdate(): void {
    prompt.showToast({ message: '当前已是最新版本' });
  }
  
  /**
   * 构建UI
   */
  build() {
    Scroll() {
      Column({ space: 0 }) {
        // 1. 顶部导航
        this.buildHeader()
        
        // 2. 应用介绍
        this.buildAppIntro()
        
        // 3. 功能特色
        this.buildFeatures()
        
        // 4. 版本信息
        this.buildVersionInfo()
        
        // 5. 更新日志
        this.buildChangelog()
        
        // 6. 法律信息
        this.buildLegalInfo()
        
        // 7. 底部版权
        this.buildFooter()
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F8F7F2')
  }
}

interface ChangelogItem {
  version: string;
  date: string;
  content: string[];
}
代码解析

1. 状态管理

  • version: 当前版本号
  • changelog: 更新日志列表

2. 页面结构

  • 顶部导航
  • 应用介绍
  • 功能特色
  • 版本信息
  • 更新日志
  • 法律信息
  • 底部版权

步骤2: 顶部导航

/**
 * 构建顶部导航
 */
@Builder
buildHeader(): void {
  Row({ space: 16 }) {
    Image($r('app.media.ic_back'))
      .width(24)
      .height(24)
      .fillColor('#333333')
      .onClick(() => {
        try {
          router.back();
        } catch (error) {
          console.error('返回失败: ' + JSON.stringify(error));
        }
      })
    
    Text('关于我们')
      .fontSize(18)
      .fontWeight(FontWeight.Bold)
      .fontColor('#333333')
    
    Blank()
  }
  .width('100%')
  .height(56)
  .padding({ left: 16, right: 16 })
  .backgroundColor('#FFFFFF')
}

设计要点:

  • 返回按钮
  • 标题居中
  • 简洁的导航栏

步骤3: 应用介绍

/**
 * 构建应用介绍
 */
@Builder
buildAppIntro(): void {
  Stack({ alignContent: Alignment.BottomStart }) {
    // 背景图
    Image($r('app.media.ic_app_banner'))
      .width('100%')
      .height(200)
      .objectFit(ImageFit.Cover)
    
    // 渐变遮罩
    Row()
      .width('100%')
      .height(200)
      .linearGradient({
        angle: 180,
        colors: [
          ['#00000000', 0.3],
          ['#000000DD', 1]
        ]
      })
    
    // 内容
    Column({ space: 8 }) {
      // 应用图标和名称
      Row({ space: 12 }) {
        Stack({ alignContent: Alignment.Center }) {
          Circle()
            .width(64)
            .height(64)
            .fillColor('#4A9B6D')
          
          Text('节')
            .fontSize(32)
            .fontWeight(FontWeight.Bold)
            .fontColor('#FFFFFF')
        }
        
        Column({ space: 4 }) {
          Text('节气通')
            .fontSize(20)
            .fontWeight(FontWeight.Bold)
            .fontColor('#FFFFFF')
          
          Text('探索二十四节气的奥秘')
            .fontSize(14)
            .fontColor('#FFFFFF')
            .opacity(0.8)
        }
      }
    }
    .padding(16)
    .width('100%')
  }
  .width('100%')
}

设计要点:

  • 大图背景
  • 渐变遮罩
  • 应用图标和名称

步骤4: 功能特色

/**
 * 构建功能特色
 */
@Builder
buildFeatures(): void {
  Card() {
    Column({ space: 16 }) {
      // 标题
      Text('功能特色')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .fontColor('#333333')
      
      // 特色列表
      Column({ space: 12 }) {
        this.buildFeatureItem(
          $r('app.media.ic_calendar'),
          '节气日历',
          '完整展示24节气,了解每个节气的特点和习俗'
        )
        
        this.buildFeatureItem(
          $r('app.media.ic_book'),
          '知识百科',
          '丰富的节气知识,包括气候、养生、食谱等'
        )
        
        this.buildFeatureItem(
          $r('app.media.ic_test'),
          '知识测验',
          '检验学习成果,巩固节气知识'
        )
        
        this.buildFeatureItem(
          $r('app.media.ic_star'),
          '学习记录',
          '记录学习历程,追踪学习进度'
        )
      }
    }
    .padding(16)
  }
  .width('92%')
  .margin({ left: '4%', right: '4%', top: 12 })
}

/**
 * 构建特色项
 */
@Builder
buildFeatureItem(icon: Resource, title: string, desc: string): void {
  Row({ space: 12 }) {
    Stack({ alignContent: Alignment.Center }) {
      Circle()
        .width(48)
        .height(48)
        .fillColor('#E8F5E9')
      
      Image(icon)
        .width(24)
        .height(24)
        .fillColor('#4A9B6D')
    }
    
    Column({ space: 4 }) {
      Text(title)
        .fontSize(15)
        .fontWeight(FontWeight.Medium)
        .fontColor('#333333')
      
      Text(desc)
        .fontSize(13)
        .fontColor('#666666')
    }
    .flexGrow(1)
  }
}

设计要点:

  • 图标+标题+描述
  • 列表布局
  • 绿色主题色调

步骤5: 版本信息

/**
 * 构建版本信息
 */
@Builder
buildVersionInfo(): void {
  Card() {
    Column({ space: 12 }) {
      // 版本号
      Row({ space: 8 }) {
        Image($r('app.media.ic_info'))
          .width(20)
          .height(20)
          .fillColor('#999999')
        
        Text('版本信息')
          .fontSize(16)
          .fontColor('#333333')
        
        Blank()
        
        Text('v' + this.version)
          .fontSize(14)
          .fontColor('#999999')
      }
      
      // 检查更新
      Row({ space: 8 }) {
        Image($r('app.media.ic_update'))
          .width(20)
          .height(20)
          .fillColor('#4A9B6D')
        
        Text('检查更新')
          .fontSize(16)
          .fontColor('#333333')
          .flexGrow(1)
        
        Image($r('app.media.ic_arrow_right'))
          .width(16)
          .height(16)
          .fillColor('#CCCCCC')
      }
      .onClick(() => {
        this.checkUpdate();
      })
    }
    .padding(16)
  }
  .width('92%')
  .margin({ left: '4%', right: '4%', top: 12 })
}

设计要点:

  • 版本号展示
  • 检查更新按钮

步骤6: 更新日志

/**
 * 构建更新日志
 */
@Builder
buildChangelog(): void {
  Card() {
    Column({ space: 16 }) {
      // 标题
      Row({ space: 8 }) {
        Image($r('app.media.ic_history'))
          .width(20)
          .height(20)
          .fillColor('#4A9B6D')
        
        Text('更新日志')
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .fontColor('#333333')
      }
      
      // 日志列表
      Column({ space: 16 }) {
        ForEach(this.changelog, (item: ChangelogItem) => {
          Column({ space: 8 }) {
            // 版本和日期
            Row({ space: 8 }) {
              Text(item.version)
                .fontSize(15)
                .fontWeight(FontWeight.Bold)
                .fontColor('#333333')
              
              Text(item.date)
                .fontSize(13)
                .fontColor('#999999')
            }
            
            // 更新内容
            Column({ space: 4 }) {
              ForEach(item.content, (content: string) => {
                Row({ space: 8 }) {
                  Circle()
                    .width(6)
                    .height(6)
                    .fillColor('#4A9B6D')
                  
                  Text(content)
                    .fontSize(14)
                    .fontColor('#666666')
                }
              })
            }
          }
        })
      }
    }
    .padding(16)
  }
  .width('92%')
  .margin({ left: '4%', right: '4%', top: 12 })
}

设计要点:

  • 版本号+日期
  • 更新内容列表
  • 圆形列表项标记

步骤7: 法律信息

/**
 * 构建法律信息
 */
@Builder
buildLegalInfo(): void {
  Card() {
    Column({ space: 0 }) {
      // 隐私政策
      this.buildLegalItem(
        $r('app.media.ic_shield'),
        '隐私政策',
        () => {
          prompt.showToast({ message: '隐私政策页面开发中' });
        }
      )
      
      Divider()
        .width('100%')
        .color('#EEEEEE')
        .height(1)
      
      // 用户协议
      this.buildLegalItem(
        $r('app.media.ic_file'),
        '用户协议',
        () => {
          prompt.showToast({ message: '用户协议页面开发中' });
        }
      )
      
      Divider()
        .width('100%')
        .color('#EEEEEE')
        .height(1)
      
      // 第三方服务
      this.buildLegalItem(
        $r('app.media.ic_link'),
        '第三方服务',
        () => {
          prompt.showToast({ message: '第三方服务页面开发中' });
        }
      )
    }
  }
  .width('92%')
  .margin({ left: '4%', right: '4%', top: 12 })
}

/**
 * 构建法律项
 */
@Builder
buildLegalItem(icon: Resource, title: string, onClick: () => void): void {
  Row({ space: 12 }) {
    Image(icon)
      .width(20)
      .height(20)
      .fillColor('#999999')
    
    Text(title)
      .fontSize(15)
      .fontColor('#333333')
      .flexGrow(1)
    
    Image($r('app.media.ic_arrow_right'))
      .width(16)
      .height(16)
      .fillColor('#CCCCCC')
  }
  .width('100%')
  .height(52)
  .padding({ left: 16, right: 16 })
  .onClick(onClick)
}

设计要点:

  • 隐私政策入口
  • 用户协议入口
  • 第三方服务入口

步骤8: 底部版权

/**
 * 构建底部版权
 */
@Builder
buildFooter(): void {
  Column({ space: 8 }) {
    Text('节气通 v' + this.version)
      .fontSize(14)
      .fontColor('#999999')
    
    Text('Copyright 2024 JieQiTong. All rights reserved.')
      .fontSize(12)
      .fontColor('#BBBBBB')
  }
  .width('100%')
  .padding({ top: 24, bottom: 100 })
  .alignItems(HorizontalAlign.Center)
}

设计要点:

  • 应用名称和版本
  • 版权信息

常见问题与解决方案

问题1: 背景图显示不全或拉伸变形

现象:
顶部背景图只显示部分内容,或者图片被拉伸变形。

原因分析:

  • 图片尺寸与屏幕比例不匹配
  • objectFit 属性设置不当
  • 图片资源本身尺寸不足

解决方案:

// ✅ 正确的图片显示配置
Stack({ alignContent: Alignment.BottomStart }) {
  // 背景图
  Image($r('app.media.ic_app_banner'))
    .width('100%')
    .height(200)
    .objectFit(ImageFit.Cover)  // 使用Cover模式保持比例
    .onError(() => {
      console.error('背景图加载失败');
    })
  
  // 渐变遮罩
  Row()
    .width('100%')
    .height(200)
    .linearGradient({
      angle: 180,
      colors: [
        ['#00000000', 0.3],
        ['#000000DD', 1]
      ]
    })
  // ... 内容
}

图片适配建议:

// 根据不同屏幕尺寸选择合适的图片
getBannerImage(): Resource {
  const screenWidth = px2vp(windowWidth);
  if (screenWidth > 1080) {
    return $r('app.media.ic_app_banner_large');
  } else if (screenWidth > 720) {
    return $r('app.media.ic_app_banner_medium');
  } else {
    return $r('app.media.ic_app_banner_small');
  }
}

问题2: 更新日志列表渲染错误或卡顿

现象:
ForEach 渲染更新日志时出错,或者列表滚动卡顿。

原因分析:

  • 缺少 key 生成函数
  • 数据结构不正确
  • 嵌套 ForEach 没有正确设置 key
  • 列表项过多导致性能问题

解决方案:

// ✅ 正确的嵌套列表渲染
Column({ space: 16 }) {
  ForEach(this.changelog, (item: ChangelogItem) => {
    Column({ space: 8 }) {
      // 版本信息
      Row({ space: 8 }) {
        Text(item.version).fontSize(15).fontWeight(FontWeight.Bold)
        Text(item.date).fontSize(13).fontColor('#999')
      }
      
      // 更新内容(嵌套ForEach)
      Column({ space: 4 }) {
        ForEach(item.content, (content: string) => {
          Row({ space: 8 }) {
            Circle().width(6).height(6).fillColor('#4A9B6D')
            Text(content).fontSize(14).fontColor('#666')
          }
        }, (content: string) => content)  // 内层key生成函数
      }
    }
  }, (item: ChangelogItem) => item.version)  // 外层key生成函数
}

性能优化:

// ✅ 使用LazyForEach优化大数据量列表
List({ space: 16 }) {
  LazyForEach(this.changelogDataSource, (item: ChangelogItem) => {
    ListItem() {
      Column({ space: 8 }) {
        Row({ space: 8 }) {
          Text(item.version).fontSize(15).fontWeight(FontWeight.Bold)
          Text(item.date).fontSize(13).fontColor('#999')
        }
        Column({ space: 4 }) {
          ForEach(item.content, (content: string) => {
            Row({ space: 8 }) {
              Circle().width(6).height(6).fillColor('#4A9B6D')
              Text(content).fontSize(14).fontColor('#666')
            }
          }, (content: string) => content)
        }
      }
      .padding(16)
    }
  }, (item: ChangelogItem) => item.version)
}
.width('100%')
.cachedCount(3)  // 预加载3个列表项

问题3: 检查更新功能不工作或无响应

现象:
点击检查更新按钮没有反应,或者没有显示任何提示。

原因分析:

  • 点击事件没有正确绑定
  • 缺少异常处理
  • 状态管理问题
  • API调用失败

解决方案:

// ✅ 完整的检查更新实现
@State isCheckingUpdate: boolean = false;

checkUpdate(): void {
  if (this.isCheckingUpdate) {
    return;  // 防止重复调用
  }
  
  this.isCheckingUpdate = true;
  
  // 模拟版本检查
  setTimeout(() => {
    try {
      // 模拟检查逻辑
      const hasUpdate = false;  // 实际应调用API
      
      if (hasUpdate) {
        prompt.showDialog({
          title: '发现新版本',
          message: '有新版本可用,是否更新?',
          buttons: [
            { text: '稍后', color: '#666' },
            { text: '立即更新', color: '#4A9B6D' }
          ]
        }).then((result) => {
          if (result.index === 1) {
            // 跳转到应用市场
            prompt.showToast({ message: '正在跳转到应用市场...' });
          }
        });
      } else {
        prompt.showToast({ message: '当前已是最新版本' });
      }
    } catch (error) {
      console.error('检查更新失败: ', error);
      prompt.showToast({ message: '检查更新失败,请稍后重试' });
    } finally {
      this.isCheckingUpdate = false;
    }
  }, 1000);
}

// 按钮绑定
buildCheckUpdateButton(): void {
  Row({ space: 8 }) {
    Image($r('app.media.ic_update')).width(20).height(20).fillColor('#4A9B6D')
    Text(this.isCheckingUpdate ? '检查中...' : '检查更新')
      .fontSize(16)
      .fontColor('#333')
      .flexGrow(1)
    if (!this.isCheckingUpdate) {
      Image($r('app.media.ic_arrow_right')).width(16).height(16).fillColor('#CCC')
    }
  }
  .width('100%')
  .padding(16)
  .onClick(() => {
    if (!this.isCheckingUpdate) {
      this.checkUpdate();
    }
  })
}

问题4: 页面滚动不流畅或卡顿

现象:
页面滚动时有卡顿现象,尤其是在低端设备上。

原因分析:

  • 页面元素过多,渲染压力大
  • 没有使用虚拟列表优化
  • 图片没有懒加载
  • 复杂的布局计算

解决方案:

// ✅ 使用Scroll包裹整个内容
Scroll() {
  Column({ space: 0 }) {
    this.buildHeader()
    this.buildAppIntro()
    this.buildFeatures()
    this.buildVersionInfo()
    this.buildChangelog()
    this.buildLegalInfo()
    this.buildFooter()
  }
}
.width('100%')
.height('100%')
.backgroundColor('#F8F7F2')
.scrollable(ScrollDirection.Vertical)
.scrollBar(BarState.Off)  // 隐藏滚动条提升视觉效果

进一步优化:

// ✅ 使用LazyForEach优化更新日志列表
buildChangelog(): void {
  Card() {
    Column({ space: 16 }) {
      // 标题
      Row({ space: 8 }) {
        Image($r('app.media.ic_history')).width(20).height(20).fillColor('#4A9B6D')
        Text('更新日志').fontSize(18).fontWeight(FontWeight.Bold).fontColor('#333')
      }
      
      // 使用List + LazyForEach
      List({ space: 16 }) {
        LazyForEach(this.changelog, (item: ChangelogItem) => {
          ListItem() {
            this.buildChangelogItem(item)
          }
        }, (item: ChangelogItem) => item.version)
      }
      .width('100%')
      .cachedCount(3)
    }
    .padding(16)
  }
  .width('92%')
  .margin({ left: '4%', right: '4%', top: 12 })
}

问题5: 版权信息显示位置不正确或被遮挡

现象:
底部版权信息被TabBar遮挡,或者显示位置过高。

原因分析:

  • 底部 padding 不足
  • TabBar高度计算不准确
  • 页面布局结构问题

解决方案:

// ✅ 正确的底部版权设计
buildFooter(): void {
  Column({ space: 8 }) {
    Text('节气通 v' + this.version)
      .fontSize(14)
      .fontColor('#999999')
    
    Text('Copyright 2024 JieQiTong. All rights reserved.')
      .fontSize(12)
      .fontColor('#BBBBBB')
  }
  .width('100%')
  .padding({ top: 24, bottom: 100 })  // 底部padding留出TabBar空间
  .alignItems(HorizontalAlign.Center)
}

动态计算TabBar高度:

// ✅ 根据实际TabBar高度调整
get tabBarHeight(): number {
  // 通常TabBar高度为56vp或60vp
  return 56;
}

buildFooter(): void {
  Column({ space: 8 }) {
    Text('节气通 v' + this.version).fontSize(14).fontColor('#999')
    Text('Copyright 2024 JieQiTong. All rights reserved.').fontSize(12).fontColor('#BBB')
  }
  .width('100%')
  .padding({ 
    top: 24, 
    bottom: this.tabBarHeight + 20  // TabBar高度 + 额外间距
  })
  .alignItems(HorizontalAlign.Center)
}

问题6: 功能特色列表渲染错误

现象:
功能特色列表项显示不正确,或者布局混乱。

原因分析:

  • flexGrow 设置不当
  • 布局嵌套层级问题
  • 图标尺寸不一致

解决方案:

// ✅ 正确的功能特色项布局
@Builder
buildFeatureItem(icon: Resource, title: string, desc: string): void {
  Row({ space: 12 }) {
    // 图标区域(固定大小)
    Stack({ alignContent: Alignment.Center }) {
      Circle()
        .width(48)
        .height(48)
        .fillColor('#E8F5E9')
      
      Image(icon)
        .width(24)
        .height(24)
        .fillColor('#4A9B6D')
    }
    .flexShrink(0)  // 防止被压缩
    
    // 文字区域(自动扩展)
    Column({ space: 4 }) {
      Text(title)
        .fontSize(15)
        .fontWeight(FontWeight.Medium)
        .fontColor('#333333')
      
      Text(desc)
        .fontSize(13)
        .fontColor('#666666')
        .maxLines(2)  // 最多显示2行
        .textOverflow({ overflow: TextOverflow.Ellipsis })
    }
    .flexGrow(1)  // 占据剩余空间
    .alignItems(HorizontalAlign.Start)  // 左对齐
  }
  .width('100%')
}

问题7: 法律信息点击无响应

现象:
点击隐私政策、用户协议等法律信息项没有跳转。

原因分析:

  • 点击事件没有绑定
  • 路由跳转失败
  • 权限问题

解决方案:

// ✅ 正确的法律项点击处理
@Builder
buildLegalItem(icon: Resource, title: string, pageUrl: string): void {
  Row({ space: 12 }) {
    Image(icon)
      .width(20)
      .height(20)
      .fillColor('#999999')
    
    Text(title)
      .fontSize(15)
      .fontColor('#333333')
      .flexGrow(1)
    
    Image($r('app.media.ic_arrow_right'))
      .width(16)
      .height(16)
      .fillColor('#CCCCCC')
  }
  .width('100%')
  .height(52)
  .padding({ left: 16, right: 16 })
  .onClick(() => {
    this.navigateToLegalPage(pageUrl, title);
  })
}

// 统一的跳转方法
navigateToLegalPage(pageUrl: string, title: string): void {
  try {
    router.pushUrl({
      url: pageUrl,
      params: { title: title }
    });
  } catch (error) {
    console.error('跳转失败: ', error);
    prompt.showToast({ message: '页面开发中,敬请期待' });
  }
}

问题8: 应用图标显示为空白

现象:
应用介绍区域的图标显示为空白或默认图标。

原因分析:

  • 图标资源不存在或路径错误
  • 资源ID拼写错误
  • 图标尺寸不符合要求

解决方案:

// ✅ 正确的图标显示
Stack({ alignContent: Alignment.Center }) {
  Circle()
    .width(64)
    .height(64)
    .fillColor('#4A9B6D')
  
  // 使用文字代替图标(备用方案)
  Text('节')
    .fontSize(32)
    .fontWeight(FontWeight.Bold)
    .fontColor('#FFFFFF')
}

// 或者使用图片图标
Stack({ alignContent: Alignment.Center }) {
  Circle()
    .width(64)
    .height(64)
    .fillColor('#4A9B6D')
  
  Image($r('app.media.ic_app_logo'))
    .width(32)
    .height(32)
    .fillColor('#FFFFFF')
    .onError(() => {
      // 图标加载失败时显示文字
      Text('节')
        .fontSize(32)
        .fontWeight(FontWeight.Bold)
        .fontColor('#FFFFFF')
    })
}

资源检查清单:

  1. 确认资源文件存在于 resources/base/media/ 目录
  2. 确认资源ID在 resources/base/profile/main_pages.json 中注册
  3. 确认资源文件名和ID拼写一致
  4. 确认图片格式正确(png、jpg等)

本章小结

核心知识点

本文完成了关于页面的实现:

1. 应用介绍

  • 大图背景+渐变遮罩
  • 应用图标和名称
  • 简洁的介绍文字

2. 功能特色

  • 图标+标题+描述
  • 列表布局展示

3. 版本信息

  • 当前版本号
  • 检查更新功能

4. 更新日志

  • 版本号+日期
  • 更新内容列表

5. 法律信息

  • 隐私政策入口
  • 用户协议入口
  • 第三方服务入口

6. 底部版权

  • 应用名称和版本
  • 版权信息

下一步预告

关于页面已经完成!在下一篇文章中,我们将学习:

  • 空态页面设计
  • 空状态展示
  • 引导用户操作
  • 个性化空态

节气通应用已发布上线,可在应用市场下载体验


相关

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐