Anda mungkin pernah mengalami salah satu dari dua situasi ini.
Entah layar Anda terlihat flat dan kurang rapi, sehingga Anda butuh background atau button yang terasa seperti produk asli, bukan sekadar scaffold. Atau Anda sudah mencoba menambahkan gradient React Native, tapi sekarang stuck di tahap setup karena setengah contoh menggunakan Expo dan setengahnya lagi mengasumsikan bare native project.
Perbedaan itulah yang membuat banyak tutorial tidak berguna. Komponen API itu simpel. Pilihan environment-nya yang tidak. Setup linear gradient React Native yang bersih tidak terlalu bergantung pada colors prop, melainkan pada apakah Anda menggunakan Expo-managed workflow atau harus menangani native linking, pods, dan test mocks sendiri.
Table of Contents
- Mengapa App React Native Anda Butuh Gradient
- Pilih Jalur Anda: Expo vs Bare React Native Setup
- Teknik Core Gradient untuk Elemen UI
- Menghidupkan Gradient dengan Animasi
- Performa, Aksesibilitas, dan Platform Quirks
- Troubleshooting dan Best Practices Akhir
Mengapa App React Native Anda Butuh Gradient
Banyak UI mobile gagal karena alasan yang sama. Layout oke, spacing oke, tipografi oke, tapi layar tetap terasa mati. Warna solid membuat semuanya tampak seperti placeholder kecuali sistem visual lainnya bekerja ekstra keras.
Sebuah linear gradient di React Native component memperbaikinya dengan sangat sedikit code. Ini menambah kedalaman, menciptakan pemisah antar section, dan memberi bobot visual yang jelas pada elemen prioritas. Background gradient yang bagus bisa membuat login screen terasa lebih hidup. Button gradient yang bagus bisa membuat aksi utama terlihat jelas tanpa perlu shadow tebal atau border yang mencolok.
Oleh Pada 2019, expo-linear-gradient dan react-native-linear-gradient muncul di lebih dari 42% proyek React Native, yang menjadi sinyal kuat bahwa gradient bukan lagi efek niche. Ini adalah standar UI di aplikasi produksi, bukan sekadar dekorasi tambahan, seperti dicatat dalam ulasan adopsi gradient React Native ini.
Kelebihan penggunaan gradient
- Menciptakan kedalaman: Layar dengan satu background flat sering terlihat tidak tuntas. Perpaduan subtle dari atas ke bawah membuat tampilan terasa berlapis.
- Mengarahkan perhatian: CTA utama, kartu onboarding, dan hero header jadi lebih menonjol tanpa menambah visual noise.
- Menggantikan aset gambar: Dalam banyak kasus, gradient memberikan kesan polish tanpa perlu menyertakan ekstra gambar background.
Aturan praktis: Gunakan gradient pada elemen hierarki penting. Background, hero cards, permukaan CTA, dan media overlay paling diuntungkan. Form field, list yang padat, dan container body copy biasanya tidak perlu.
Ada juga sudut pandang desain produk di sini. Tim yang bekerja lintas platform sudah menghabiskan waktu untuk menjaga konsistensi interface. Jika itu bagian dari stack Anda, maka praktik UI dan UX lintas platform untuk aplikasi mobile sejalan dengan pemikiran yang sama: aset lebih sedikit, permukaan yang lebih reusable, dan sistem visual yang tetap solid di berbagai layar.
Memilih Jalur: Setup Expo vs Bare React Native
Inilah fork yang paling menyulitkan. Rendering API terasa hampir identik di kedua library, namun pengaturannya tidak.
Jika Anda menggunakan Expo-managed app, gunakan expo-linear-gradient. Jika Anda menggunakan bare React Native app, gunakan react-native-linear-gradient. Jangan mencoba mengaburkan batasan tersebut kecuali Anda tahu persis alasan di baliknya.

Setup Expo
Expo adalah jalur yang lebih mulus. Instalasi sangat mudah, kecocokan versi diatur otomatis, dan Anda tidak perlu memikirkan native linking.
Cara installnya:
npx expo install expo-linear-gradient
Cara pakainya:
import React from 'react';
import { StyleSheet, View, Text } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
export default function App() {
return (
<LinearGradient
colors={['#0f172a', '#1d4ed8']}
style={styles.container}
>
<Text style={styles.text}>Hello gradient</Text>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
color: '#fff',
fontSize: 24,
fontWeight: '700',
},
});
Expo adalah pilihan tepat jika Anda ingin setup cepat, default yang stabil, dan minim kendala native. Itulah alasan tim yang mengeksplorasi workflow Expo tingkat lanjut sering membandingkan Capgo dan Expo EAS untuk live updates saat jalur managed sudah tidak mencukupi kebutuhan aplikasi.
Setup Bare React Native
Bare React Native memberi Anda akses langsung ke native module, tapi Anda harus menangani kerumitannya sendiri.
Install package-nya:
npm install react-native-linear-gradient
Untuk iOS, install pods:
cd ios && pod install
Penggunaan dasar:
import React from 'react';
import { StyleSheet, Text } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
export default function App() {
return (
<LinearGradient
colors={['#111827', '#7c3aed']}
style={styles.container}
>
<Text style={styles.text}>Hello gradient</Text>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
color: '#fff',
fontSize: 24,
fontWeight: '700',
},
});
Di mana proyek bare biasanya bermasalah
Bagian yang sering terlewat di kebanyakan tutorial adalah testing dan native setup. Menurut ringkasan diskusi Stack Overflow ini, 68% thread Stack Overflow mengenai topik ini pada 2024 hingga 2025 melibatkan kegagalan native module pada setup bare React Native, dan sumber yang sama mencatat masalah berulang pada Jest mocking dan konflik iOS CocoaPods.
Jika Anda menggunakan Jest di bare app, tambahkan mock secara eksplisit:
// jest.setup.js
import mockRNLinearGradient from 'react-native-linear-gradient/jest/linear-gradient-mock';
jest.mock('react-native-linear-gradient', () => mockRNLinearGradient);
Dan referensikan file setup tersebut di Jest config Anda:
module.exports = {
preset: 'react-native',
setupFiles: ['<rootDir>/jest.setup.js'],
};
Bare React Native bekerja dengan baik untuk gradient. Masalahnya hanya pada setup yang tidak lengkap. Kebanyakan kegagalan bukan bug visual, melainkan masalah linking, pods, atau environment testing.
Berikut adalah tabel keputusan praktisnya:
| Tipe proyek | Library | Paling cocok |
|---|---|---|
| Aplikasi yang dikelola Expo | expo-linear-gradient |
Jalur tercepat, setup minimal |
| Aplikasi Bare React Native | react-native-linear-gradient |
Kontrol native penuh |
| Bare app dengan Jest | react-native-linear-gradient + mock |
Wajib agar test tetap stabil |
Teknik Core Gradient untuk Elemen UI
Pendekatan umum adalah menggunakan set pola gradient kecil yang sama berulang kali. Background. Button. Headline. Jika ketiganya solid, Anda bisa menggunakannya di banyak screen.

Model mental yang berguna adalah ini:
colorsmengontrol paletstartdanendmengontrol arahlocationsmengontrol di mana transisi terjadi
Jika layar splash atau onboarding Anda menggunakan gradient, hal ini akan selaras secara alami dengan pola urutan startup yang lebih luas yang dijelaskan dalam panduan splash screen React Native ini.
Gradient background full screen
Ini adalah pola yang paling simpel dan reusable.
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
// For bare RN, switch to:
// import LinearGradient from 'react-native-linear-gradient';
export default function WelcomeScreen() {
return (
<LinearGradient
colors={['#0f172a', '#1e293b', '#2563eb']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={styles.container}
>
<View style={styles.content}>
<Text style={styles.title}>Welcome back</Text>
<Text style={styles.subtitle}>Your workspace is ready.</Text>
</View>
</LinearGradient>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
content: {
flex: 1,
justifyContent: 'center',
paddingHorizontal: 24,
},
title: {
color: '#fff',
fontSize: 32,
fontWeight: '800',
marginBottom: 8,
},
subtitle: {
color: 'rgba(255,255,255,0.8)',
fontSize: 16,
},
});
Perpaduan diagonal biasanya terasa lebih dinamis dibanding vertikal standar. Itulah mengapa start={{ x: 0, y: 0 }} dan end={{ x: 1, y: 1 }} adalah pilihan default yang bagus saat layar bersifat dekoratif.
Jangan pilih warna secara terpisah. Tes di balik teks, ikon, dan gaya status bar asli. Palet yang terlihat bagus di Figma bisa gagal total saat konten muncul di atasnya.
Button gradient yang tetap berfungsi seperti button
Kesalahan umum di sini adalah menaruh touch behavior langsung pada gradient dan melupakan disabled state, press feedback, atau konsistensi padding. Jaga button tetap semantik dan biarkan gradient menjadi layer visualnya.
import React from 'react';
import {
Pressable,
StyleSheet,
Text,
ViewStyle,
StyleProp,
} from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
type Props = {
title: string;
onPress: () => void;
disabled?: boolean;
style?: StyleProp<ViewStyle>;
};
export function GradientButton({
title,
onPress,
disabled = false,
style,
}: Props) {
return (
<Pressable onPress={onPress} disabled={disabled} style={style}>
{({ pressed }) => (
<LinearGradient
colors={
disabled
? ['#94a3b8', '#94a3b8']
: pressed
? ['#7c3aed', '#2563eb']
: ['#8b5cf6', '#3b82f6']
}
start={{ x: 0, y: 0.5 }}
end={{ x: 1, y: 0.5 }}
style={styles.button}
>
<Text style={styles.label}>{title}</Text>
</LinearGradient>
)}
</Pressable>
);
}
const styles = StyleSheet.create({
button: {
minHeight: 52,
borderRadius: 14,
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: 20,
},
label: {
color: '#fff',
fontSize: 16,
fontWeight: '700',
},
});
Untuk tombol, gradien horizontal biasanya lebih enak dilihat daripada gradien diagonal. Ini menjaga label tetap stabil dan mencegah kontrol terasa miring.
Teks gradient dengan mask
Ini adalah pola paling mencolok dalam set ini, dan sangat berguna jika digunakan secara terbatas. Hero title, banner upgrade, dan headline empty-state adalah kandidat yang bagus. Namun, teks paragraf tidak disarankan.
Anda memerlukan @react-native-masked-view/masked-view.
npm install @react-native-masked-view/masked-view
Kemudian buat text mask:
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import MaskedView from '@react-native-masked-view/masked-view';
import { LinearGradient } from 'expo-linear-gradient';
export default function GradientHeadline() {
return (
<View style={styles.container}>
<MaskedView
maskElement={
<View style={styles.maskWrapper}>
<Text style={styles.title}>Premium analytics</Text>
</View>
}
>
<LinearGradient
colors={['#22c55e', '#06b6d4', '#3b82f6']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 0 }}
locations={[0, 0.5, 1]}
>
<Text style={[styles.title, styles.hiddenText]}>Premium analytics</Text>
</LinearGradient>
</MaskedView>
</View>
);
}
const styles = StyleSheet.create({
container: {
padding: 24,
},
maskWrapper: {
backgroundColor: 'transparent',
},
title: {
fontSize: 34,
fontWeight: '800',
letterSpacing: -1,
},
hiddenText: {
opacity: 0,
},
});
locations paling penting saat Anda ingin satu warna menempati lebih banyak ruang visual dibanding warna lain. Jika blend terasa keruh, kurangi jumlah warna terlebih dahulu. Itu biasanya memperbaiki desain lebih cepat daripada mengubah setiap stop.
Menghidupkan Gradient dengan Animasi
Gradient statis memberikan kesan rapi. Gradient animasi memberikan feedback.
Kegunaan paling praktis bukanlah background yang mencolok. Melainkan shimmer loader. Efek tersebut memberi tahu pengguna bahwa aplikasi sedang aktif, data sedang dimuat, dan layout yang mereka lihat memang disengaja, bukan error.

Komponen shimmer juga melengkapi pola motion lainnya. Jika aplikasi Anda sudah menggunakan ikon atau loader animasi, ini Panduan Lottie di React Native berguna untuk memutuskan kapan shimmer gradient sudah cukup dan kapan aset animasi yang lebih kaya lebih masuk akal.
Shimmer loader dengan feel native
Versi paling simpel dan reliabel menggunakan react-native-reanimated untuk menggerakkan pita gradient melewati placeholder yang terpotong.
Install Reanimated jika belum ada di app Anda, lalu buat wrapper dengan overflow: 'hidden'. Di dalamnya, animasikan layer gradient dari kiri ke kanan.
import React, { useEffect } from 'react';
import { StyleSheet, View, ViewStyle, StyleProp } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
import Animated, {
useAnimatedStyle,
useSharedValue,
withRepeat,
withTiming,
Easing,
} from 'react-native-reanimated';
const AnimatedView = Animated.createAnimatedComponent(View);
type Props = {
width?: number | string;
height?: number;
borderRadius?: number;
style?: StyleProp<ViewStyle>;
};
export function ShimmerPlaceholder({
width = '100%',
height = 16,
borderRadius = 8,
style,
}: Props) {
const translateX = useSharedValue(-220);
useEffect(() => {
translateX.value = withRepeat(
withTiming(220, {
duration: 1200,
easing: Easing.linear,
}),
-1,
false
);
}, [translateX]);
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ translateX: translateX.value }],
}));
return (
<View
style={[
styles.container,
{ width, height, borderRadius },
style,
]}
>
<AnimatedView style={[styles.shimmer, animatedStyle]}>
<LinearGradient
colors={['rgba(255,255,255,0)', 'rgba(255,255,255,0.35)', 'rgba(255,255,255,0)']}
start={{ x: 0, y: 0.5 }}
end={{ x: 1, y: 0.5 }}
style={styles.gradient}
/>
</AnimatedView>
</View>
);
}
const styles = StyleSheet.create({
container: {
overflow: 'hidden',
backgroundColor: '#e5e7eb',
},
shimmer: {
...StyleSheet.absoluteFillObject,
width: 220,
},
gradient: {
flex: 1,
},
});
Kuncinya adalah Anda tidak mencoba menganimasi definisi gradient itu sendiri. Anda menganimasi layer gradient di atas placeholder statis. Cara ini lebih simpel, mudah dipahami, dan biasanya lebih stabil di berbagai perangkat.
Berikut adalah visualisasi efek tersebut saat dijalankan:
Komponen animasi
Beberapa catatan implementasi penting:
- Gunakan clipping: Parent perlu menggunakan
overflow: 'hidden', agar shimmer tidak keluar dari sudut rounded. - Persempit rentang warna: Layer animasi yang lebih kecil lebih mudah diatur daripada menganimasi seluruh permukaan.
- Samakan warna dasar dengan layar: Skeleton loader harus menyatu dengan layout sekitar, bukan terlihat seperti widget terpisah.
Gradien animasi bekerja paling baik saat pengguna hampir tidak menyadarinya. Jika efek shimmer menjadi hal yang paling mencolok di layar, itu berarti efeknya berlebihan.
Performa, Aksesibilitas, dan Karakteristik Platform
Saat gradient berpindah dari layar demo ke produksi, fokusnya berubah. code mungkin terlihat simpel, tapi perilaku rendering, keterbacaan, dan konsistensi platform jadi lebih penting daripada efek awalnya.
Jika Anda sedang meningkatkan responsivitas aplikasi secara menyeluruh, ini panduan optimasi performa aplikasi mobile memiliki pola pikir yang sama: kurangi kerjaan yang tidak perlu, ukur di perangkat asli, dan optimalkan bagian yang paling sering dilihat pengguna.
Checklist performa
Native gradient umumnya efisien, tapi Anda tetap bisa salah dalam menggunakannya.
- Gunakan gradient daripada gambar dekoratif besar: Lebih bersih saat di-ship dan lebih mudah adaptasi ke berbagai ukuran layar.
- Hindari menumpuk banyak layer full-screen: Satu background gradient tidak masalah. Beberapa gradient transparan yang bertumpuk plus blur dan animasi berat bisa membebani performa.
- Memoize komponen yang dapat digunakan kembali: Jika card gradient digunakan dalam list, jaga props tetap stabil dan hindari rerender akibat perubahan state parent yang tidak terkait.
Aturan praktisnya: gunakan gradient secara struktural, jangan berlebihan. Gunakan untuk mendefinisikan surface, bukan di setiap baris pada feed yang padat.
Checklist aksesibilitas
Gradient bisa merusak keterbacaan karena kontras yang berubah-ubah di seluruh surface.
- Tes teks terhadap area paling terang: Jika teks putih hanya terbaca di bagian gelap blend, maka itu tidak ideal.
- Tambahkan scrim jika diperlukan: Overlay gelap tipis di antara background dan teks sering kali lebih baik daripada mengubah seluruh palet warna.
- Gunakan teks gradient hanya untuk display copy berukuran besar: Ini terlihat bagus pada headline. Tapi ini pilihan buruk untuk label kecil, helper text, atau apa pun yang krusial untuk menyelesaikan tugas.
Periksa titik terburuk pada gradient, bukan titik yang paling bagus.
Checklist quirk platform
iOS dan Android biasanya merender gradient yang sama dengan cukup mirip, tapi tidak selalu sempurna.
| Masalah | Yang biasanya membantu |
|---|---|
| Tampilan gradient berbeda antar platform | Gunakan lebih sedikit warna dan kontras yang lebih jelas antar stop |
| Sudut membulat tidak memotong gradient | Letakkan overflow: 'hidden' pada container |
| Gradient tidak muncul sama sekali | Cek width, height, atau flex: 1 pertama |
Perhatikan juga status bar dan safe area. Gradient yang terlihat seimbang di simulator bisa terasa terlalu penuh di bagian atas pada perangkat dengan notch jika konten dan background tidak memperhitungkan ruang ekstra tersebut.
Troubleshooting dan best practice terakhir
Ini versi ringkas yang bisa saya simpan di catatan proyek.
- Sesuaikan library dengan workflow:
expo-linear-gradientuntuk aplikasi Expo-managed,react-native-linear-gradientuntuk bare React Native. - Gunakan gradient secara tepat: Background, CTA, overlay, dan hero text adalah use case yang kuat.
- Kontrol arah secara sengaja: Horizontal untuk tombol, diagonal untuk background dekoratif, atau masked hanya untuk teks besar.
- Desain untuk konten, bukan empty state: Tes dengan copy asli, ikon, dan tampilan status bar.
- Anggap setup dasar sebagai native setup: Pods, linking, dan Jest mocks bukanlah detail opsional.
Tiga kegagalan umum sering terjadi berulang kali.
Gradient tidak muncul
Penyebab: komponen tidak memiliki ukuran yang terlihat.
Solusi: berikan flex: 1, tinggi yang eksplisit, atau parent yang memiliki dimensi. Gradient tanpa layout box tidak akan merender apa pun secara visual.
Build iOS error setelah install
Penyebab: pods belum terinstal atau native dependency graph tidak sinkron.
Solusi: jalankan pod install di ios, bersihkan folder build jika perlu, lalu rebuild aplikasinya. Pada bare projects, instalasi package saja biasanya tidak cukup.
Test gagal dengan error native module
Penyebab: Jest mencoba memuat native module yang sebenarnya.
Solusi: mock react-native-linear-gradient dengan react-native-linear-gradient/jest/linear-gradient-mock di file setup Jest Anda.
Jika Anda hanya ingin mengingat satu hal dari seluruh panduan ini, ingat ini: gradient-nya sendiri mudah. Setup yang siap produksi adalah bagian utamanya. Setelah Anda memilih library yang tepat untuk arsitektur aplikasi, semua setelahnya jadi jauh lebih mudah diprediksi.
Jika tim Anda merilis hybrid mobile apps dan ingin push update JavaScript, CSS, copy, config, serta asset tanpa menunggu review store, Capgo layak dilihat. Ini memberi tim CapacitorJS dan Electron live update terkontrol, rollout channel, perlindungan rollback, dan visibilitas rilis tanpa membuat proses deployment Anda jadi black box.