HarmonyOS鸿蒙Next中ArkUI路由/导航系列十一:Navigation弹窗页面开发

HarmonyOS鸿蒙Next中ArkUI路由/导航系列十一:Navigation弹窗页面开发

1、概述

Navigation的子页(NavDesination)具有两种模式:Standard和Dialog,通过NavDestination的mode属性设置。

  • Standard:标准页面,默认具有白色背景,页面栈中仅有最上层的Standard页面可以显示,其他Standard页面会隐藏不可见,且不可刷新状态,一般用于常规的页面信息显示;
  • Dialog:Dialog页面,默认具有透明背景,Dialog页面可在Standard页面之上显示,可同时显示多个,Dialog页面不影响其下层Standard页面的显示和交互,一般用于弹窗信息显示。

示例效果如下:

  • NavDestinationMode.STANDARD

NavDestinationMode.STANDARD

  • NavDestinationMode.DIALOG

NavDestinationMode.DIALOG

需要注意的是:

API version 13之前,Dialog页面默认无系统转场动画。从API version 13开始,默认支持从底部弹出的系统转场动画。

具体动画类型可以参考: NavDestination-导航与切换-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

2、案例分享

这里用Dialog类型的NavDestination来演示一个购物应用的购物车页面场景:

首先定义一个STANDARD类型的产品页,然后产品页有一个购物车按钮,点击该按钮时会弹出一个Dialog页面,而购物车的信息就承载在该Dialog页面。

2.1 Navigation首页

//src/main/ets/pages/Index.ets
@Entry
@Component
struct Index {
  private stack: NavPathStack = new NavPathStack();
  aboutToAppear(): void {
    // 这里为了演示功能,一开始就push一个产品页
    this.stack.pushPath({name: 'Product'})
  }
  build() {
    Navigation(this.stack)
    .hideNavBar(true)
    .height('100%')
    .width('100%')
  }
}

2.2 产品页

//src/main/ets/pages/ProductPage.ets
import { SymbolGlyphModifier } from "@kit.ArkUI";
@Component
struct ProductPage {
  private stack: NavPathStack | undefined = undefined;
  build() {
    NavDestination() {
    }.title('产品页')
    .toolbarConfiguration([
      {
        value: '购物车',
        symbolIcon: new SymbolGlyphModifier($r('sys.symbol.cart')),
        action: () => {
          this.stack?.pushPath({"name":"ShoppingCart"})
        }
      }
    ])
    .mode(NavDestinationMode.STANDARD)
    .onReady((ctx: NavDestinationContext) => {
      this.stack = ctx.pathStack;
    })
  }
}
@Builder
export function ProductPageBuilder() {
  ProductPage()
}

2.3 购物车页

//src/main/ets/pages/ShoppingCartPage.ets
class ProductInfo  {
  // 产品名称
  name: string;
  // 产品数量
  count: number;
  constructor(name: string, count: number) {
    this.name = name;
    this.count = count;
  }
}
@Component
struct ShoppingCartPage {
  private stack: NavPathStack | undefined = undefined;
  private products: Array<ProductInfo> = new Array<ProductInfo>();
  aboutToAppear(): void {
    // 这里假设购物车中已经有一些产品了
    for (let i = 0; i < 50; i++) {
      this.products.push(new ProductInfo(`产品${i}`, i + 1));
    }
  }
  build() {
    NavDestination() {
      Column() {
        Blank().onClick(() => {
          // 点击Dialog页面空白区域时会自动返回到产品页
          this.stack?.pop()
        }).width('100%').layoutWeight(1)
        Column() {
          // 购物车列表
          Text('购物车').fontSize(20).margin(8)
          List() {
            ForEach(this.products, (info: ProductInfo, index: number) => {
              ListItem() {
                Row() {
                  Text(`${info.name}`).margin(12).fontSize(18).fontColor(Color.Black)
                  Text(`数量:${info.count}`).fontSize(13).margin({right: 18})
                }.margin({bottom: 15 }).backgroundColor('#fff3dab9').width('100%').justifyContent(FlexAlign.SpaceBetween)
                .borderRadius(15).height(80)
              }.width('100%')
            }, (info: ProductInfo, index: number) => {
              return info.name;
            })
          }
        }.width('100%').layoutWeight(2).backgroundColor('#ffdaf3b5').border({})
      }.width('100%').height('100%')//.backgroundColor('#2df8e8e8')
    }
    .hideTitleBar(true)
    .hideToolBar(true)
    // 购物车页面为Dialog类型页面
    .mode(NavDestinationMode.DIALOG)
    .onReady((ctx: NavDestinationContext) => {
      this.stack = ctx.pathStack;
    })
  }
}
@Builder
export function ShoppingCartPageBuilder() {
  ShoppingCartPage()
}

2.4 demo运行效果

demo运行效果


更多关于HarmonyOS鸿蒙Next中ArkUI路由/导航系列十一:Navigation弹窗页面开发的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,ArkUI的Navigation组件支持弹窗页面开发。使用NavDestination组件定义弹窗内容,通过模态路由(modalRoute)属性设置为true即可实现弹窗效果。弹窗页面层级独立,不会影响主页面栈。

示例代码片段:

@Entry
@Component
struct MainPage {
  build() {
    Navigation() {
      NavDestination() {
        // 主页面内容
      }
      NavDestination({
        modalRoute: true  // 设置为弹窗
      }) {
        // 弹窗内容
      }
    }
  }
}

触发弹窗需使用router.pushUrl()并指定弹窗路由参数。

更多关于HarmonyOS鸿蒙Next中ArkUI路由/导航系列十一:Navigation弹窗页面开发的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个很好的HarmonyOS Next中ArkUI导航弹窗页面开发示例。我来总结几个关键点:

  1. NavDestination的两种模式:
  • STANDARD:标准页面,默认白色背景,仅显示最上层页面
  • DIALOG:弹窗页面,透明背景,可叠加显示在标准页面上
  1. 主要实现步骤:
  • 在Index页面初始化Navigation和NavPathStack
  • 产品页使用STANDARD模式,通过toolbar添加购物车按钮
  • 购物车页使用DIALOG模式,点击空白区域可返回
  • 通过pushPath/pop实现页面跳转
  1. 注意事项:
  • API 13+默认提供底部弹出动画
  • Dialog页面不影响下层Standard页面的交互
  • 可通过onReady获取NavPathStack实例

这个购物车场景很好地展示了Dialog模式的实际应用,代码结构清晰,值得参考。

回到顶部