能否访问react-native-webview的window对象以实现无法回退时退出安卓应用
是否可以访问react-native-webview内的window对象
可以访问,react-native-webview支持通过injectedJavaScript注入代码直接操作webview内部的window对象,也可以通过postMessage机制实现RN层和web层的双向通信。但你当前要实现的「无法回退时退出安卓应用」的需求,不需要操作webview内部window对象,直接用webview组件自带的属性就能实现。
现有代码的问题
你当前的实现有两个核心问题:
- 硬件返回键的回调逻辑没有判断webview是否可以回退,无论什么场景都拦截返回事件执行
goBack,并且返回true阻止事件冒泡,导致即使没有历史回退栈也不会触发系统默认的退出应用逻辑 useEffect的清理函数写法错误,removeEventListener需要传入和绑定阶段完全相同的回调函数才能成功解绑事件,你当前的写法会导致事件无法正常清理,可能出现内存泄漏或异常触发的问题
修正后的实现代码
import React, { useState, useEffect, useRef } from 'react'; import { Platform, BackHandler, View, SafeAreaView } from 'react-native'; import WebView from 'react-native-webview'; import SplashScreen from 'react-native-splash-screen'; export default function App (){ const [currentUrl, setCurrentUrl] = useState(null) // 新增存储webview是否可以回退的状态 const [canGoBack, setCanGoBack] = useState(false) const webViewRef = useRef(null) const goback = () => { // 判断webview是否可回退 if (canGoBack && webViewRef.current) { webViewRef.current.goBack(); return true } // 不可回退时返回false,不拦截事件,触发系统默认退出应用逻辑 return false }; const onNavigationStateChange =(webViewState) =>{ setCurrentUrl(webViewState.url) // 同步更新可回退状态 setCanGoBack(webViewState.canGoBack) } useEffect(()=>{ setCurrentUrl('https://google.co.kr') setTimeout(() => { SplashScreen.hide(); }, 1000); if (Platform.OS === 'android') { BackHandler.addEventListener('hardwareBackPress', goback); // 修正清理函数写法,正确解绑事件 return () => { BackHandler.removeEventListener('hardwareBackPress', goback) } } },[]) return ( <View style={{backgroundColor:'#fff',flex:1}}> <SafeAreaView style={{flex:1,}}> <WebView style={{flex:1,}} originWhitelist={['*']} ref={webViewRef} source={{ uri: currentUrl }} onNavigationStateChange={onNavigationStateChange} /> </SafeAreaView> </View> ); }
内容的提问来源于stack exchange,提问作者boriii
相关产品推荐
相关产品推荐

