The Navigation component is the root view container for navigation. It typically functions as the root container of a page and includes a title bar, content area, and toolbar. The content area switches between the home page content (child components of Navigation) and non-home page content (child components of NavDestination) through routing.
This component is supported since API version 8. Updates will be marked with a superscript to indicate their earliest API version.
Since API version 11, this component supports the safe area attribute by default, with the default attribute value being expandSafeArea([SafeAreaType.SYSTEM, SafeAreaType.KEYBOARD, SafeAreaType.CUTOUT], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]). You can override this attribute to change the default behavior. In earlier versions, you need to use the expandSafeArea attribute to implement the safe area feature.
Supported
Since API version 9, it is recommended that this component be used together with the NavRouter component.
Since API version 10, it is recommended that this component be used together with the NavPathStack component and navDestination attribute for page routing.
title(value: ResourceStr | CustomBuilder | NavigationCommonTitle | NavigationCustomTitle, options?: NavigationTitleOptions)
Sets the page title.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | ResourceStr10+ | CustomBuilder | NavigationCommonTitle9+ | NavigationCustomTitle9+ | Yes | Page title. When the NavigationCustomTitle type is used to set the height, titleMode does not take effect. When the title string is too long: (1) If no subtitle is set, the string is scaled down, wrapped in two lines, and then clipped with an ellipsis (...); (2) If a subtitle is set, the subtitle is scaled down and then clipped with an ellipsis (...). |
| options | NavigationTitleOptions11+ | No | Title bar options. |
subTitle(value: string)
Sets the page subtitle.
This API is deprecated since API version 9. You are advised to use title instead.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | string | Yes | Page subtitle. |
titleMode(value: NavigationTitleMode)
Sets the display mode of the page title bar.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | NavigationTitleMode | Yes | Display mode of the page title bar. Default value: NavigationTitleMode.Free |
toolBar(value: object | CustomBuilder)
Sets the content of the toolbar. If this attribute is not set, no toolbar is displayed. Items are evenly distributed on the toolbar at the bottom. Text and icons are evenly distributed in each content area. If the text is too long, it is scaled down level by level, wrapped in two lines, and then clipped with an ellipsis (...).
This API is deprecated since API version 10. You are advised to use toolbarConfiguration instead.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | object | CustomBuilder | Yes | Content of the toolbar. |
object
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | string | Yes | Text of the toolbar item. |
| icon | string | No | Icon path of the toolbar item. |
| action | () => void | No | Callback invoked when the menu item is selected. |
toolbarConfiguration(value: Array<ToolbarItem> | CustomBuilder, options?: NavigationToolbarOptions)
The following are not allowed: modify the icon size through the fontSize attribute of the SymbolGlyphModifier object, change the animation effects through the effectStrategy attribute, or change the type of animation effects through the symbolEffect attribute.
Sets the content of the toolbar. If this attribute is not set, no toolbar is displayed.
Widget capability: Since API version 10, this API is supported in ArkTS widgets.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | Array<ToolbarItem> | CustomBuilder | Yes | Content of the toolbar. When the value type is Array<ToolbarItem, the toolbar exhibits the following features: Items are evenly distributed on the toolbar at the bottom. Text and icons are evenly distributed in each content area. If any item contains overlong text and there are fewer than five items, the following measures are taken: 1. Increase the item's width to accommodate the text until it is as large as the screen width; 2. Scale down the text level by level; 3. Wrap the text in two lines; 4. Clip the text with an ellipsis (...). The toolbar shows a maximum of five icons in portrait mode, with excess icons (if any) placed under the automatically generated More icon. In landscape mode, this attribute must be used together with Array<NavigationMenuItem> of the menus attribute; the toolbar at the bottom is automatically hidden, and all items on the toolbar are moved to the menu in the upper right corner of the screen. When the value type is CustomBuilder, and the toolbar does not exhibit the preceding features except that items are evenly distributed on the toolbar at the bottom. |
| options | NavigationToolbarOptions11+ | No | Toolbar options. |
hideToolBar(value: boolean)
Specifies whether to hide the toolbar.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | boolean | Yes | Whether to hide the toolbar. Default value: false true: Hide the toolbar. false: Show the toolbar. |
hideTitleBar(value: boolean)
Specifies whether to hide the title bar.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | boolean | Yes | Whether to hide the title bar. Default value: false true: Hide the title bar. false: Show the title bar. |
hideBackButton(value: boolean)
Specifies whether to hide the back button in the title bar. The back button is available only when titleMode is set to NavigationTitleMode.Mini.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | boolean | Yes | Whether to hide the back button in the title bar. Default value: false true: Hide the back button. false: Show the back button. |
mode(value: NavigationMode)
Sets the display mode of the navigation bar. Available options are Stack, Split, and Auto.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | NavigationMode | Yes | Display mode of the navigation bar. Default value: NavigationMode.Auto At the default settings, the component adapts to a single column or two columns based on the component width. |
backButtonIcon(value: string | PixelMap | Resource | SymbolGlyphModifier)
The following are not allowed: modify the icon size through the fontSize attribute of the SymbolGlyphModifier object, change the animation effects through the effectStrategy attribute, or change the type of animation effects through the symbolEffect attribute.
Sets the icon of the back button in the title bar.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | string | PixelMap | Resource | SymbolGlyphModifier12+ | Yes | Icon of the back button in the title bar. |
minContentWidth(value: Dimension)
Sets the minimum width of the navigation bar content area (effective in dual-column mode).
For details about the priority rules, see NOTE below.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | Dimension | Yes | Minimum width of the navigation bar content area. Default value: 360 Unit: vp undefined: No action is taken, and the minimum width of the navigation bar remains consistent with the default value. Breakpoint calculation in Auto mode: default 600 vp = minNavBarWidth (240 vp) + minContentWidth (360 vp) |
If only navBarWidth is set, no divider in the Navigation component can be dragged.
navBarWidthRange specifies the range within which the divider can be dragged. If it is not set, the default value is used. The dragging of the divider is subject to both navBarWidthRange and minContentWidth.
If the size of the Navigation component decreases, it carries out the following steps in sequence:
a. Scale down the content area. If minContentWidth is not set, the content area can be scaled down to 0. Otherwise, the content area can be scaled down to as small as the value specified by minContentWidth.b. Scale down the navigation bar until its width reaches the value defined by navBarRange.c. Clip the displayed content.
ignoreLayoutSafeArea(types?: Array<LayoutSafeAreaType>, edges?: Array<LayoutSafeAreaEdge>)
Ignores the layout safe area by allowing the component to extend into the non-safe areas of the screen.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| types | Array <LayoutSafeAreaType> | No | Types of non-safe areas to extend into. Default value: [LayoutSafeAreaType.SYSTEM] |
| edges | Array <LayoutSafeAreaEdge> | No | Edges for expanding the safe area. Default value: [LayoutSafeAreaEdge.TOP, LayoutSafeAreaEdge.BOTTOM] |
After LayoutSafeArea is set:
When LayoutSafeAreaType.SYSTEM is set, the component can extend into the non-safe area if its boundaries overlap with it. For example, if the device's status bar is 100 high, the component must have an absolute vertical offset between 0 and 100 to extend into the non-safe area.
If the component extends into the non-safe area, events triggered within that area (such as click events) might be intercepted by the system. This allows the system to prioritize responses to system components such as the status bar.
systemBarStyle(style: Optional<SystemBarStyle>)
Sets the style of the system status bar when the home page of the Navigation component is displayed.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| style | Optional<SystemBarStyle> | Yes | Style of the system status bar. |
Instructions
onTitleModeChange(callback: (titleMode: NavigationTitleMode) => void)
Called when titleMode is set to NavigationTitleMode.Free and the title bar mode changes as content scrolls.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| titleMode | NavigationTitleMode | Yes | Title mode. |
pushPath(info: NavPathInfo, animated?: boolean): void
Pushes the navigation destination page specified by info to the navigation stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Information about the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
pushPath(info: NavPathInfo, options?: NavigationOptions): void
Pushes the navigation destination page specified by info onto the navigation stack. Depending on the LaunchMode specified in the options parameter, different behaviors will be triggered.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Information about the navigation destination page. |
| options | NavigationOptions | No | Navigation options. |
pushPathByName(name: string, param: unknown, animated?: boolean): void
Pushes the navigation destination page specified by name, with the data specified by param, to the navigation stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | unknown | Yes | Detailed parameters of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
pushPathByName(name: string, param: Object, onPop: Callback<PopInfo>, animated?: boolean): void
Pushes the navigation destination page specified by name, with the data specified by param, to the navigation stack. This API uses the onPop callback to receive the result returned when the page is popped out of the stack.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | Object | Yes | Detailed parameters of the navigation destination page. |
| onPop | Callback<PopInfo> | Yes | Callback used to receive the result. It is invoked only after the result parameter is set in pop. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
pushDestination(info: NavPathInfo, animated?: boolean): Promise<void>
Pushes the navigation destination page specified by info to the navigation stack. This API uses a promise to return the result.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Information about the navigation destination page. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| Promise<void> | Promise used to return the result. |
Error codes
For details about the error codes, see Universal Error Codes and Router Error Codes.
| ID | Error Message |
|---|---|
| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed. |
| 100001 | Internal error. |
| 100005 | Builder function not registered. |
| 100006 | NavDestination not found. |
pushDestination(info: NavPathInfo, options?: NavigationOptions): Promise<void>
Pushes the navigation destination page specified by info onto the navigation stack. This API uses a promise to return the result. Depending on the LaunchMode specified in the options parameter, different behaviors will be triggered.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Information about the navigation destination page. |
| options | NavigationOptions | No | Navigation options. |
Return value
| Type | Description |
|---|---|
| Promise<void> | Promise used to return the result. |
Error codes
For details about the error codes, see Universal Error Codes and Router Error Codes.
| ID | Error Message |
|---|---|
| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed. |
| 100001 | Internal error. |
| 100005 | Builder function not registered. |
| 100006 | NavDestination not found. |
pushDestinationByName(name: string, param: Object, animated?: boolean): Promise<void>
Pushes the navigation destination page specified by name, with the data specified by param, to the navigation stack. This API uses a promise to return the result.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | Object | Yes | Detailed parameters of the navigation destination page. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| Promise<void> | Promise used to return the result. |
Error codes
For details about the error codes, see Universal Error Codes and Router Error Codes.
| ID | Error Message |
|---|---|
| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed. |
| 100001 | Internal error. |
| 100005 | Builder function not registered. |
| 100006 | NavDestination not found. |
pushDestinationByName(name: string, param: Object, onPop: Callback<PopInfo>, animated?: boolean): Promise<void>
Pushes the navigation destination page specified by name, with the data specified by param, to the navigation stack. This API uses the onPop callback to handle the result returned when the page is popped out of the stack. It uses a promise to return the result.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | Object | Yes | Detailed parameters of the navigation destination page. |
| onPop | Callback<PopInfo> | Yes | Callback used to handle the result returned when the page is popped out of the stack. It is invoked only after the result parameter is set in pop. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| Promise<void> | Promise used to return the result. |
Error codes
For details about the error codes, see Universal Error Codes and Router Error Codes.
| ID | Error Message |
|---|---|
| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2.Incorrect parameters types; 3. Parameter verification failed. |
| 100001 | Internal error. |
| 100005 | Builder function not registered. |
| 100006 | NavDestination not found. |
replacePath(info: NavPathInfo, animated?: boolean): void
Replaces the top of the navigation stack with the page specified by info.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Parameters of the page to replace the top of the navigation stack. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
replacePath(info: NavPathInfo, options?: NavigationOptions): void
Replaces the top page on the navigation stack. Depending on the LaunchMode specified in the options parameter, different behaviors will be triggered.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Parameters for the new top page of the navigation stack. |
| options | NavigationOptions | No | Navigation options. |
replacePathByName(name: string, param: Object, animated?: boolean): void
Replaces the top of the navigation stack with the page specified by name.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | Object | Yes | Detailed parameters of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
removeByIndexes(indexes: Array<number>): number
Removes the navigation destination pages specified by indexes from the navigation stack.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| indexes | Array<number> | Yes | Array of indexes of the navigation destination pages to remove. |
Return value
| Type | Description |
|---|---|
| number | Number of the navigation destination pages removed. |
removeByName(name: string): number
Removes the navigation destination page specified by name from the navigation stack.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page to remove. |
Return value
| Type | Description |
|---|---|
| number | Number of the navigation destination pages removed. |
pop(animated?: boolean): NavPathInfo | undefined
Pops the top element out of the navigation stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| NavPathInfo | Returns the information about the navigation destination page at the top of the stack. |
| undefined | Returns undefined if the navigation stack is empty. |
pop(result: Object, animated?: boolean): NavPathInfo | undefined
Pops the top element out of the navigation stack and invokes the onPop callback to pass the page processing result.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| result | Object | Yes | Custom processing result on the page. The boolean type is not supported. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| NavPathInfo | Returns the information about the navigation destination page at the top of the stack. |
| undefined | Returns undefined if the navigation stack is empty. |
popToName(name: string, animated?: boolean): number
Pops pages until the first navigation destination page that matches name from the bottom of the navigation stack is at the top of the stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| number | Returns the index of the first navigation destination page that matches name from the bottom of the navigation stack; returns -1 if such a page does not exist. |
popToName(name: string, result: Object, animated?: boolean): number
Pops pages until the first navigation destination page that matches name from the bottom of the navigation stack is at the top of the stack. This API uses the onPop callback to pass in the page processing result.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| result | Object | Yes | Custom processing result on the page. The boolean type is not supported. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| number | Returns the index of the first navigation destination page that matches name from the bottom of the navigation stack; returns -1 if such a page does not exist. |
popToIndex(index: number, animated?: boolean): void
Returns the navigation stack to the page specified by index.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| index | number | Yes | Index of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
popToIndex(index: number, result: Object, animated?: boolean): void
Returns the navigation stack to the page specified by index and invokes the onPop callback to pass the page processing result.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| index | number | Yes | Index of the navigation destination page. |
| result | Object | Yes | Custom processing result on the page. The boolean type is not supported. |
| animated | boolean | No | Whether to support transition animation. Default value: true |
moveToTop(name: string, animated?: boolean): number
Moves the first navigation destination page that matches name from the bottom of the navigation stack to the top of the stack
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
Return value
| Type | Description |
|---|---|
| number | Returns the index of the first navigation destination page that matches name from the bottom of the navigation stack; returns -1 if such a page does not exist. |
moveIndexToTop(index: number, animated?: boolean): void
Moves to the top of the navigation stack the navigation destination page specified by index.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| index | number | Yes | Index of the navigation destination page. |
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
clear(animated?: boolean): void
Clears the navigation stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| animated11+ | boolean | No | Whether to support transition animation. Default value: true |
getAllPathName(): Array<string>
Obtains the names of all navigation destination pages in the navigation stack.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Return value
| Type | Description |
|---|---|
| Array<string> | Names of all navigation destination pages in the navigation stack. |
getParamByIndex(index: number): unknown | undefined
Obtains the parameter information of the navigation destination page specified by index.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| index | number | Yes | Index of the navigation destination page. |
Return value
| Type | Description |
|---|---|
| unknown | Returns the parameter information of the matching navigation destination page. |
| undefined | Returns undefined if the passed index is invalid. |
getParamByName(name: string): Array<unknown>
Obtains the parameter information of all the navigation destination pages that match name.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
Return value
| Type | Description |
|---|---|
| Array<unknown> | Parameter information of all the matching navigation destination pages. |
getIndexByName(name: string): Array<number>
Obtains the indexes of all the navigation destination pages that match name.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
Return value
| Type | Description |
|---|---|
| Array<number> | Indexes of all the matching navigation destination pages. |
size(): number
Obtains the stack size.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Return value
| Type | Description |
|---|---|
| number | Stack size. |
disableAnimation(value: boolean): void
Disables or enables the transition animation in the Navigation component.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | boolean | No | Whether to disable the transition animation. Default value: false |
getParent(): NavPathStack | null
Obtains the parent navigation path stack.
When a Navigation component is nested (directly or indirectly) insider another Navigation component, the internal one can obtain the navigation path stack of the external one.
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Return value
| Type | Description |
|---|---|
| NavPathStack | null | Navigation path stack of the external Navigation component inside which the current Navigation component is nested. If no nesting is involved, null is returned. |
setInterception(interception: NavigationInterception): void
Sets the interception callback for navigation page redirection.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| interception | NavigationInterception | Yes | Object to be intercepted during navigation redirection. |
constructor(name: string, param: unknown, onPop?: Callback<PopInfo>, isEntry?: boolean)
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| name | string | Yes | Name of the navigation destination page. |
| param | unknown | No | Detailed parameters of the navigation destination page. |
| onPop11+ | Callback<PopInfo> | No | Callback returned when pop is called on the navigation destination page. |
| isEntry12+ | boolean | No | Whether the navigation destination page is the entry page. Default value: false The value of this parameter is reviewed or reset under the following conditions: - When a global back event is triggered on the current navigation destination page. - When the application is switched to the background. NOTE The navigation destination page serving as an entry does not respond to the in-app global back events; instead, it directly triggers the global back event between applications. |
Provides the callback information returned when a page is popped out of the navigation stack.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| info | NavPathInfo | Yes | Information about the current page when a back action is performed. The value is automatically obtained by the system. |
| result | Object | Yes | Result returned when a back action is performed. You must customize the object. |
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Type | Mandatory | Description |
|---|---|---|---|
| from | NavContentInfo | Yes | Information about the exit page. |
| to | NavContentInfo | Yes | Information about the enter page. |
| isInteractive12+ | boolean | No | Whether the transition animation is interactive. |
finishTransition(): void;
Finishes this custom transition animation. This API must be manually called to end the animation. Otherwise, the system ends the animation when the timeout expires.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
cancelTransition?(): void;
Cancels this interactive transition animation, restoring the navigation stack to its state before page redirection. (Non-interactive transition animations cannot be canceled.)
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
updateTransition?(progress: number): void;
Updates the progress of this interactive transition animation. (Non-interactive animations do not support setting the animation progress).
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
Parameters
| Name | Type | Mandatory | Description |
|---|---|---|---|
| progress | number | Yes | Progress percentage of the interactive transition animation. The value ranges from 0 to 1. |
type InterceptionShowCallback = (from: NavDestinationContext|NavBar, to: NavDestinationContext|NavBar, operation: NavigationOperation, isAnimated: boolean) => void
Represents the interception callback before and after the navigation page.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Type | Mandatory | Description |
|---|---|---|---|
| from | NavDestinationContext |NavBar | Yes | Information about the top page in the navigation stack before page redirection. The value navBar indicates that the top page is the home page. |
| to | NavDestinationContext |NavBar | Yes | Information about the top page in the navigation stack after page redirection. The value navBar indicates that the top page is the home page. |
| operation | NavigationOperation | Yes | Current page redirection type. |
| isAnimated | boolean | Yes | Whether to support transition animation. |
type InterceptionModeCallback = (mode: NavigationMode) => void
Implements an interception callback triggered when the display mode of the Navigation component switches between single-column and dual-column.
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Type | Mandatory | Description |
|---|---|---|---|
| mode | NavigationMode | Yes | Display mode of the navigation bar. |
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Type | Mandatory | Description |
|---|---|---|---|
| value | ResourceStr | Yes | Text of the toolbar item. |
| icon | ResourceStr | No | Icon path of the toolbar item. |
| action | () => void | No | Callback invoked when the toolbar item is selected. |
| status | ToolbarItemStatus | No | Status of the toolbar item. Default value: ToolbarItemStatus.NORMAL |
| activeIcon | ResourceStr | No | Icon path of the toolbar item in the active state. |
| symbolIcon12+ | SymbolGlyphModifier | No | Symbol icon for a single option on the toolbar. It has higher priority than icon. |
| activeSymbolIcon12+ | SymbolGlyphModifier | No | Symbol icon for a single option on the menu bar when it is in active state. It has higher priority than icon. |
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Description |
|---|---|
| NORMAL | Normal state. In this state, the toolbar item takes on the default style and can switch to another state-specific style by responding to the hover, press, and focus events. |
| DISABLED | Disabled state. In this state, the toolbar item is disabled and does not allow for user interactions. |
| ACTIVE | Active state. In this state, the toolbar item can update its icon to the one specified by activeIcon by responding to a click event. |
Atomic service API: This API can be used in atomic services since API version 11.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Description |
|---|---|
| MainOnly | Recommended height (56 vp) of the title bar when only the main title is available. |
| MainWithSub | Recommended height (82 vp) of the title bar when both the main title and subtitle exist. |
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Description |
|---|---|
| STANDARD | The title bar and content area are arranged in a vertical layout. |
| STACK | The title bar and the content area are arranged in a stacked layout, with the title bar positioned above the content area. |
Atomic service API: This API can be used in atomic services since API version 12.
System capability: SystemCapability.ArkUI.ArkUI.Full
| Name | Description |
|---|---|
| STANDARD | Default navigation stack operation mode. In this mode, push operations add the specified NavDestination page to the stack; replace operations replace the current top NavDestination page. |
| MOVE_TO_TOP_SINGLETON | This mode searches from the bottom to the top of the navigation stack. If a NavDestination page with the specified name exists, it moves that page to the top of the stack (for a replace operation, it replaces the last top NavDestination page with the specified one); otherwise, it behaves like STANDARD. |
| POP_TO_SINGLETON | This mode searches from the bottom to the top of the navigation stack. If a NavDestination page with the specified name exists, it removes all NavDestination pages above it(for a replace operation, it replaces the last top NavDestination page with the specified one); otherwise, it behaves like STANDARD. |
| NEW_INSTANCE | This mode creates an instance of NavDestination. Compared with STANDARD, this mode does not reuse the instance with the same name in the stack. |
This example demonstrates the page layout of the Navigation component.
// xxx.ets
class A {
text: string = ''
num: number = 0
}
@Entry
@Component
struct NavigationExample {
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@State currentIndex: number = 0
@Builder NavigationTitle() {
Column() {
Text('Title')
.fontColor('#182431')
.fontSize(30)
.lineHeight(41)
.fontWeight(700)
Text('subtitle')
.fontColor('#182431')
.fontSize(14)
.lineHeight(19)
.opacity(0.4)
.margin({ top: 2, bottom: 20 })
}.alignItems(HorizontalAlign.Start)
}
@Builder NavigationMenus() {
Row() {
Image('resources/base/media/ic_public_add.svg')
.width(24)
.height(24)
Image('resources/base/media/ic_public_add.svg')
.width(24)
.height(24)
.margin({ left: 24 })
Image('common/ic_public_more.svg')
.width(24)
.height(24)
.margin({ left: 24 })
}
}
build() {
Column() {
Navigation() {
TextInput({ placeholder: 'search...' })
.width('90%')
.height(40)
.backgroundColor('#FFFFFF')
.margin({ top: 8 })
List({ space: 12, initialIndex: 0 }) {
ForEach(this.arr, (item: number) => {
ListItem() {
Text('' + item)
.width('90%')
.height(72)
.backgroundColor('#FFFFFF')
.borderRadius(24)
.fontSize(16)
.fontWeight(500)
.textAlign(TextAlign.Center)
}
}, (item: number) => item.toString())
}
.height(324)
.width('100%')
.margin({ top: 12, left: '10%' })
}
.title(this.NavigationTitle)
.menus(this.NavigationMenus)
.titleMode(NavigationTitleMode.Full)
.toolbarConfiguration([
{
value: $r("app.string.navigation_toolbar_add"),
icon: $r("app.media.ic_public_highlightsed")
},
{
value: $r("app.string.navigation_toolbar_app"),
icon: $r("app.media.ic_public_highlights")
},
{
value: $r("app.string.navigation_toolbar_collect"),
icon: $r("app.media.ic_public_highlights")
}
])
.hideTitleBar(false)
.hideToolBar(false)
.onTitleModeChange((titleModel: NavigationTitleMode) => {
console.info('titleMode' + titleModel)
})
}.width('100%').height('100%').backgroundColor('#F1F3F5')
}
} 
This example demonstrates the use of methods in NavPathStack and route interception.
// Index.ets
@Entry
@Component
struct NavigationExample {
pageInfos: NavPathStack = new NavPathStack()
isUseInterception: boolean = false;
registerInterception() {
this.pageInfos.setInterception({
willShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",
operation: NavigationOperation, animated: boolean) => {
if (!this.isUseInterception) {
return;
}
if (typeof to === "string") {
console.log("target page is navigation home");
return;
}
// redirect target page.Change pageTwo to pageOne.
let target: NavDestinationContext = to as NavDestinationContext;
if (target.pathInfo.name === 'pageTwo') {
target.pathStack.pop();
target.pathStack.pushPathByName('pageOne', null);
}
},
didShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",
operation: NavigationOperation, isAnimated: boolean) => {
if (!this.isUseInterception) {
return;
}
if (typeof from === "string") {
console.log("current transition is from navigation home");
} else {
console.log(`current transition is from ${(from as NavDestinationContext).pathInfo.name}`)
}
if (typeof to === "string") {
console.log("current transition to is navBar");
} else {
console.log(`current transition is to ${(to as NavDestinationContext).pathInfo.name}`);
}
},
modeChange: (mode: NavigationMode) => {
if (!this.isUseInterception) {
return;
}
console.log(`current navigation mode is ${mode}`);
}
})
}
build() {
Navigation(this.pageInfos) {
Column() {
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.pushPath({ name:'pageOne'}) // Push the navigation destination page specified by name to the navigation stack.
})
Button('use interception', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.isUseInterception = !this.isUseInterception;
if (this.isUseInterception) {
this.registerInterception();
} else {
this.pageInfos.setInterception(undefined);
}
})
}
}.title('NavIndex')
}
} // PageOne.ets
class TmpClass{
count:number=10
}
@Builder
export function PageOneBuilder(name: string, param: Object) {
PageOne()
}
@Component
export struct PageOne {
pageInfos: NavPathStack = new NavPathStack()
build() {
NavDestination() {
Column() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
let tmp = new TmpClass()
this.pageInfos.pushPathByName('pageTwo', tmp) // Push the navigation destination page specified by name, with the data specified by param, to the navigation stack.
})
Button('singletonLaunchMode', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.pushPath({ name: 'pageOne' }, { launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON }) // Search from the bottom to the top of the stack. If the page with the specified name exists, move that page to the top of the stack.
})
Button('popToname', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.popToName('pageTwo') // Pop the first navigation destination page that matches the value of name to the top of the navigation stack.
console.log('popToName' + JSON.stringify(this.pageInfos), 'Return value' + JSON.stringify(this.pageInfos.popToName('pageTwo')))
})
Button('popToIndex', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.popToIndex(1) // Return the navigation stack to the navigation destination page that matches the value of index.
console.log('popToIndex' + JSON.stringify(this.pageInfos))
})
Button('moveToTop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.moveToTop('pageTwo') // Move to the top of the navigation stack the first navigation destination page that matches the value of name.
console.log('moveToTop' + JSON.stringify(this.pageInfos), 'Return value' + JSON.stringify(this.pageInfos.moveToTop('pageTwo')))
})
Button('moveIndexToTop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.moveIndexToTop(1) // Move to the top of the navigation stack the navigation destination page that matches the value of index.
console.log('moveIndexToTop' + JSON.stringify(this.pageInfos))
})
Button('clear', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfos.clear() // Clear the navigation stack.
})
Button('get', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
console.log('-------------------')
console.log('Obtained the names of all pages in the navigation stack', JSON.stringify(this.pageInfos.getAllPathName()))
console.log('Obtained parameter information of the navigation destination page specified by index', JSON.stringify(this.pageInfos.getParamByIndex(1)))
console.log('Obtained parameter information of all the navigation destination pages specified by name', JSON.stringify(this.pageInfos.getParamByName('pageTwo')))
console.log('Obtained the index information of all the navigation destination pages specified by name', JSON.stringify(this.pageInfos.getIndexByName('pageOne'))))
console.log('Obtained the stack size', JSON.stringify (this.pageInfos.size ()))
})
}.width('100%').height('100%')
}.title('pageOne')
.onBackPressed(() => {
const popDestinationInfo = this.pageInfos.pop() // Pop the top element out of the navigation stack.
console.log('pop' + 'Return value' + JSON.stringify(popDestinationInfo))
return true
}).onReady((context: NavDestinationContext) => {
this.pageInfos = context.pathStack
})
}
} // PageTwo.ets
@Builder
export function PageTwoBuilder(name: string, param: Object) {
PageTwo()
}
@Component
export struct PageTwo {
pathStack: NavPathStack = new NavPathStack()
private menuItems: Array<NavigationMenuItem> = [
{
value: "1",
icon: 'resources/base/media/undo.svg',
},
{
value: "2",
icon: 'resources/base/media/redo.svg',
isEnabled: false,
},
{
value: "3",
icon: 'resources/base/media/ic_public_ok.svg',
isEnabled: true,
}
]
build() {
NavDestination() {
Column() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.pushPathByName('pageOne', null)
})
}.width('100%').height('100%')
}.title('pageTwo')
.menus(this.menuItems)
.onBackPressed(() => {
this.pathStack.pop()
return true
})
.onReady((context: NavDestinationContext) => {
this.pathStack = context.pathStack;
console.log("current page config info is " + JSON.stringify(context.getConfigInRouteMap()))
})
}
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/PageOne.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
},
{
"name": "pageTwo",
"pageSourceFile": "src/main/ets/pages/PageTwo.ets",
"buildFunction": "PageTwoBuilder"
}
]
} 
This sample demonstrates how to set a custom transition animation and an interactive transition animation for each NavDestination page.
// Index.ets
import { CustomTransition, AnimateCallback } from './CustomNavigationUtils'
@Entry
@Component
struct NavigationExample {
pageInfos: NavPathStack = new NavPathStack();
aboutToAppear() {
if (this.pageInfos === undefined) {
this.pageInfos = new NavPathStack();
}
this.pageInfos.pushPath({ name: 'pageOne', param: CustomTransition.getInstance().getAnimationId() });
}
build() {
Navigation(this.pageInfos) {
}
.title('NavIndex')
.hideNavBar(true)
.customNavContentTransition((from: NavContentInfo, to: NavContentInfo, operation: NavigationOperation) => {
if (from.mode == NavDestinationMode.DIALOG || to.mode == NavDestinationMode.DIALOG) {
return undefined;
}
// No custom animation for the home page
if (from.index === -1 || to.index === -1) {
return undefined;
}
CustomTransition.getInstance().operation = operation;
if (CustomTransition.getInstance().interactive) {
let customAnimation: NavigationAnimatedTransition = {
onTransitionEnd: (isSuccess: boolean) => {
console.log("===== current transition is " + isSuccess);
CustomTransition.getInstance().recoverState();
CustomTransition.getInstance().proxy = undefined;
},
transition: (transitionProxy: NavigationTransitionProxy) => {
CustomTransition.getInstance().proxy = transitionProxy;
let targetIndex: string | undefined = operation == NavigationOperation.PUSH ?
(to.navDestinationId) : (from.navDestinationId);
if (targetIndex) {
CustomTransition.getInstance().fireInteractiveAnimation(targetIndex, operation);
}
},
isInteractive: CustomTransition.getInstance().interactive
}
return customAnimation;
}
let customAnimation: NavigationAnimatedTransition = {
onTransitionEnd: (isSuccess: boolean)=>{
console.log(`current transition result is ${isSuccess}`)
},
timeout: 7000,
// When the transition starts, the system calls this method and passes in the transition context proxy object.
transition: (transitionProxy: NavigationTransitionProxy) => {
if (!from.navDestinationId || !to.navDestinationId) {
return;
}
// Obtain the corresponding transition animation callback from the CustomTransition class based on the sequence of subpages.
let fromParam: AnimateCallback = CustomTransition.getInstance().getAnimateParam(from.navDestinationId);
let toParam: AnimateCallback = CustomTransition.getInstance().getAnimateParam(to.navDestinationId);
if (operation == NavigationOperation.PUSH) {
if (toParam.start) {
toParam.start(true, false);
}
animateTo({
duration: 500, onFinish: () => {
transitionProxy.finishTransition();
}
}, () => {
if (toParam.finish) {
toParam.finish(true, false);
}
})
} else {
if (fromParam.start) {
fromParam.start(true, true);
}
animateTo({
duration: 500, onFinish: () => {
transitionProxy.finishTransition();
}
}, () => {
if (fromParam.finish) {
fromParam.finish(true, true);
}
})
}
}
};
return customAnimation;
})
}
} // PageOne.ets
import {CustomTransition} from './CustomNavigationUtils';
@Builder
export function PageOneBuilder(name: string, param: Object) {
PageOne()
}
@Component
export struct PageOne {
pageInfos: NavPathStack = new NavPathStack();
@State translateX: string = '0';
pageId: string = '';
rectWidth: number = 0;
interactive: boolean = false;
registerCallback() {
CustomTransition.getInstance().registerNavParam(this.pageId, (isPush: boolean, isExit: boolean) => {
if (isPush) {
this.translateX = '100%';
} else {
this.translateX = '0';
}
}, (isPush: boolean, isExit: boolean) => {
if (isPush) {
this.translateX = '0';
} else {
this.translateX = '100%';
}
}, (isPush: boolean, isExit: boolean) => {
this.translateX = '0';
}, (operation: NavigationOperation) => {
if (operation == NavigationOperation.PUSH) {
this.translateX = '100%';
animateTo({
duration: 1000,
onFinish: () => {
this.translateX = '0';
}
}, () => {
this.translateX = '0';
})
} else {
this.translateX = '0';
animateTo({
duration: 1000,
onFinish: () => {
this.translateX = '0';
}
}, () => {
this.translateX = '100%';
})
}
}, 200);
}
build() {
NavDestination() {
Column() {
Button(`setInteractive`)
.onClick(() => {
CustomTransition.getInstance().interactive = !CustomTransition.getInstance().interactive;
this.interactive = CustomTransition.getInstance().interactive;
})
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack.
this.pageInfos.pushDestinationByName('pageTwo', CustomTransition.getInstance().getAnimationId());
})
}
.size({ width: '100%', height: '100%' })
}
.title('pageOne')
.onDisAppear(() => {
CustomTransition.getInstance().unRegisterNavParam(this.pageId);
})
.onReady((context: NavDestinationContext) => {
this.pageInfos = context.pathStack;
if (context.navDestinationId) {
this.pageId = context.navDestinationId;
this.registerCallback();
}
})
.translate({ x: this.translateX })
.backgroundColor('#F1F3F5')
.gesture(PanGesture()
.onActionStart((event: GestureEvent) => {
this.rectWidth = event.target.area.width as number;
if (event.offsetX < 0) {
this.pageInfos.pushPath({ name: 'pageTwo', param: CustomTransition.getInstance().getAnimationId() });
} else {
this.pageInfos.pop();
}
})
.onActionUpdate((event: GestureEvent) => {
let rate = event.fingerList[0].localX / this.rectWidth;
CustomTransition.getInstance().updateProgress(rate);
})
.onActionEnd((event: GestureEvent) => {
let rate: number = event.fingerList[0].localX / this.rectWidth;
CustomTransition.getInstance().finishInteractiveAnimation(rate);
}))
}
} // PageTwo.ets
import {CustomTransition} from './CustomNavigationUtils'
@Builder
export function PageTwoBuilder(name: string, param: Object) {
PageTwo({param: param as number})
}
@Component
export struct PageTwo {
pageInfos: NavPathStack = new NavPathStack();
@State translateX: string = '0';
pageId: string = '';
rectWidth: number = 0;
param: number = 0;
registerCallback() {
CustomTransition.getInstance().registerNavParam(this.pageId, (isPush: boolean, isExit: boolean)=>{
if (isPush) {
this.translateX = '100%'
} else {
this.translateX = '0';
}
}, (isPush: boolean, isExit: boolean)=>{
if (isPush) {
this.translateX = '0';
} else {
this.translateX = '100%'
}
}, (isPush: boolean, isExit: boolean) => {
this.translateX = '0';
}, (operation: NavigationOperation)=>{
if (operation == NavigationOperation.PUSH) {
this.translateX = '100%';
animateTo({duration: 500, onFinish: ()=>{
this.translateX = '0';
}}, ()=>{
this.translateX = '0'
})
} else {
this.translateX = '0';
animateTo({duration: 500, onFinish: ()=>{
this.translateX = "0"
}}, ()=>{
this.translateX = '100%';
})
}
}, 2000)
}
build() {
NavDestination() {
Column() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack.
this.pageInfos.pushPath({name:'pageOne', param: CustomTransition.getInstance().getAnimationId()})
})
}
.size({ width: '100%', height: '100%' })
}
.title('pageTwo')
.gesture(PanGesture()
.onActionStart((event: GestureEvent)=> {
this.rectWidth = event.target.area.width as number;
if (event.offsetX < 0) {
this.pageInfos.pushPath({ name: 'pageOne', param: CustomTransition.getInstance().getAnimationId() });
} else {
this.pageInfos.pop();
}
})
.onActionUpdate((event: GestureEvent) => {
let rate = event.fingerList[0].localX / this.rectWidth;
CustomTransition.getInstance().updateProgress(rate);
})
.onActionEnd((event: GestureEvent)=> {
let rate = event.fingerList[0].localX / this.rectWidth;
CustomTransition.getInstance().finishInteractiveAnimation(rate);
}))
.onAppear(() => {
this.registerCallback();
})
.onDisAppear(()=>{
CustomTransition.getInstance().unRegisterNavParam(this.pageId);
})
.onReady((context: NavDestinationContext) => {
this.pageInfos = context.pathStack;
if (context.navDestinationId) {
this.pageId = context.navDestinationId;
this.registerCallback();
}
})
.translate({x: this.translateX})
.backgroundColor(Color.Yellow)
}
} // CustomNavigationUtils.ts
// Custom API to save the transition animation callback and parameters related to a page.
export interface AnimateCallback {
finish: ((isPush: boolean, isExit: boolean) => void | undefined) | undefined;
start: ((isPush: boolean, isExit: boolean) => void | undefined) | undefined;
onFinish: ((isPush: boolean, isExit: boolean) => void | undefined) | undefined;
interactive: ((operation: NavigationOperation) => void | undefined) | undefined;
timeout: (number | undefined) | undefined;
}
const customTransitionMap: Map<string, AnimateCallback> = new Map();
export class CustomTransition {
static delegate = new CustomTransition();
interactive: boolean = false;
proxy: NavigationTransitionProxy| undefined = undefined;
private animationId: number = 0;
operation: NavigationOperation = NavigationOperation.PUSH
static getInstance() {
return CustomTransition.delegate;
}
/* Register animation callbacks for a page.
* name: unique ID of the target page
* startCallback: used to set the page state at the start of the animation.
* endCallback: used to set the page state at the end of the animation.
* onFinish: used to perform other operations after the animation ends.
* interactiveCallback: used to handle the interactive part of the transition.
* timeout: timeout for ending the transition.
*/
registerNavParam(name: string, startCallback: (operation: boolean, isExit: boolean) => void,
endCallback:(operation: boolean, isExit: boolean) => void,
onFinish: (operation: boolean, isExit: boolean) => void,
interactiveCallback: (operation: NavigationOperation) =>void,
timeout: number): void {
if (customTransitionMap.has(name)) {
let param = customTransitionMap.get(name);
if (param != undefined) {
param.start = startCallback;
param.finish = endCallback;
param.timeout = timeout;
param.onFinish = onFinish;
param.interactive = interactiveCallback;
return;
}
}
let params: AnimateCallback = {timeout: timeout, start: startCallback, finish: endCallback, onFinish: onFinish,
interactive: interactiveCallback};
customTransitionMap.set(name, params);
}
getAnimationId() {
return Date.now();
}
unRegisterNavParam(name: string): void {
customTransitionMap.delete(name);
}
fireInteractiveAnimation(id: string, operation: NavigationOperation) {
let animation = customTransitionMap.get(id)?.interactive;
if (!animation) {
return;
}
animation(operation);
}
updateProgress(progress: number) {
if (!this.proxy?.updateTransition) {
return;
}
progress = this.operation == NavigationOperation.PUSH ? 1 - progress : progress;
this.proxy?.updateTransition(progress);
}
cancelTransition() {
if (this.proxy?.cancelTransition) {
this.proxy.cancelTransition();
}
}
recoverState() {
if (!this.proxy?.from.navDestinationId || !this.proxy?.to.navDestinationId) {
return;
}
let fromParam = customTransitionMap.get(this.proxy.from.navDestinationId);
if (fromParam?.onFinish) {
fromParam.onFinish(false, false);
}
let toParam = customTransitionMap.get(this.proxy?.to.navDestinationId);
if (toParam?.onFinish) {
toParam.onFinish(true, true);
}
}
finishTransition() {
this.proxy?.finishTransition();
}
finishInteractiveAnimation(rate: number) {
if (this.operation == NavigationOperation.PUSH) {
if (rate > 0.5) {
if (this.proxy?.cancelTransition) {
this.proxy.cancelTransition();
}
} else {
this.proxy?.finishTransition();
}
} else {
if (rate > 0.5) {
this.proxy?.finishTransition();
} else {
if (this.proxy?.cancelTransition) {
this.proxy.cancelTransition();
}
}
}
}
getAnimateParam(name: string): AnimateCallback {
let result: AnimateCallback = {
start: customTransitionMap.get(name)?.start,
finish: customTransitionMap.get(name)?.finish,
timeout: customTransitionMap.get(name)?.timeout,
onFinish: customTransitionMap.get(name)?.onFinish,
interactive: customTransitionMap.get(name)?.interactive,
};
return result;
}
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/PageOne.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
},
{
"name": "pageTwo",
"pageSourceFile": "src/main/ets/pages/PageTwo.ets",
"buildFunction": "PageTwoBuilder"
}
]
} 
This example primarily demonstrates how to use Navigation to return to the previous page with parameters.
// Index.ets
@Entry
@Component
struct NavigationExample {
pageInfo: NavPathStack = new NavPathStack()
build() {
Navigation(this.pageInfo) {
Column() {
Button('StartTest', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pageInfo.pushPath({ name: 'pageOne' }); // Push the navigation destination page specified by name to the navigation stack.
})
}
}.title('NavIndex')
}
} // PageOne.ets
import { BusinessError } from '@kit.BasicServicesKit';
class TmpClass{
count:number = 10
}
class ParamWithOp {
operation: number = 1
count: number = 10
}
@Builder
export function PageOneBuilder(name: string, param: Object) {
PageOne()
}
@Component
export struct PageOne {
pageInfo: NavPathStack = new NavPathStack();
@State message: string = 'Hello World'
build() {
NavDestination() {
Column() {
Text(this.message)
.width('80%')
.height(50)
.margin(10)
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(()=>{
this.pageInfo.pushPath({name: 'pageTwo', param: new ParamWithOp(), onPop: (popInfo: PopInfo)=>{
this.message = '[pushPath]last page is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result);
}}); // Push the navigation destination page specified by name, with the data specified by param, to the navigation stack. Use the onPop callback to receive the page processing result.
})
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(() => {
let tmp = new TmpClass()
this.pageInfo.pushPathByName('pageTwo', tmp, (popInfo)=>{
this.message = '[pushPathByName]last page is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result);
}); // Push the navigation destination page specified by name, with the data specified by param, to the navigation stack. Use the onPop callback to receive the page processing result.
})
Button('pushDestination', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(()=>{
let tmp = new TmpClass()
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack. Use the onPop callback to receive the page processing result.
this.pageInfo.pushDestination({name: 'pageTwo', param: new ParamWithOp(), onPop: (popInfo: PopInfo)=>{
this.message = '[pushDestination]last page is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result);
}}).catch((error: BusinessError)=>{
console.error(`[pushDestination]failed, error code = ${error.code}, error.message = ${error.message}.`);
}).then(()=>{
console.error('[pushDestination]success.');
});
})
Button('pushDestinationByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(()=>{
let tmp = new TmpClass()
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack. Use the onPop callback to receive the page processing result.
this.pageInfo.pushDestinationByName('pageTwo', tmp, (popInfo)=>{
this.message = '[pushDestinationByName]last page is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result);
}).catch((error: BusinessError)=>{
console.error(`[pushDestinationByName]failed, error code = ${error.code}, error.message = ${error.message}.`);
}).then(()=>{
console.error('[pushDestinationByName]success.');
});
})
Button('pushPathWithoutOnPop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(()=>{
this.pageInfo.pushPath({name: 'pageTwo', param: new ParamWithOp()}); // Push the navigation destination page specified by name to the navigation stack.
})
Button('pushPathByNameWithoutOnPop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(() => {
let tmp = new TmpClass()
this.pageInfo.pushPathByName('pageTwo', tmp); // Push the navigation destination page specified by name, with the data specified by param, to the navigation stack.
})
Button('pushDestinationWithoutOnPop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(()=>{
let tmp = new TmpClass()
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack. Use the onPop callback to receive the page processing result.
this.pageInfo.pushDestination({name: 'pageTwo', param: new ParamWithOp()})
.catch((error: BusinessError)=>{
console.error(`[pushDestinationWithoutOnPop]failed, error code = ${error.code}, error.message = ${error.message}.`);
}).then(()=>{
console.error('[pushDestinationWithoutOnPop]success.');
});
})
Button('pushDestinationByNameWithoutOnPop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(() => {
let tmp = new TmpClass()
// Push the navigation destination page specified by name, with the data specified by param, to the navigation stack.
this.pageInfo.pushDestinationByName('pageTwo', tmp)
.catch((error: BusinessError)=>{
console.error(`[pushDestinationByNameWithoutOnPop]failed, error code = ${error.code}, error.message = ${error.message}.`);
}).then(()=>{
console.error('[pushDestinationByNameWithoutOnPop]success.');
});
})
Button('clear', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(10)
.onClick(() => {
this.pageInfo.clear(); // Clear the navigation stack.
})
}.width('100%').height('100%')
}.title('pageOne')
.onBackPressed(() => {
this.pageInfo.pop({number: 1}) // Pop the top element out of the navigation stack.
return true
}).onReady((context: NavDestinationContext) => {
this.pageInfo = context.pathStack;
})
}
} // PageTwo.ets
class resultClass {
constructor(count: number) {
this.count = count;
}
count: number = 10
}
@Builder
export function PageTwoBuilder() {
PageTwo()
}
@Component
export struct PageTwo {
pathStack: NavPathStack = new NavPathStack()
build() {
NavDestination() {
Column() {
Button('pop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.pop(new resultClass(1)); // Return to the previous page and pass in the processing result to the onPop callback of push.
})
Button('popToName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.popToName('pageOne', new resultClass(11)); // Move the first navigation destination page that matches name to the top of the navigation stack, and pass in the processing result to the onPop callback of push.
})
Button('popToIndex', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.popToIndex(0, new resultClass(111)); // Move the navigation destination page specified by index to the top of the navigation stack, and pass in the processing result to the onPop callback of push.
})
Button('popWithoutResult', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.pop();
})
Button('popToNameWithoutResult', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.popToName('pageOne');
})
Button('popToIndexWithoutResult', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.pathStack.popToIndex(0);
})
}.width('100%').height('100%')
}.title('pageTwo')
.onBackPressed(() => {
this.pathStack.pop(new resultClass(0)); // Return to the previous page and pass in the processing result to the onPop callback of push.
return true;
}).onReady((context: NavDestinationContext) => {
this.pathStack = context.pathStack
})
}
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/PageOne.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
},
{
"name": "pageTwo",
"pageSourceFile": "src/main/ets/pages/PageTwo.ets",
"buildFunction": "PageTwoBuilder"
}
]
} 
This example demonstrates how to set the background color and background blur effect for the title bar of the home page in Navigation, as well as for the toolbar and the title bars on the NavDestination pages.
let COLOR1: string = "#80004AAF";
let COLOR2: string = "#802787D9";
let BLUR_STYLE_1: BlurStyle = BlurStyle.BACKGROUND_THIN;
let BLUR_STYLE_2: BlurStyle = BlurStyle.BACKGROUND_THICK;
@Component
struct BackComponent {
build() {
Row() {
Column() {}
.height('100%')
.backgroundColor("#3D9DB4")
.layoutWeight(9)
Column() {}
.height('100%')
.backgroundColor("17A98D")
.layoutWeight(9)
Column() {}
.height('100%')
.backgroundColor("FFC000")
.layoutWeight(9)
}
.height('100%')
.width('100%')
}
}
@Component
struct ColorAndBlur {
@State useColor1: boolean = true;
@State useBlur1: boolean = true;
build() {
NavDestination() {
Stack({alignContent: Alignment.Center}) {
BackComponent()
.width('100%')
.height('100%')
Column() {
Stack({alignContent: Alignment.Center}) {
Button("switch color")
.onClick(() => {
this.useColor1 = !this.useColor1;
})
}
.width('100%')
.layoutWeight(1)
Stack({alignContent: Alignment.Center}) {
Button("switch blur")
.onClick(() => {
this.useBlur1 = !this.useBlur1;
})
}
.width('100%')
.layoutWeight(1)
}
.width('100%')
.height('100%')
}.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
// You can set the background color and background blur style of the title bar.
.title("switch titlebar color and blur", {
backgroundColor: this.useColor1 ? COLOR1 : COLOR2,
backgroundBlurStyle: this.useBlur1 ? BLUR_STYLE_1 : BLUR_STYLE_2,
barStyle: BarStyle.STACK
})
}
}
@Entry
@Component
struct Index {
private stack: NavPathStack = new NavPathStack();
@State useColor1: boolean = true;
@State useBlur1: boolean = true;
@Builder
PageBuilder(name: string) {
ColorAndBlur()
}
build() {
Navigation(this.stack) {
Stack({alignContent: Alignment.Center}) {
BackComponent()
.width('100%')
.height('100%')
Column() {
Stack({alignContent: Alignment.Center}) {
Button("switch color")
.onClick(() => {
this.useColor1 = !this.useColor1;
})
}
.width('100%')
.layoutWeight(1)
Stack({alignContent: Alignment.Center}) {
Button("switch blur")
.onClick(() => {
this.useBlur1 = !this.useBlur1;
})
}
.width('100%')
.layoutWeight(1)
Stack({alignContent: Alignment.Center}) {
Button("push page")
.onClick(() => {
this.stack.pushPath({name: "page"})
})
}
.width('100%')
.layoutWeight(1)
}
.width('100%')
.height('80%')
}.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
.navDestination(this.PageBuilder)
// You can set the background color and background blur style of the title bar.
.title("NavTitle", {
backgroundColor: this.useColor1 ? COLOR1 : COLOR2,
backgroundBlurStyle: this.useBlur1 ? BLUR_STYLE_1 : BLUR_STYLE_2,
barStyle: BarStyle.STACK
})
// You can set the background color and background blur style of the toolbar.
.toolbarConfiguration([
{value: "a"},
{value: "b"},
{value: "c"}
], {
backgroundColor: this.useColor1 ? COLOR1 : COLOR2,
backgroundBlurStyle: this.useBlur1 ? BLUR_STYLE_1 : BLUR_STYLE_2
})
}
} 
This example shows how to obtain the parent navigation path stack for a nested Navigation component.
@Entry
@Component
struct NavigationExample1 {
@State childNavStack: NavPathStack = new NavPathStack();
build() {
Navigation() {
Stack({alignContent: Alignment.Center}) {
Navigation(this.childNavStack) {
Button('push Path to parent Navigation', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
// The parent the parent navigation path stack can be obtained.
let parentStack = this.childNavStack.getParent();
parentStack?.pushPath({ name: "pageOne"})
})
}
.clip(true)
.backgroundColor(Color.Orange)
.width('80%')
.height('80%')
.title('ChildNavigation')
}
.width('100%')
.height('100%')
}
.backgroundColor(Color.Green)
.width('100%')
.height('100%')
.title('ParentNavigation')
}
} // PageOne.ets
@Builder
export function PageOneBuilder(name: string) {
NavDestination() {
Text("this is " + name)
}
.title(name)
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/PageOne.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
}
]
} 
This example demonstrates the following:
The navigation stack operation can be conducted even when NavPathStack is not declared as a state variable.
The NavDestination can obtain the corresponding NavPathInfo and NavPathStack through the onReady event.
class PageParam {
constructor(num_: number) {
this.num = num_;
}
num: number = 0;
}
@Builder
export function PageOneBuilder(name: string, param: Object) {
PageOne()
}
@Component
struct PageOne {
private stack: NavPathStack | null = null;
private name: string = "";
private paramNum: number = 0;
build() {
NavDestination() {
Column() {
Text("NavPathInfo: name: " + this.name + ", paramNum: " + this.paramNum)
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
if (this.stack) {
let p = new PageParam(this.paramNum + 1);
this.stack.pushPath({name: "pageOne", param: p});
}
})
Button('pop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.stack?.pop()
})
}
.width('100%')
.height('100%')
}
.title('pageOne')
.onReady((ctx: NavDestinationContext) => {
// The passed NavPathInfo and the owning NavPathStack objects can be obtained for <NavDestination>.
try {
this.name = ctx?.pathInfo?.name;
this.paramNum = (ctx?.pathInfo?.param as PageParam)?.num;
this.stack = ctx.pathStack;
} catch (e) {
console.log(`testTag onReady catch exception: ${JSON.stringify(e)}`)
}
})
}
}
@Entry
@Component
struct NavigationExample2 {
private stack : NavPathStack = new NavPathStack();
build() {
Navigation(this.stack) {
Stack({alignContent: Alignment.Center}) {
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
let p = new PageParam(1);
this.stack.pushPath({ name: "pageOne", param: p })
})
}
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
.title('Navigation')
}
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/Index.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
}
]
} 
This example demonstrates the lifecycle timing of NavDestination.
@Builder
export function PageOneBuilder(name: string, param: Object) {
PageOneComponent()
}
@Component
struct PageOneComponent {
private stack: NavPathStack | null = null;
@State eventStr: string = "";
build() {
NavDestination() {
Column() {
Text("event: " + this.eventStr)
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
if (this.stack) {
this.stack.pushPath({name: "pageOne"});
}
})
Button('pop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.stack?.pop()
})
}
.width('100%')
.height('100%')
}
.title('pageOne')
.onAppear(() => { this.eventStr += "<onAppear>"; })
.onDisAppear(() => { this.eventStr += "<onDisAppear>"; })
.onShown(() => { this.eventStr += "<onShown>"; })
.onHidden(() => { this.eventStr += "<onHidden>"; })
.onWillAppear(() => { this.eventStr += "<onWillAppear>"; })
.onWillDisappear(() => { this.eventStr += "<onWillDisappear>"; })
.onWillShow(() => { this.eventStr += "<onWillShow>"; })
.onWillHide(() => { this.eventStr += "<onWillHide>"; })
// onReady is called before onAppear.
.onReady((ctx: NavDestinationContext) => {
try {
this.eventStr += "<onReady>";
this.stack = ctx.pathStack;
} catch (e) {
console.log(`testTag onReady catch exception: ${JSON.stringify(e)}`)
}
})
}
}
@Entry
@Component
struct NavigationExample3 {
private stack : NavPathStack = new NavPathStack();
build() {
Navigation(this.stack) {
Stack({alignContent: Alignment.Center}) {
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
this.stack.pushPath({ name: "pageOne" })
})
}
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
.title('Navigation')
}
} // Configure {"routerMap": "$profile:route_map"} in the project configuration file module.json5.
// route_map.json
{
"routerMap": [
{
"name": "pageOne",
"pageSourceFile": "src/main/ets/pages/Index.ets",
"buildFunction": "PageOneBuilder",
"data": {
"description": "this is pageOne"
}
}
]
} 
This example demonstrates the stack layout of the title bar in the Navigation component.
@Entry
@Component
struct NavigationExample {
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
private scrollerForScroll: Scroller = new Scroller();
@State barStyle: BarStyle = BarStyle.STANDARD;
build() {
Column() {
Navigation() {
Column() {
Scroll(this.scrollerForScroll) {
Column() {
Image($r('app.media.image_1'))
// Set the height to be the same as that of the title bar to better observe the stack effect.
.height(138)
.width('100%')
Button('BarStyle.STANDARD')
.height('50vp')
.onClick(() => {
this.barStyle = BarStyle.STANDARD;
})
Button('BarStyle.STACK')
.height('50vp')
.margin({ top: 12 })
.onClick(() => {
this.barStyle = BarStyle.STACK;
})
ForEach(this.arr, (item: number) => {
ListItem() {
Text('' + item)
.width('100%')
.height(100)
.fontSize(16)
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(Color.Orange)
.margin({ top: 12 })
}
}, (item: string) => item)
}
}
}
.width('100%')
.height('100%')
.backgroundColor(0xDCDCDC)
}
.title(
{
main: 'NavTitle',
sub: 'subtitle'
},
{
backgroundBlurStyle: BlurStyle.COMPONENT_THICK,
barStyle: this.barStyle,
}
)
.titleMode(NavigationTitleMode.Free)
.hideTitleBar(false)
}.width('100%').height('100%').backgroundColor('#F1F3F5')
}
} 
This example demonstrates how to define a derived class of NavPathStack and the basic usage of the derived class in Navigation.
class DerivedNavPathStack extends NavPathStack {
// usr defined property 'id'
id: string = "__default__"
// new function in derived class
setId(id: string) {
this.id = id;
}
// new function in derived class
getInfo(): string {
return "this page used Derived NavPathStack, id: " + this.id
}
// overwrite function of NavPathStack
pushPath(info: NavPathInfo, animated?: boolean): void
pushPath(info: NavPathInfo, options?: NavigationOptions): void
pushPath(info: NavPathInfo, secArg?: boolean | NavigationOptions): void {
console.log('[derive-test] reached DerivedNavPathStack\'s pushPath');
if (typeof secArg === 'boolean') {
super.pushPath(info, secArg);
} else {
super.pushPath(info, secArg);
}
}
// overwrite and overload function of NavPathStack
pop(animated?: boolean | undefined): NavPathInfo | undefined
pop(result: Object, animated?: boolean | undefined): NavPathInfo | undefined
pop(result?: Object, animated?: boolean | undefined): NavPathInfo | undefined {
console.log('[derive-test] reached DerivedNavPathStack\'s pop');
return super.pop(result, animated);
}
// other function of base class...
}
class param {
info: string = "__default_param__";
constructor(info: string) { this.info = info }
}
@Entry
@Component
struct Index {
derivedStack: DerivedNavPathStack = new DerivedNavPathStack();
aboutToAppear(): void {
this.derivedStack.setId('origin stack');
}
@Builder
pageMap(name: string) {
PageOne()
}
build() {
Navigation(this.derivedStack) {
Button('to Page One').margin(20).onClick(() => {
this.derivedStack.pushPath({
name: 'pageOne',
param: new param('push pageOne in homePage when stack size: ' + this.derivedStack.size())
});
})
}.navDestination(this.pageMap)
.title('Home Page')
}
}
@Component
struct PageOne {
derivedStack: DerivedNavPathStack = new DerivedNavPathStack();
curStringifyParam: string = "NA";
build() {
NavDestination() {
Column() {
Text(this.derivedStack.getInfo())
.margin(10)
.fontSize(25)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Start)
Text('current page param info:')
.margin(10)
.fontSize(25)
.fontWeight(FontWeight.Bold)
.textAlign(TextAlign.Start)
Text(this.curStringifyParam)
.margin(20)
.fontSize(20)
.textAlign(TextAlign.Start)
}.backgroundColor(Color.Pink)
Button('to Page One').margin(20).onClick(() => {
this.derivedStack.pushPath({
name: 'pageOne',
param: new param('push pageOne in pageOne when stack size: ' + this.derivedStack.size())
});
})
}.title('Page One')
.onReady((context: NavDestinationContext) => {
console.log('[derive-test] reached PageOne\'s onReady');
// get derived stack from navdestinationContext
this.derivedStack = context.pathStack as DerivedNavPathStack;
console.log('[derive-test] -- got derivedStack: ' + this.derivedStack.id);
this.curStringifyParam = JSON.stringify(context.pathInfo.param);
console.log('[derive-test] -- got param: ' + this.curStringifyParam);
})
}
} 
This example shows how to use symbol icons in Navigation and NavDestination.
import { SymbolGlyphModifier } from '@kit.ArkUI';
@Entry
@Component
struct NavigationExample {
@Provide('navPathStack') navPathStack:NavPathStack = new NavPathStack();
@State menuItems:Array<NavigationMenuItem> = [
{
value:'menuItem1',
icon:'resources/base/media/ic_public_ok.svg' // Icon resource path.
},
{
value:'menuItem2',
icon:'resources/base/media/ic_public_ok.svg', // Icon resource path.
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_folder_badge_plus')).fontColor([Color.Red,Color.Green]).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR),
},
{
value:'menuItem3',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_lungs')),
},
]
@State toolItems:Array<ToolbarItem>= [
{
value:'toolItem1',
icon:'resources/base/media/ic_public_ok.svg', // Icon resource path.
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.ohos_lungs')),
status:ToolbarItemStatus.ACTIVE,
activeSymbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_folder_badge_plus')).fontColor([Color.Red,Color.Green]).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR),
action:()=>{}
},
{
value:'toolItem2',
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.ohos_star')),
status:ToolbarItemStatus.ACTIVE,
activeIcon: 'resources/base/media/ic_public_more.svg', // Icon resource path.
action:()=>{}
},
{
value:'toolItem3',
symbolIcon:new SymbolGlyphModifier($r('sys.symbol.ohos_star')),
status:ToolbarItemStatus.ACTIVE,
activeSymbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_lungs')),
action:()=>{}
}
]
@Builder
myRouter(name:string,param?:Object) {
if(name === 'NavigationMenu') {
NavigationMenu();
}
}
build() {
Navigation(this.navPathStack) {
Column() {
Button('Go').onClick(()=> {
this.navPathStack.pushPathByName('NavigationMenu', null);
})
}
}
.backButtonIcon(new SymbolGlyphModifier($r('sys.symbol.ohos_wifi')))
.titleMode(NavigationTitleMode.Mini)
.menus(this.menuItems)
.toolbarConfiguration(this.toolItems)
.title('Level-1 page')
.navDestination(this.myRouter)
}
}
@Component
export struct NavigationMenu{
@Consume('navPathStack') navPathStack:NavPathStack;
@State menuItems:Array<NavigationMenuItem> = [
{
value:'menuItem1',
icon:'resources/base/media/ic_public_ok.svg', // Icon resource path.
action:()=>{}
},
{
value:'menuItem2',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.ohos_folder_badge_plus')).fontColor([Color.Red,Color.Green]).renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR),
action:()=>{}
},
{
value:'menuItem3',
symbolIcon: new SymbolGlyphModifier($r('sys.symbol.repeat_1')),
action:()=>{}
},
]
build() {
NavDestination(){
Row() {
Column(){
}
.width('100%')
}
.height('100%')
}
.hideTitleBar(false)
.title('NavDestination title')
.backgroundColor($r('sys.color.ohos_id_color_titlebar_sub_bg'))
.backButtonIcon(new SymbolGlyphModifier($r('sys.symbol.ohos_star')).fontColor([Color.Blue]))
.menus(this.menuItems)
}
} 
This example demonstrates how to set custom title bar padding in Navigation and NavDestination.
import { LengthMetrics } from '@kit.ArkUI';
@Entry
@Component
struct NavigationExample {
@Provide('navPathStack') navPathStack: NavPathStack = new NavPathStack();
// Assign an initial padding at the start of the title bar.
@State paddingStart: LengthMetrics = LengthMetrics.vp(0);
// Assign an initial padding at the end of the title bar.
@State paddingEnd: LengthMetrics = LengthMetrics.vp(0);
@State menuItems: Array<NavigationMenuItem> = [
{
value: 'menuItem1',
icon: 'resources/base/media/ic_public_ok.svg', // Icon resource path.
action: () => {
}
}
]
@Builder
myRouter(name: string, param?: Object) {
if (name === 'NavDestinationExample') {
NavDestinationExample();
}
}
build() {
Navigation(this.navPathStack) {
Column() {
// Switch between padding values for the title bar.
Button('Apply 16 vp Padding')
.onClick(() => {
this.paddingStart = LengthMetrics.vp(16);
this.paddingEnd = LengthMetrics.vp(16);
})
.margin({ top: 5 })
Button('Apply 24 vp Padding')
.onClick(() => {
this.paddingStart = LengthMetrics.vp(24);
this.paddingEnd = LengthMetrics.vp(24);
})
.margin({ top: 5 })
Button('Go')
.onClick(() => {
this.navPathStack.pushPathByName('NavDestinationExample', null);
})
.margin({ top: 5 })
}
}
.titleMode(NavigationTitleMode.Mini)
.title('Level-1 page', {
paddingStart: this.paddingStart,
paddingEnd: this.paddingEnd,
})
.menus(this.menuItems)
.navDestination(this.myRouter)
}
}
@Component
export struct NavDestinationExample {
@Consume('navPathStack') navPathStack: NavPathStack;
@State menuItems: Array<NavigationMenuItem> = [
{
value: 'menuItem1',
icon: 'resources/base/media/ic_public_ok.svg', // Icon resource path.
action: () => {
}
}
]
@State paddingStart: LengthMetrics = LengthMetrics.vp(0);
@State paddingEnd: LengthMetrics = LengthMetrics.vp(0);
build() {
NavDestination() {
Row() {
Column() {
// Switch between padding values for the title bar.
Button('Apply 32 vp Padding')
.onClick(() => {
this.paddingStart = LengthMetrics.vp(32);
this.paddingEnd = LengthMetrics.vp(32);
})
.margin({ top: 5 })
Button('Apply 20 vp Padding')
.onClick(() => {
this.paddingStart = LengthMetrics.vp(20);
this.paddingEnd = LengthMetrics.vp(20);
})
.margin({ top: 5 })
}
.width('100%')
}
.height('100%')
}
.hideTitleBar(false)
.title('NavDestination title', {
paddingStart: this.paddingStart,
paddingEnd: this.paddingEnd,
})
.menus(this.menuItems)
}
} 