Kraken 中如何正确监听页面返回事件?
我在用 Kraken 开发一个移动端页面,想在用户点击返回按钮时弹出确认提示,但试了 history.back() 和 popstate 都没生效。官方文档里也没找到相关说明,是不是 Kraken 有自己的一套路由监听方式?
我尝试过这样写:
window.addEventListener('popstate', () => {
if (confirm('确定要离开吗?')) {
// 继续返回
} else {
history.pushState(null, '', location.href);
}
});
但完全没触发,控制台也没报错,是不是 Kraken 的 WebView 层拦截了返回操作?
原理是这样:Kraken 运行在 Flutter WebView 之上,返回按钮的事件是由 Flutter 层处理的,不会触发浏览器原生的 popstate 事件。你需要通过 Kraken 提供的桥接 API 来监听。
正确的做法是使用 Kraken 的 backPressed 回调:
解释一下返回值的意思:返回 true 表示你已处理这个事件,Kraken 不会执行返回;返回 false 表示你放行,让 Kraken 执行默认的返回操作。
如果你用的是比较老的 Kraken 版本,可能没有 setBackPressedHandler 这个方法,那时候需要用另一种方式——通过 Flutter 端主动发消息给 JS:
你试试第一种方式,应该能解决你的问题。
先检查一下你的代码,问题出在 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 端拦截。