如何在 appState 更改时重新加载 react-native-webview 内容

Posted

技术标签:

【中文标题】如何在 appState 更改时重新加载 react-native-webview 内容【英文标题】:How to reload react-native-webview content on appState change 【发布时间】:2021-10-13 02:12:00 【问题描述】:

我的应用中有一个网络视图。我为它设置了 onNavigationStateChange 道具来处理点击 webview 上的任何链接并将用户导航到浏览器。 问题是当用户在浏览器上按 Backandroid 时返回我的应用程序 webview 内容没有显示并且屏幕是空的和白色的。 对于这个问题,我尝试使用 appState 并在返回我的应用程序后处理其更改以重新加载 webview,但收到此错误

这是我的代码:

function Screen(props) 
  const [appState, setAppState] = React.useState(AppState.currentState);
  let webview = React.useRef(null);
  React.useEffect(() => 
    AppState.addEventListener('change', handleAppStateChange);
    return () => AppState.removeEventListener('change', handleAppStateChange);
  , []);
  function backHandler() 
    popScreen(Screens.About);
    return true;
  
  function handleAppStateChange(nextAppState) 
    if (nextAppState === 'active') 
      webview.reload();
    
    setAppState(nextAppState);
  
  const WebView = require('react-native-webview').default;
  return (
      <View style=styles.container>
        <View style=styles.web>
          <WebView
            ref=ref => 
              webview = ref;
            
            source=uri: props.link
            androidHardwareAccelerationDisabled=true // for prevent crash
            startInLoadingState=true
            onNavigationStateChange=event => 
              if (event.url !== props.link) 
                webview.stopLoading();
                Linking.openURL(event.url);
              
            
            renderLoading=() => (
              <CircleLoading
                containerStyle=[styles.loading]
                renderLoading=true
              />
            )
          />
        </View>
      </View>
  );

谢谢。

【问题讨论】:

【参考方案1】:

试试这个方法:

const [appState, setAppState] = React.useState(AppState.currentState);
  const webview = React.useRef(null);
  React.useEffect(() => 
    AppState.addEventListener('change', handleAppStateChange);
    return () => AppState.removeEventListener('change', handleAppStateChange);
  , [webview.current]);//    <---- CHANGED
  function backHandler() 
    popScreen(Screens.About);
    return true;
  
  function handleAppStateChange(nextAppState) 
    if (nextAppState === 'active') 
      webview.current.reload(); //     <---- CHANGED
    
    setAppState(nextAppState);
  
  const WebView = require('react-native-webview').default; //  <---- remove it and import it at top of file
  return (
      <View style=styles.container>
        <View style=styles.web>
          <WebView
            ref=webview //    <---- CHANGED
            ..

【讨论】:

以上是关于如何在 appState 更改时重新加载 react-native-webview 内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面重新加载超过 10 像素时激活颜色更改导航

如何在 dotnet core 3 控制台应用程序中更改时重新加载“appsettings.json”

当我在android中更改应用程序中的语言环境时如何重新加载当前视图

如果磁盘上的文件发生更改,如何重新加载 python 类?

当更新数据库后只有少量数据更改时,通常如何在设备上重新加载/显示数据? (概念上)

当我更改其在 DOM 中的位置时,如何停止 iframe 重新加载?