经常用安卓思维考虑问题,用习惯了Router方式跳转,但是官方推荐用 navigation,当然它有它的有点, 也有小瑕疵,用了api11 后 发现 navigation路由跳转 ,只要被它包裹的跳转到下页面的,有些生命周期是拿不到的,比如onShow,onHidden等 ,估计小伙伴们也遇到了。庆幸的是api12 更新了,上面可以了哈,下面是以前的和现在的实例代码,对比就知道了哈
以前:
- @Builder
- pageMap(name: string, param: object) {
- NavDestination() {
- // 根据模块名,获取WrappedBuilder对象,通过builder接口创建页面
- DfRouter.getBuilder(name).builder(param);
- }
- .hideTitleBar(true)
- }
-
- build() {
- Navigation(this.navPathStack) {
- Row() {
- Column() {
- Text(this.message)
- .fontSize(50)
- .fontWeight(FontWeight.Bold)
- }
- .width('100%')
- }
- .height('100%')
- }
- .hideTitleBar(true)
- .navBarWidth('50%')
- .navDestination(this.pageMap)
- .mode(NavigationMode.Auto)
- }
- }
- export class DfRouter {
-
- ....省略代码
-
- /**
- * @param builderName
- * @param builder
- */
- public static getBuilder(builderName: string): WrappedBuilder<[object]> {
- let builder = DfRouter.builderMap.get(builderName);
- return builder as WrappedBuilder<[object]>;
- }
-
- ....省略代码
- }
上面代码 根据模块名,获取WrappedBuilder对象,通过builder接口创建页面
DfRouter.getBuilder(name).builder(param) 方法是返回了个一个WrapeedBudilder
注册页面路由原来是这样的
- export default class DfAbilityStage extends AbilityStage{
-
- onCreate(): void {
- GlobalContext.getContext().setObject("appContext", this.context.getApplicationContext());
-
- this.initRouter();
-
- }
-
-
- /**
- * 将entry中所有页面一次性注册进来
- */
- initRouter() {
- let navPathStack: NavPathStack = new NavPathStack()
- GlobalContext.getContext().setObject('entryPageStack', navPathStack);
- DfRouter.createNavPathStack(navPathStack);
-
- // 加载页面
- import('./pages/AdPage');
- import('./pages/HomePage');
- import('./pages/TestAPage');
- import('./webContainer/pages/WebPage');
-
- }
-
- }
- static readonly PAGE_AD: RouterInfo = new RouterInfo('entry', 'AdPage');
- static readonly PAGE_TEST: RouterInfo = new RouterInfo('entry', 'TestPage');
-
- DfRouter.registerRouterPage(RouterInfo.PAGE_WEB, wrapBuilder(getWebPage));
而下面api12 更新了,变成了让人舒服的 理想状态,同时哪些生命周期也有了
- // 该示例演示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 += "
" ; }) - .onDisAppear(() => { this.eventStr += "
" ; }) - .onShown(() => { this.eventStr += "
" ; }) - .onHidden(() => { this.eventStr += "
" ; }) - .onWillAppear(() => { this.eventStr += "
" ; }) - .onWillDisappear(() => { this.eventStr += "
" ; }) - .onWillShow(() => { this.eventStr += "
" ; }) - .onWillHide(() => { this.eventStr += "
" ; }) - // onReady会在onAppear之前调用
- .onReady((ctx: NavDestinationContext) => {
- try {
- this.eventStr += "
" ; - 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')
- }
- }
注册路由方式也改变了
- // 工程配置文件module.json5中配置 {"routerMap": "$profile:route_map"}
- // route_map.json
- {
- "routerMap": [
- {
- "name": "pageOne",
- "pageSourceFile": "src/main/ets/pages/Index.ets",
- "buildFunction": "PageOneBuilder",
- "data": {
- "description": "this is pageOne"
- }
- }
- ,
- {
- "name": "/modules/scan",
- "pageSourceFile": "src/main/ets/pages/scan/ScanViewPage.ets",
- "buildFunction": "getScanPage",
- "data": {
- "description": "this is pageOne"
- }
- },
- ]
- }
版本api12 加了配置文件的映射表不再是动态的了
是不是看着舒服多了,详细内容看api12 文档哈,感觉有用记得点个赞,感谢了!!