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
相关产品推荐
相关产品推荐

