• 鸿蒙 navigation路由跳转,页面struct 下的生命周期、onShow、onHidden等不会触发问题


    经常用安卓思维考虑问题,用习惯了Router方式跳转,但是官方推荐用 navigation,当然它有它的有点, 也有小瑕疵,用了api11 后 发现 navigation路由跳转 ,只要被它包裹的跳转到下页面的,有些生命周期是拿不到的,比如onShow,onHidden等 ,估计小伙伴们也遇到了。庆幸的是api12 更新了,上面可以了哈,下面是以前的和现在的实例代码,对比就知道了哈

    以前:

    1. @Builder
    2. pageMap(name: string, param: object) {
    3. NavDestination() {
    4. // 根据模块名,获取WrappedBuilder对象,通过builder接口创建页面
    5. DfRouter.getBuilder(name).builder(param);
    6. }
    7. .hideTitleBar(true)
    8. }
    9. build() {
    10. Navigation(this.navPathStack) {
    11. Row() {
    12. Column() {
    13. Text(this.message)
    14. .fontSize(50)
    15. .fontWeight(FontWeight.Bold)
    16. }
    17. .width('100%')
    18. }
    19. .height('100%')
    20. }
    21. .hideTitleBar(true)
    22. .navBarWidth('50%')
    23. .navDestination(this.pageMap)
    24. .mode(NavigationMode.Auto)
    25. }
    26. }
    1. export class DfRouter {
    2. ....省略代码
    3. /**
    4. * @param builderName
    5. * @param builder
    6. */
    7. public static getBuilder(builderName: string): WrappedBuilder<[object]> {
    8. let builder = DfRouter.builderMap.get(builderName);
    9. return builder as WrappedBuilder<[object]>;
    10. }
    11. ....省略代码
    12. }

    上面代码  根据模块名,获取WrappedBuilder对象,通过builder接口创建页面
          DfRouter.getBuilder(name).builder(param)   方法是返回了个一个WrapeedBudilder

    注册页面路由原来是这样的

    1. export default class DfAbilityStage extends AbilityStage{
    2. onCreate(): void {
    3. GlobalContext.getContext().setObject("appContext", this.context.getApplicationContext());
    4. this.initRouter();
    5. }
    6. /**
    7. * 将entry中所有页面一次性注册进来
    8. */
    9. initRouter() {
    10. let navPathStack: NavPathStack = new NavPathStack()
    11. GlobalContext.getContext().setObject('entryPageStack', navPathStack);
    12. DfRouter.createNavPathStack(navPathStack);
    13. // 加载页面
    14. import('./pages/AdPage');
    15. import('./pages/HomePage');
    16. import('./pages/TestAPage');
    17. import('./webContainer/pages/WebPage');
    18. }
    19. }
    1. static readonly PAGE_AD: RouterInfo = new RouterInfo('entry', 'AdPage');
    2. static readonly PAGE_TEST: RouterInfo = new RouterInfo('entry', 'TestPage');
    1. DfRouter.registerRouterPage(RouterInfo.PAGE_WEB, wrapBuilder(getWebPage));

    而下面api12 更新了,变成了让人舒服的 理想状态,同时哪些生命周期也有了

    1. // 该示例演示NavDestination的生命周期时序。
    2. @Builder
    3. export function PageOneBuilder(name: string, param: Object) {
    4. PageOneComponent()
    5. }
    6. @Component
    7. struct PageOneComponent {
    8. private stack: NavPathStack | null = null;
    9. @State eventStr: string = "";
    10. build() {
    11. NavDestination() {
    12. Column() {
    13. Text("event: " + this.eventStr)
    14. Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
    15. .width('80%')
    16. .height(40)
    17. .margin(20)
    18. .onClick(() => {
    19. if (this.stack) {
    20. this.stack.pushPath({name: "pageOne"});
    21. }
    22. })
    23. Button('pop', { stateEffect: true, type: ButtonType.Capsule })
    24. .width('80%')
    25. .height(40)
    26. .margin(20)
    27. .onClick(() => {
    28. this.stack?.pop()
    29. })
    30. }
    31. .width('100%')
    32. .height('100%')
    33. }
    34. .title('pageOne')
    35. .onAppear(() => { this.eventStr += ""; })
    36. .onDisAppear(() => { this.eventStr += ""; })
    37. .onShown(() => { this.eventStr += ""; })
    38. .onHidden(() => { this.eventStr += ""; })
    39. .onWillAppear(() => { this.eventStr += ""; })
    40. .onWillDisappear(() => { this.eventStr += ""; })
    41. .onWillShow(() => { this.eventStr += ""; })
    42. .onWillHide(() => { this.eventStr += ""; })
    43. // onReady会在onAppear之前调用
    44. .onReady((ctx: NavDestinationContext) => {
    45. try {
    46. this.eventStr += "";
    47. this.stack = ctx.pathStack;
    48. } catch (e) {
    49. console.log(`testTag onReady catch exception: ${JSON.stringify(e)}`)
    50. }
    51. })
    52. }
    53. }
    54. @Entry
    55. @Component
    56. struct NavigationExample3 {
    57. private stack : NavPathStack = new NavPathStack();
    58. build() {
    59. Navigation(this.stack) {
    60. Stack({alignContent: Alignment.Center}) {
    61. Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
    62. .width('80%')
    63. .height(40)
    64. .margin(20)
    65. .onClick(() => {
    66. this.stack.pushPath({ name: "pageOne" })
    67. })
    68. }
    69. .width('100%')
    70. .height('100%')
    71. }
    72. .width('100%')
    73. .height('100%')
    74. .title('Navigation')
    75. }
    76. }

    注册路由方式也改变了

    1. // 工程配置文件module.json5中配置 {"routerMap": "$profile:route_map"}
    2. // route_map.json
    3. {
    4. "routerMap": [
    5. {
    6. "name": "pageOne",
    7. "pageSourceFile": "src/main/ets/pages/Index.ets",
    8. "buildFunction": "PageOneBuilder",
    9. "data": {
    10. "description": "this is pageOne"
    11. }
    12. }
    13. ,
    14. {
    15. "name": "/modules/scan",
    16. "pageSourceFile": "src/main/ets/pages/scan/ScanViewPage.ets",
    17. "buildFunction": "getScanPage",
    18. "data": {
    19. "description": "this is pageOne"
    20. }
    21. },
    22. ]
    23. }

    版本api12 加了配置文件的映射表不再是动态的了

    是不是看着舒服多了,详细内容看api12 文档哈,感觉有用记得点个赞,感谢了!!

  • 相关阅读:
    Json、JDBC
    ECMAScript6介绍及环境搭建
    C++学习笔记
    Redis -- SpringBoot集成Redis
    日常工作报告生成器微信小程序源码 支持日报,周报,月报,年终终结
    亳州市的自然风光与旅游资源:欣赏安徽省中部的壮丽景色
    Docker - Docker启动的MySql修改密码
    新160个CrackMe分析-第6组:51-60(下)
    华大智造科创板上市:募资36亿市值413亿 汪健再敲钟
    虹科方案|具有RDMA复制写入日志的高可用性HDD存储集群可提供出色的性能
  • 原文地址:https://blog.csdn.net/ai_yong_jie/article/details/139616206