Flutter 原生混合开发侧滑手势处理
一、需求一句话
当 Flutter 页面栈只剩 1 个页面 时,允许 iOS 原生侧滑返回; 当栈深度 >1 时,禁止侧滑,避免与 Flutter 内部导航冲突。
二、实现总览
角色 承担职责 关键文件 Flutter (GetX) 每次路由变化 → 把当前栈深度发给原生 任意 GetObserver 或 ever(Get.routing,...) 原生容器 接收深度 → 开关 interactivePopGestureRecognizer QFFlutterViewController.m 消息通道 统一走 message_channel (已存在) 通道名: message_channel
三、Flutter 端(GetX)代码
在 main.dart 里加一次即可:
import 'package:flutter/services.dart';
import 'package:get/get.dart';
const _channel = MethodChannel
('message_channel');
/// 监听 GetX 路由栈变化
void monitorGetxStack() {
ever(Get.routing, (_) {
final depth = Get.routeTree.routes.
length; // GetX 栈深度
_channel.invokeMethod
('getFlutterNum', {
'routeCount': depth,
'routeStack': Get.routeTree.routes.
map((e) => e.name).toList(),
});
});
}
void main() {
runApp(MyApp());
monitorGetxStack(); // ← 启动监听
}
说明:
- 通道名保持与原生现有 message_channel 一致, 无需新建 。
- 每次 push/pop 自动触发, 无需手动调用 。
四、原生端(QFFlutterViewController)代码
文件: /Users/wangzilong/Desktop/B/QuFang-App/QuFangApp/QuFangApp/FootBaseTier/BaseToolClass/QFFlutterViewController.m
在 viewDidLoad 的 messageChannel 回调里追加:
/* ====== Flutter 栈深度驱动的侧滑手势开关
====== */
if ([returnBeNil(message[@"method"])
isEqualToString:@"getFlutterNum"]) {
NSNumber *routeCount = message
[@"routeCount"];
if (routeCount) {
BOOL isRoot = routeCount.intValue
<= 1;
self.navigationController.
interactivePopGestureRecognizer.
enabled = isRoot;
}
callback(@{@@"status": @"ok"});
return;
}
/*
==========================================
== */
说明:
- 沿用已有宏 returnBeNil 做 nil 保护。
- 只在 当前 Flutter 容器 内生效, 不影响其他原生页面 。
五、链路时序图(简化)
Flutter 页面变化
↓
GetX 触发 ever(Get.routing, ...)
↓
invokeMethod('getFlutterNum',
{routeCount: n})
↓
原生 messageChannel 收到
↓
routeCount ≤ 1 → enable 侧滑
routeCount > 1 → disable 侧滑
六、后续维护提示
- Flutter 侧 :只要继续用 GetX, 无需再改代码 。
- 原生侧 :若以后想改阈值(例如 ≥3 才禁止),只需改 isRoot = routeCount.intValue <= 1 这一行。
- 多端复用 : QFFlutterViewController 是所有 Flutter 页面的统一容器, 改一处即可全局生效 。

浙公网安备 33010602011771号