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 侧滑

六、后续维护提示

  1. Flutter 侧 :只要继续用 GetX, 无需再改代码 。
  2. 原生侧 :若以后想改阈值(例如 ≥3 才禁止),只需改 isRoot = routeCount.intValue <= 1 这一行。
  3. 多端复用 : QFFlutterViewController 是所有 Flutter 页面的统一容器, 改一处即可全局生效 。
posted @ 2026-01-13 15:10  代码只是一种思想  阅读(2)  评论(0)    收藏  举报