鸿蒙开发:自定义路由,自动生成路由表

752 阅读3分钟

在鸿蒙开发中,有两种路由跳转的方法,一个是router,还有一个就是Navigation。

今天就带大家看一下鸿蒙官方文档中自定义路由的方案。官网git地址。导入这个后,我们可以在每一个page页面通过注解配置自动生成路由名称,然后直接调用方法就可以跳转页面。

首页我们要把routermodule包导入到自己的项目中,然后就是初始化工作。DynamicsRouter是我们需要用到的一个工具类,首先我们要进行初始化。在ability的oncreta中

DynamicsRouter.routerInit({
  libPrefix: "@ohos", mapPath: "routerMap"
}, this.context);

其中,HOME_PAGE代表你的主moudle,以及进入的第一个page,需要和路由进行一个绑定

// 主页路由信息
export const HOME_PAGE: AppRouterInfo = {
  pageModule: "entry",
  name: 'RootPage',
  registerFunction: ""
}

初始化成功之后就可以动态添加路由信息了,由于这个路由是根据import动态导包来生成的,所以entry需要依赖routermodule,所以如果你想要在enrty中也进行路由跳转的话,也需要routermodule来依赖entry,这样就进行了一个相互依赖,是不能运行的,所以在项目的规划阶段,在entry中只需要放首页的第一个页面壳子,其他的页面或者功能全部放在其他的har包中,这样才能进行跳转。我就是升级stuido版本之后报错无法运行,把其他所有的类都进行了迁移,可以说相当麻烦。

接着来讲,当你创建其他的har包后,需要在这个har包的oh-package.json5中来依赖routermodule类

"dependencies": {
  // 动态路由模块,用于配置动态路由
  "@ohos/dynamicsrouter": "file:../../common/routermodule",
}

然后就可以来对你的page进行一个注解

//这个是动态添加,其中name代表了跳转路由时候的名称,hasParam代表的是否允许传值。
@AppRouter({ name: "login/AccountLoginPage", hasParam: true })
@Component
export struct AccountLoginPage {

之后还需要修改hvigorfile中的文件,来进行自动生成

import { harTasks } from '@ohos/hvigor-ohos-plugin';
import { PluginConfig, etsGeneratorPlugin } from '@app/ets-generator';

// 配置路由信息
const config: PluginConfig = {
  // 扫描文件的路径
  scanFiles: [
    "src/main/ets/pages/AccountLoginPage",
   
  ]
}

export default {
  system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
  plugins: [etsGeneratorPlugin(config)]         /* Custom plugin to extend the functionality of Hvigor. */
}

注意,system: harTasks这块,如果你是har包就添加harTasks这块,hap包就添加hapTasks 添加完成之后,你会发现你的ets/generated中会自动生成路由文件,这个生成就行,我们不用管。

接着我们需要把所有有路由跳转的模块都在entry的oh-package.json5中导入:

"dependencies": {
  "@ohos/base": "file:../base/base",
  "@ohos/dynamicsrouter" : "file:../common/routermodule",
  "@ohos/home": "file:../feature/home",
  "@ohos/login" : "file:../common/login",
  "@ohos/setting": "file:../feature/setting",
}

然后在build-profile.json5中进行导入:

"buildOption": {
  "arkOptions": {
    // TODO:知识点:动态路由中使用了动态import变量表达式的能力,需要在这里配置模块名,和oh-package.json5中dependencies下面配置的模块名相同。
    "runtimeOnly": {
      "sources": [
      ],
      "packages": [
        "@ohos/base",
        "@ohos/login" ,
        "@ohos/dynamicsrouter",
        "@ohos/setting",
      ]
    }
  }
}

之后,就可以测试路由跳转了。DynamicsRouter.pushUri('@ohos/login/AccountLoginPage'),这里注意,我们所有的依赖前面都是有加@ohos/,所以路由的时候也要加上。

如果你在跳转的时候需要携带参数,只要在DynamicsRouter.pushUri('@ohos/login/AccountLoginPage',’xxx‘)

然后在接收的类里写上

let json = this.pageStack.getParamByName("login/AccountLoginPage")[0] as IntentParms;

这就是一个基本版本的自定义路由跳转,然后你也可以自己写一个包装类,来对路由进行一个统一的拦截处理,比如登录之类的。