HarmonyOS 鸿蒙Next集成fluter boost pop无法收到数据

HarmonyOS 鸿蒙Next集成fluter boost pop无法收到数据 鸿蒙集成fluter boost,flutter跳转页面采用withContainer 为true的形式后,flutter 页面pop后数据回传不到其他flutter页面。

Ability的配置如下

export default class EntryAbility extends UIAbility implements FlutterBoostDelegate{ pushNativeRoute(options: FlutterBoostRouteOptions, onPageResult?: ((pageName: string, result: Record<string, Object>) => void) | undefined): void { throw new Error(‘Method not implemented.’); } pushFlutterRoute(options: FlutterBoostRouteOptions, onPageResult?: ((pageName: string, result: Record<string, Object>) => void) | undefined): void { // throw new Error(‘Method not implemented.’); router.pushUrl({ url: ‘pages/AppFlutterPage’, params: { uri: options.getPageName(), params: JSONUtil.toString(options.getArguments()), } }).then(() => { console.info(‘Succeeded in jumping to the second page.’) }) } popRoute(options: FlutterBoostRouteOptions): boolean { // 获取当前页面名称 const pageName = options.getPageName(); const value = options.getArguments(); entryLogger.debug(Pop route called for page: ${pageName})

// router.back({
//   url: "pages/Index",
//   params: value
// });
return false

}

我的容器是这个

@Entry @Component struct AppFlutterPage { private flutterEntry?: FlutterBoostEntry; private flutterView?: FlutterView

aboutToAppear() { let option = router.getParams() as RouterOptions let params = option.params; this.flutterEntry = new FlutterBoostEntry(getContext(this), { uri: option.uri, params: JSON.parse(params as string) }) this.flutterEntry?.aboutToAppear() this.flutterView = this.flutterEntry?.getFlutterView() } aboutToDisappear() { this.flutterEntry?.aboutToDisappear() } onPageShow() { this.flutterEntry?.onPageShow() } onPageHide() { this.flutterEntry?.onPageHide() } onBackPress(): boolean | void { FlutterBoost.getInstance() .getPlugin()?.onBackPressed(); return true; }

build() { Column() { FlutterPage({ viewId: this.flutterView?.getId() }) .width(‘100%’) .height(‘100%’) } .width(‘100%’) .height(‘100%’) } }

flutter跳转代码如下

var data = await BoostNavigator.instance.push(
    Routes.contentFilteringPage,
    arguments: {"categorys" : widget.categorys?.map((e) => e.toJson()).toList(),
                // "selectContentFileter" : SelectContentFileter(categories,subCategories).toJson(),
                "title":"热门推荐"} ,
    withContainer: !AppConfig.isFlutterRun,
    opaque: true
);

// 处理返回数据(确保是基本类型)
if (data != null && data is Map) {
  setState(() {
    categories = data['selectedCategoryIndex'];
    subCategories = data['selectedSubCategoryIndex'];
    _changeHeight();
  });
  _buttonClick();
  _scrollToInitialPosition();

}

返回数据拿不到


更多关于HarmonyOS 鸿蒙Next集成fluter boost pop无法收到数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

感谢您的提问,为了更快解决您的问题,麻烦请补充以下信息:复现代码(如最小复现demo)。

注:目前代码无法复现问题。

更多关于HarmonyOS 鸿蒙Next集成fluter boost pop无法收到数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是不是pushFlutterRoute没有将onPageResult回调传递给鸿蒙路由系统导致无法接收返回数据?

路由回调------

pushFlutterRoute(options: FlutterBoostRouteOptions,
  onPageResult?: (pageName: string, result: Record<string, Object>) => void): void {
  
  router.pushUrl({
    url: 'pages/AppFlutterPage', 
    params: {
      uri: options.getPageName(),
      params: JSONUtil.toString(options.getArguments()),
      // 传递回调标识
      callbackId: options.getUniqueId() 
    }
  }).then(() => {
    // 绑定回调到路由实例
    if (onPageResult) {
      FlutterBoost.getInstance().registerPageResultObserver(
        options.getUniqueId(), 
        (result: Record<string, Object>) => onPageResult(options.getPageName(), result)
      );
    }
  })
}

然后再看一下popRoute方法是否执行页面关闭操作,仅返回false导致数据无法传递。

页面关闭逻辑------

popRoute(options: FlutterBoostRouteOptions): boolean {
  // 执行实际页面返回操作
  router.back({ 
    url: "pages/AppFlutterPage",
    params: options.getArguments()
  });
  return true; // 必须返回true表示已处理
}

在HarmonyOS Next中,Flutter Boost的pop操作无法接收数据,通常是由于页面路由栈管理机制差异导致。鸿蒙的方舟框架与Flutter Engine在跨页面数据回传时存在兼容性问题,数据可能被方舟的页面生命周期拦截或丢失。需检查Flutter Boost与HarmonyOS路由的对接实现,确保pop方法正确触发数据回调。

在HarmonyOS Next中集成Flutter Boost时,页面pop后无法接收返回数据的问题通常与路由管理和数据传递机制有关。根据您提供的代码,主要问题可能出现在popRoute方法的实现上。

当前popRoute方法返回false,这表示路由未被处理,Flutter Boost无法正确传递返回数据。需要修改该方法以正确处理路由返回和数据传递:

popRoute(options: FlutterBoostRouteOptions): boolean {
  const pageName = options.getPageName();
  const result = options.getArguments();
  
  // 通知Flutter Boost路由已处理,并传递返回数据
  FlutterBoost.getInstance().getPlugin()?.onNativeResult(pageName, result);
  
  // 执行实际的路由返回操作
  router.back();
  return true; // 返回true表示路由已处理
}

同时确保在Flutter侧的页面pop时正确传递数据:

// 在需要返回数据的页面
BoostNavigator.instance.pop({'selectedCategoryIndex': 1, 'selectedSubCategoryIndex': 2});

还需要检查pushFlutterRoute方法中的onPageResult回调是否正确设置,这是接收返回数据的关键机制。

回到顶部