You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中push新路由后如何恢复原路由Here Maps的手势响应?

恢复Here SDK地图手势的解决方案

不需要重建根路由,以下几种方法可解决push新路由返回后根地图手势失效的问题:

1. 利用Navigator.push的Future返回值恢复手势

Navigator.push会返回一个Future,当新路由被pop后该Future完成,此时直接调用Here SDK的手势启用API:

// 根路由中跳转按钮的点击事件
onPressed: () async {
  // 等待新路由关闭
  await Navigator.of(context).push(MaterialPageRoute(builder: (_) => NewMapPage()));
  // 恢复地图手势(替换为Here SDK实际的手势启用方法)
  _mapController.gestures.enable();
},

2. 通过RouteObserver监听路由状态恢复手势

注册全局路由观察者,在根路由重新变为活跃路由时自动恢复手势:
首先在MaterialApp中添加路由观察者:

final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();

void main() {
  runApp(MaterialApp(
    home: HomeMapPage(),
    navigatorObservers: [routeObserver],
  ));
}

然后在根路由的State类中监听路由变化:

class _HomeMapPageState extends State<HomeMapPage> with RouteAware {
  late MapController _mapController;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    routeObserver.subscribe(this, ModalRoute.of(context)! as PageRoute);
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPopNext() {
    // 从新路由返回后,当前路由重新活跃时触发
    _mapController.gestures.enable();
  }

  // 地图初始化及build代码...
}

3. 使用AutomaticKeepAliveClientMixin保持路由状态

让根路由保持状态,避免手势配置因路由切换丢失:

class HomeMapPage extends StatefulWidget {
  @override
  _HomeMapPageState createState() => _HomeMapPageState();
}

class _HomeMapPageState extends State<HomeMapPage> with AutomaticKeepAliveClientMixin {
  late MapController _mapController;

  @override
  bool get wantKeepAlive => true;

  @override
  void initState() {
    super.initState();
    _mapController = MapController();
    _mapController.gestures.enable();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context); // 必须调用此方法
    return Scaffold(
      body: HereMap(mapController: _mapController),
      floatingActionButton: FloatingActionButton(
        onPressed: () => Navigator.of(context).push(MaterialPageRoute(builder: (_) => NewMapPage())),
        child: Icon(Icons.navigate_next),
      ),
    );
  }
}

注:上述代码中的_mapController.gestures.enable()需替换为Here SDK对应版本中启用手势的实际方法,可参考Here SDK官方文档中MapGestures相关API。

内容的提问来源于stack exchange,提问作者Henrique Gouveia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 05:57:22