HarmonyOS鸿蒙Next中Flutter侧滑返回适配

HarmonyOS鸿蒙Next中Flutter侧滑返回适配 使用Flutter开发的项目, 从页面A push 到页面B,然后侧滑返回,整个APP退出到后台了,

怎么不是返回到A页面呢?

await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => const ManageSpacesScreen()),
);
4 回复

同问

更多关于HarmonyOS鸿蒙Next中Flutter侧滑返回适配的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


我已经解决了。更新flutter版本。

在HarmonyOS NEXT中,Flutter侧滑返回适配需使用WillPopScope拦截返回事件,并调用SystemChrome.setSystemUIOverlayStyle设置systemNavigationBarContrastEnforced: false。同时,通过ohos平台专用插件(如ohos_flutter_back_gesture)注册手势回调,覆盖系统默认侧滑区域。在pop逻辑中调用Navigator.of(context).pop()即可实现。

在HarmonyOS Next 上,系统侧滑手势默认触发Ability 的退出,而非Flutter 内部路由的pop。需在原生侧拦截返回事件并交给Flutter 处理,或禁用系统手势。

核心适配:重写onBackPress,调用 Flutter 导航通道的popRoute;同时禁用边缘侧滑手势,避免直接退出。

EntryAbility.ets 示例:

import { FlutterAbility, FlutterEngine } from '@ohos/flutter_ohos';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends FlutterAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    super.onWindowStageCreate(windowStage);
    // 禁用系统侧滑返回手势,交由Flutter自有手势接管
    windowStage.getMainWindow().then(mainWindow => {
      mainWindow.setWindowSystemGestureEnable('backGesture', false);
    });
  }

  onBackPress(): boolean {
    // 优先让Flutter处理返回
    const engine = FlutterEngine.getEngine(this);
    if (engine) {
      const navChannel = engine.getNavigationChannel();
      if (navChannel?.popRoute()) {
        return true; // 已消费,不回传系统
      }
    }
    return super.onBackPress(); // 路由栈空时允许退出
  }
}

这样侧滑时,若Flutter路由栈非空则执行pop回到A页面;若已是根页面,则按系统默认行为退出。注意popRoute 返回true表示Flutter 已处理。

回到顶部