Navigasi pada React Native (Stack, Tab, Drawer)
Stack Navigation
6. Konsep Stack Navigation
Stack Navigation bekerja seperti tumpukan kartu. Setiap screen baru ditambahkan di atas stack. Ketika back, screen teratas dihapus dan kembali ke screen sebelumnya. Ini adalah pola navigasi paling umum di mobile apps, mirip dengan history browser tetapi lebih visual dengan animasi transisi.
7. Instalasi @react-navigation/native-stack
npm install @react-navigation/native-stack
Native Stack Navigator menggunakan native navigation APIs untuk performa optimal.
8. Struktur Dasar Stack Navigator
import { createNativeStackNavigator } from "@react-navigation/native-stack";
const Stack = createNativeStackNavigator();
function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
9. Membuat Screen Pertama
import { View, Text, StyleSheet } from "react-native";
function HomeScreen() {
return (
<View style={styles.container}>
<Text style={styles.title}>Home Screen</Text>
<Text>Ini adalah halaman utama aplikasi</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
title: {
fontSize: 24,
fontWeight: "bold",
marginBottom: 10,
},
});
10. Navigasi Antar Screen dengan navigation.navigate()
import { View, Text, Button } from "react-native";
function HomeScreen({ navigation }) {
return (
<View style={styles.container}>
<Text style={styles.title}>Home Screen</Text>
<Button
title="Go to Details"
onPress={() => navigation.navigate("Details")}
/>
</View>
);
}
Prop navigation otomatis tersedia di setiap screen component.
11. Passing Parameters Antar Screen
function HomeScreen({ navigation }) {
return (
<View style={styles.container}>
<Text style={styles.title}>Home Screen</Text>
<Button
title="Go to Details"
onPress={() =>
navigation.navigate("Details", {
itemId: 86,
itemName: "React Native Course",
price: 150000,
})
}
/>
</View>
);
}
12. Mengakses Parameter di Screen Tujuan
function DetailsScreen({ route, navigation }) {
const { itemId, itemName, price } = route.params;
return (
<View style={styles.container}>
<Text style={styles.title}>Details Screen</Text>
<Text>Item ID: {itemId}</Text>
<Text>Item Name: {itemName}</Text>
<Text>Price: Rp {price.toLocaleString()}</Text>
</View>
);
}
13. Navigasi Kembali dengan navigation.goBack()
function DetailsScreen({ route, navigation }) {
const { itemName } = route.params;
return (
<View style={styles.container}>
<Text style={styles.title}>{itemName}</Text>
<Button title="Go Back" onPress={() => navigation.goBack()} />
<Button title="Go to Home" onPress={() => navigation.navigate("Home")} />
</View>
);
}
14. Kustomisasi Header Stack Navigator
<Stack.Navigator
screenOptions={{
headerStyle: {
backgroundColor: "#6200ee",
},
headerTintColor: "#fff",
headerTitleStyle: {
fontWeight: "bold",
},
}}
>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: "Beranda" }}
/>
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{ title: "Detail Produk" }}
/>
</Stack.Navigator>
15. Menambahkan Button pada Header
function HomeScreen({ navigation }) {
React.useLayoutEffect(() => {
navigation.setOptions({
headerRight: () => (
<Button
onPress={() => alert("Button clicked!")}
title="Info"
color="#fff"
/>
),
});
}, [navigation]);
return (
<View style={styles.container}>
<Text>Home Screen</Text>
</View>
);
}
16. Styling Header (Background, Tint Color)
<Stack.Screen
name="Profile"
component={ProfileScreen}
options={{
title: "Profil Saya",
headerStyle: {
backgroundColor: "#f4511e",
},
headerTintColor: "#fff",
headerTitleStyle: {
fontWeight: "bold",
fontSize: 20,
},
headerShadowVisible: false,
}}
/>
17. Menyembunyikan Header pada Screen Tertentu
<Stack.Navigator>
<Stack.Screen
name="Splash"
component={SplashScreen}
options={{ headerShown: false }}
/>
<Stack.Screen
name="Login"
component={LoginScreen}
options={{ headerShown: false }}
/>
<Stack.Screen name="Home" component={HomeScreen} />
</Stack.Navigator>