我在react-native中安装了react-navigation软件包
我已经实现了标签导航,其中一个是在webview格式实现的。
我的问题是,如果我在Android上按下后退物理按钮,我会从应用程序本身转到上一个标签页,而不是从WebView返回。
我已经在互联网上为webview应用了后退按钮,但我还没有这样做。
我尝试在调试时显示onNavigationStateChange日志,但在第一次启动时加载url后,当url被移动时,它没有更新。下面是我实现的代码:
import React from "react";
import {BackHandler} from "react-native";
import {WebView} from "react-native-webview";
class SermonScreen extends React.Component {
constructor(props) {
super(props);
}
static navigationOptions = {
header: null
};
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackButton);
}
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress', this.handleBackButton);
}
_onNavigationStateChange(navState) {
console.log(navState);
this.setState({
canGoBack: navState.canGoBack
});
}
handleBackButton = () => {
console.log(this.state);
if (this.state.canGoBack === true) {
this.webView.goBack();
return true;
} else {
return false;
}
};
render() {
return (
<WebView
source={{uri: 'https://m.youtube.com/channel/UCw3kP3qCCF7ZpLUNzm_Q9Xw/videos' }}
ref={(webView) => this.webView = webView}
onNavigationStateChange={this._onNavigationStateChange.bind(this)}
/>
);
}
}
export default SermonScreen;
3条答案
按热度按时间ejk8hzay1#
按照官方的webview文档,你可以尝试这样做:https://github.com/react-native-community/react-native-webview/blob/master/docs/Guide.md#intercepting-hash-url-changes
通常情况下,您几乎可以做到这一点,但是YT导航的工作方式使得无法通过 onNavigationStateChange 捕获它,这就是为什么我们注入一个JS代码,该代码可以拦截这些哈希更改并向父组件发布一条消息,然后我们在 onMessage 处理程序中捕获它并正确设置状态变量。属性添加到您的示例中应该可以解决您的问题。
我为您准备了一个组件,它似乎可以满足您的需求:
zf9nrax12#
上面的响应是完美的。不过我将
canGoBack
的状态设置为true;我得到一个空错误,所以:2guxujil3#
下面是一个使用React's State的魔力的简单解决方案。
希望这对你有帮助。
原始答案https://stackoverflow.com/a/74500469/7823800