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

能否访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 15:24:04