Kraken 中如何正确监听页面返回事件?
我在用 Kraken 开发一个移动端页面,想在用户点击返回按钮时弹出确认提示,但试了 history.back() 和 popstate 都没生效。官方文档里也没找到相关说明,是不是 Kraken 有自己的一套路由监听方式?
我尝试过这样写:
window.addEventListener('popstate', () => {
if (confirm('确定要离开吗?')) {
// 继续返回
} else {
history.pushState(null, '', location.href);
}
});
但完全没触发,控制台也没报错,是不是 Kraken 的 WebView 层拦截了返回操作?
先检查一下你的代码,问题出在 popstate 事件的触发条件上。在标准 Web 里,popstate 只有在"当前页面有历史记录可以返回"的时候才会触发,而且用户主动点击返回按钮时,页面已经执行了返回操作,popstate 才会 fired。
Kraken 这边更麻烦,它的渲染层在 Flutter 侧,返回按钮的拦截优先级比 JS 层高。你的代码没报错但也不触发,就是因为返回操作在底层就被消费掉了。
正确的做法是用 Kraken 提供的
historyAPI 配合beforeunload或者直接用popstate但要提前 pushState。给你一个能跑的方案:如果上面这个方案还是不行,那说明你的 Kraken 版本在 Flutter 端把返回事件完全拦截了。这时候需要在 Flutter 宿主那边处理,给 KrakenWidget 包一层 WillPopScope:
说实话 Kraken 的文档这块写得挺模糊的,我当初也是翻源码才搞明白。你的判断没错,确实是 WebView 层(准确说是 Flutter 层)把返回操作拦截了,JS 的 popstate 能不能触发取决于底层的实现。
建议先试第一个纯 JS 方案,不行再走 Flutter 端拦截。