HarmonyOS 页面跳转传值类型为自定义数据类型时闪退,如何正确页面跳转传值类型为自定义数据类型?

如题:HarmonyOS 页面跳转传值类型为自定义数据类型时闪退,如何正确页面跳转传值类型为自定义数据类型?

阅读 626
1 个回答

页面跳转传值类型为自定义数据类型时出现闪退的问题,可能是由于以下几个原因导致的:

1.数据类型不支持:router传的对象是一个代理对象,会丢失源对象原型。目前不支持类中传递方法。因此,如果自定义数据类型是一个函数,就会导致闪退。

2.参数传递方式:默认情况下,页面跳转时传递的参数是通过URL进行传递的。如果自定义数据类型不支持通过URL传递,就会导致数据无法正确传递,从而导致闪退。

为了正确传递自定义数据类型,可以考虑以下几种方法:

1.使用JSON格式:将自定义数据类型转换为JSON格式,然后通过URL参数传递。在目标页面接收参数后,再将JSON数据解析为自定义数据类型。

2.使用全局变量:在跳转时,将自定义数据类型作为全局变量传递。在目标页面通过全局变量获取传递的数据。

3.使用事件传递:如果是在同一个页面内的跳转,可以使用事件传递数据。在跳转时,将自定义数据类型作为事件参数传递,在目标页面通过事件回调获取数据。通过以上方法,可以确保自定义数据类型在页面跳转时正确传递,避免闪退问题。

页面1传递数据

export class RouteParams {
  constructor(key1?: string, key2?: string) {
    this.key1 = key1;
    this.key2 = key2;
  }
  // 这里是要传递的两个参数
  public key1?: string;
  public key2?: string;

  // 这里将参数做拷贝
  public copy(oldParams?: RouteParams) {
    this.key1 = oldParams?.key1;
    this.key2 = oldParams?.key2;
  }
  // 测试方法
  public doTest() {
    console.log('doTest', key1: ${this.key1});
  }
}
Text(this.message)
  .fontSize(50)
  .fontWeight(FontWeight.Bold)
  .onClick(() => {
    let routeParams = new RouteParams('value1', 'value2'); // 将对象通过router传递过去
    router.pushUrl({
      url: "pages/Page20",
      params: routeParams
    })
  })

页面2:接收数据

onPageShow(): void {
  // 这里第二个界面接收参数,注意 接收的实际是一个代理对象,会丢失方法
  let params = router.getParams() as RouteParams | undefined;
  console.info('aboutToAppear: ' + JSON.stringify(params));
  // 这里重新创建一个对象,然后拷贝数据
  let newRouteParams = new RouteParams();
  newRouteParams.copy(params);
  newRouteParams.doTest(); // 这里提示undefined
}