Here is how you create a browser screen that puts the title and url in the header from using webview while also using react hooks.
import React from "react";
import { useEffect } from "react";
import { useState } from "react";
import { Text } from "react-native";
import { View, SafeAreaView, ActivityIndicator } from "react-native";
import { WebView } from "react-native-webview";
const BroswerScreen = ({ route, navigation }) => {
const { url } = route.params;
const [isLoading, setLoading] = useState(true);
const [title, setTitle] = useState(null)
const [urlHeader, setUrlHeader] = useState(null)
useEffect(() => {
console.log(title)
console.log(urlHeader)
console.log(isLoading)
if(title && urlHeader){
navigation.setOptions({
headerStyle: { height: 100 },
headerTitle: ()=> (
<View>
<Text numberOfLines={1} style={{fontSize: 16, fontWeight: "bold"}}>{title}</Text>
<Text numberOfLines={1}>{urlHeader}</Text>
</View>)
});
}
}, [title,urlHeader, isLoading]);
return (
<SafeAreaView style={{ flex: 1, backgroundColor: "white" }}>
<WebView
startInLoadingState={true}
renderLoading={() => {
return <Spinner />;
}}
style={{ flex: 1 }}
source={{ uri: url }}
injectedJavaScript= "window.ReactNativeWebView.postMessage(document.title)"
onMessage={(message) => setTitle(message.nativeEvent.data)}
onNavigationStateChange={(event) => {setTitle(event.title); setUrlHeader(event.url); setLoading(false)}}
/>
</SafeAreaView>
);
};
const Spinner = () => {
return (
<View
style={{
flex: 1,
height: "100%",
width: "100%",
}}
>
<ActivityIndicator color={"blue"} size="large" />
</View>
);
};
export default BroswerScreen;
You would route to this screen using something like the following
onPress(
navigation.navigate(BROWSERSCREEN, {
url: "https://www.mylink.com",
})
)