HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏

HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏

在宽屏设备上,Navigation的mode默认处于Split模式(双栏),但是可以通过设置mode的值来切换单双栏,这里通过AttributeModifier<NavigationModifier>来改变Navigation各属性的值,示例如下:

class NavigationMainModifier implements AttributeModifier<NavigationModifier> {
  navigationMode: NavigationMode = NavigationMode.Auto;

  // 成员变量navigationMode的值改变时,会自动调用此方法
  applyNormalAttribute(instance: NavigationModifier): void {
    instance.mode(this.navigationMode)
  }
}

@Component
struct StartPage {
  @State navigationMainModifier: NavigationMainModifier = new NavigationMainModifier();
  ...

  aboutToAppear(): void {
    this.pathStack.setInterception({
      willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar) => {
        // 由首页发起的跳转,切换成双栏模式
        if (from == 'navBar') {
          this.navigationMainModifier.navigationMode = NavigationMode.Split;
          // 跳转到首页,切换成单栏模式
        } else if (to == 'navBar') {
          this.navigationMainModifier.navigationMode = NavigationMode.Stack;
        }
      }
    })
  }

  build() {
    Navigation(this.pathStack) {
      ...
    }.title('主页面')
    .attributeModifier(this.navigationMainModifier)
  }
}

效果如下:

效果

完整示例如下:

import { NavigationModifier } from "@kit.ArkUI";

class NavigationMainModifier implements AttributeModifier<NavigationModifier> {
  navigationMode: NavigationMode = NavigationMode.Auto;

  // 成员变量navigationMode的值改变时,会自动调用此方法
  applyNormalAttribute(instance: NavigationModifier): void {
    instance.mode(this.navigationMode)
  }
}

@ComponentV2
struct Page01 {
  pathStack: NavPathStack | undefined = undefined;

  build() {
    NavDestination() {
      Button('push 页面1').width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.pathStack?.pushPath({ name: 'Page01' });
        })
      Button(`pop`).width('80%').margin({ top: 10, bottom: 10 })
        .onClick(() => {
          this.pathStack?.pop();
        })
    }.title('页面1')
    .onReady((context: NavDestinationContext) => {
      this.pathStack = context.pathStack;
    })
  }
}

@Entry
@Component
struct StartPage {
  pathStack: NavPathStack = new NavPathStack();
  @State navigationMainModifier: NavigationMainModifier = new NavigationMainModifier();

  @Builder
  pagesMap(name: string) {
    if (name == 'Page01') {
      Page01()
    }
  }

  aboutToAppear(): void {
    this.pathStack.setInterception({
      willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar) => {
        // 由首页发起的跳转,切换成双栏模式
        if (from == 'navBar') {
          this.navigationMainModifier.navigationMode = NavigationMode.Split;
          // 跳转到首页,切换成单栏模式
        } else if (to == 'navBar') {
          this.navigationMainModifier.navigationMode = NavigationMode.Stack;
        }
      }
    })
  }

  build() {
    Navigation(this.pathStack) {
      Column() {
        Button('push 页面1').width('80%').margin({ top: 10, bottom: 10 })
          .onClick(() => {
            this.pathStack.pushPath({ name: 'Page01' });
          })
      }
    }.title('主页面')
    .titleMode(NavigationTitleMode.Mini)
    .mode(NavigationMode.Stack)
    .attributeModifier(this.navigationMainModifier)
    .navDestination(this.pagesMap)
  }
}

更多关于HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

666

更多关于HarmonyOS 鸿蒙Next应用开发中,Navigation初始时单栏跳转后双栏的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next应用开发中,Navigation组件支持单栏和双栏布局切换。初始时设置为单栏布局,跳转后可通过配置切换为双栏布局。具体实现需在Navigation组件中设置mode属性为singlesplit,并在跳转时动态调整。通过NavigationsetMode方法或路由配置实现布局切换。

在HarmonyOS Next中,通过AttributeModifier动态调整Navigation的mode属性是正确做法。您的代码实现了从单栏(Stack)到双栏(Split)的切换逻辑,主要注意以下几点:

  1. NavigationMainModifier类实现了AttributeModifier接口,通过applyNormalAttribute方法响应mode变化

  2. 在willShow拦截器中:

  • 当从导航栏跳转时(from==‘navBar’)设置为Split双栏模式
  • 当跳转回导航栏时(to==‘navBar’)设置为Stack单栏模式
  1. 初始通过.mode(NavigationMode.Stack)设置默认单栏模式

这种模式切换方式适合宽屏设备上的主从页面场景,首页作为主导航保持单栏,进入子页面后切换为双栏显示。注意确保pathStack正确传递到子组件。

回到顶部