顺 “瓜” 摸 “藤”(鸿蒙开发)—— 3. 应用的侧边栏(仿小红书📕)

1. 引子

我们在开发时,会有突发奇想或者看到好的设计,希望能够模仿,但是会有处于毫无头绪的时候,不知道该如何下手,这就相当于一个考试,给你一个题目叫你作答,但不同于校园考试,他并不是在给定你范围并且复习的情况下进行作答。它是未知的,并不是顺藤摸瓜,总会遇到你所不清楚的内容,我希望能够通过案例顺瓜摸藤进行学习,通过“瓜”来推出是什么“藤”。

2. 注

这些案例都是现有APP的形式进行推论,因本人能力有限,可能不会是最优方案,如果您有更优方案,欢迎指出并讨论。
从顺“瓜”摸“藤”系列第三个案例开始,不再开发状态管理V1版本,只开发V2版本,若不分基础与进阶表示该案例处于相对复杂的案例。
该系列的代码全部开源

在github
https://github.com/JinnyWang-Space/HMOS_Space
或者gitee
https://gitee.com/jinnywang/HMOS_Space
上均可查看,下载使用

3. 案例

应用的侧边栏
小红书的案例是侧边栏的一种,后续会持续更新其他类型侧边栏,以其他APP为案例。

循环播放
已暂停

视频加载中...

小📕

案例分析

1. 应用的侧边栏通过左上角的按钮控制,侧边栏展开时覆盖当前整个页面。
2. 侧边栏展开时,只能通过返回键 / 系统滑动返回或者点击侧边栏以外的页面进行关闭,侧边栏是不可滑动关闭。
3. 侧边栏展开时,被覆盖的页面可以看出有明显的变暗效果,并且内容区处于不可交互状态。
4. 侧边栏展开时,无论什么情况,一旦进入前台,则会自动关闭侧边栏。
5. 仔细观察会发现,不一定点击按钮展开侧边栏,实际点击效果区域会比按钮大小要大。

5. 代码

5.1 状态管理V2版

5.1.1 数据中心

ArkTS
1// 小红薯数据中心(UI状态存储)
2@ObservedV2
3export class RBTmpDataV2 {
4  // 监听侧边栏是否显示
5  @Trace isShowSideBar: boolean = false;
6}

5.1.2 UIAbility组件

用于控制在应用进到前台时,进行数据变化(即:侧边栏处于开启时,关闭)

ArkTS
1export default class EntryAbility extends UIAbility { 
2  rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
3  // 其他生命周期,不要去掉,去错会出现问题
4  ...
5    
6  // 应用进入前台(随时)
7  onDidForeground(): void {
8    // 如果当前控制栏处于打开状,则关闭
9    if (this.rbTmpDataV2.isShowSideBar) {
10      animateToImmediately({
11        duration: 200,
12        curve: Curve.Linear
13      }, () => {
14        this.rbTmpDataV2.isShowSideBar = false;

5.1.3 视图页面

ArkTS
1import { AppStorageV2, promptAction } from "@kit.ArkUI";
2import { RBTmpDataV2 } from "../viewmodel/RBTmpData";
3
4// 3. 应用的侧边栏(小红书)
5// V2 版代码
6@ComponentV2
7export struct SideBarRedBookV2 {
8  // 创建 APPStorageV2 存储小红书全局 UI 的数据中心
9  @Local rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
10
11  // 侧边栏区
12  @Builder
13  sidebarView() {
14    Column({ space: 8 }) {

5.1.4 入口页面

ArkTS
1import { AppStorageV2 } from '@kit.ArkUI';
2import { SideBarRedBookV2 } from '../view/SideBarView';
3import { RBTmpDataV2 } from '../viewmodel/RBTmpData';
4 
5@Entry
6@ComponentV2
7struct Index {
8  // 创建 APPStorageV2 存储小红薯全局 UI 的数据中心
9  @Local rbTmpDataV2: RBTmpDataV2 = AppStorageV2.connect<RBTmpDataV2>(RBTmpDataV2, () => new RBTmpDataV2())!;
10  
11  // 系统返回操作
12  // true 代表拦截返回操作,false 代表不拦截返回操作
13  onBackPress(): boolean | void {
14    if (this.rbTmpDataV2.isShowSideBar) {

6. 实现效果

循环播放
已暂停

视频加载中...

实现效果

实现效果

1. 点击右上角按钮,侧边栏展开并且覆盖当前页面。
2. 侧边栏展开时,通过返回键 / 系统滑动返回或者点击侧边栏以外的页面进行关闭,侧边栏不可滑动关闭。
3. 侧边栏展开时,被覆盖的页面可以看出有明显的变暗效果,并且内容区处于不可交互状态,只有侧边栏关闭时,内容区才可进行交互。
4. 侧边栏展开时,无论什么情况,一旦应用进入前台,则会自动关闭侧边栏。

🎉 恭喜你!完成鸿蒙开发案例中的应用的侧边栏