Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap
Aktifkan atau nonaktifkan fitur dari jarak jauh dan luncurkan perubahan secara bertahap tanpa mengirim ulang aplikasi.
Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap adalah pelajaran Flutter Mobile Development gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Flutter Mobile Development, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Flutter Mobile Development mencakup 4 pelajaran total.
Mengapa Konfigurasi Jarak Jauh
Siklus peninjauan toko aplikasi berlangsung lambat. Jika suatu fitur dikirimkan dalam keadaan rusak, Anda mungkin harus menunggu berhari-hari sampai perbaikan cepat tersedia bagi pengguna. Konfigurasi jarak jauh memisahkan pengiriman kode dari pengaktifannya.
- Tanda fitur membatasi jalur kode di balik nilai boolean yang Anda kendalikan dari server.
- Konfigurasi jarak jauh menyediakan nilai yang dapat disesuaikan (string, angka, JSON) tanpa build baru.
- Peluncuran bertahap mengekspos perubahan kepada persentase pengguna yang terus bertambah.
Di Flutter, alat yang umum digunakan adalah firebase_remote_config, tetapi pola yang sama berlaku untuk LaunchDarkly, ConfigCat, atau backend Anda sendiri.
Memodelkan Tanda Secara Lokal
Sebelum menghubungkan SDK apa pun, modelkan tanda Anda sebagai Dart biasa agar bagian lain aplikasi tidak pernah menyentuh string mentah. Objek konfigurasi bertipe membuat nilai bawaan terlihat jelas dan membuat kode dapat diuji.
Ini adalah Dart murni dengan nilai bawaan yang masuk akal — tepat seperti yang Anda kirimkan jika jaringan tidak tersedia.
class AppConfig {
final bool newCheckoutEnabled;
final int maxUploadMb;
final String welcomeMessage;
const AppConfig({
this.newCheckoutEnabled = false,
this.maxUploadMb = 10,
this.welcomeMessage = 'Welcome!',
});
}
void main() {
const defaults = AppConfig();
print('checkout: ${defaults.newCheckoutEnabled}');
print('maxUploadMb: ${defaults.maxUploadMb}');
print('welcome: ${defaults.welcomeMessage}');
}Menyiapkan Firebase Remote Config
Setelah Firebase diinisialisasi, Anda mengambil singleton FirebaseRemoteConfig, menetapkan nilai bawaan dalam aplikasi, dan mengonfigurasi perilaku pengambilan melalui RemoteConfigSettings.
fetchTimeoutmembatasi berapa lama pengambilan dapat menunggu.minimumFetchIntervalmembatasi frekuensi pengambilan untuk mematuhi kuota. Gunakan nilai kecil dalam mode debug dan hitungan jam dalam produksi.
Nilai bawaan menjamin aplikasi berperilaku dengan baik sebelum pengambilan pertama berhasil.
import 'package:firebase_remote_config/firebase_remote_config.dart';
Future<FirebaseRemoteConfig> initRemoteConfig() async {
final rc = FirebaseRemoteConfig.instance;
await rc.setConfigSettings(RemoteConfigSettings(
fetchTimeout: const Duration(seconds: 10),
minimumFetchInterval: const Duration(hours: 6),
));
await rc.setDefaults(const {
'new_checkout_enabled': false,
'max_upload_mb': 10,
'welcome_message': 'Welcome!',
});
return rc;
}Mengambil dan Mengaktifkan
Remote Config memisahkan pengambilan (mengunduh nilai ke cache lokal) dari pengaktifan (menjadikan nilai yang diambil berlaku). Metode praktis fetchAndActivate() melakukan keduanya dan mengembalikan apakah ada nilai baru yang diaktifkan.
Selalu bungkus pemanggilan ini: kegagalan jaringan harus kembali ke nilai terakhir yang diaktifkan atau nilai bawaan dalam aplikasi — jangan pernah membuat jalur peluncuran berhenti.
Future<void> refreshConfig(FirebaseRemoteConfig rc) async {
try {
final updated = await rc.fetchAndActivate();
if (updated) {
// New values are now live; rebuild dependent UI.
print('Remote config activated with new values');
}
} catch (e) {
// Offline or quota hit: keep last-known-good values.
print('Remote config fetch failed, using cached/defaults: $e');
}
}Membaca Nilai Bertipe
Remote Config menyimpan semuanya sebagai string di balik layar, tetapi menyediakan pengambil bertipe: getBool, getInt, getDouble, getString. Petakan kembali nilai-nilai tersebut ke AppConfig agar bagian lain aplikasi tetap bertipe.
Jadikan pemetaan ini terpusat di satu tempat. Jika nama kunci berubah, Anda cukup memperbaikinya sekali.
import 'package:firebase_remote_config/firebase_remote_config.dart';
AppConfig readConfig(FirebaseRemoteConfig rc) {
return AppConfig(
newCheckoutEnabled: rc.getBool('new_checkout_enabled'),
maxUploadMb: rc.getInt('max_upload_mb'),
welcomeMessage: rc.getString('welcome_message'),
);
}Membatasi UI dengan Tanda
Tanda fitur seharusnya menjaga satu titik keputusan. Baca tanda tersebut sekali di dekat bagian atas hierarki widget (atau dari penyedia), lalu buat percabangan.
Jaga agar pembatas tetap dangkal: buat percabangan berdasarkan tanda, bukan jauh di dalam logika bisnis, sehingga penghapusan tanda nantinya dapat dilakukan dengan bersih.
Widget buildCheckout(BuildContext context, AppConfig config) {
if (config.newCheckoutEnabled) {
return const NewCheckoutScreen();
}
return const LegacyCheckoutScreen();
}Mengurai Konfigurasi Bernilai JSON
Untuk muatan yang lebih kaya, simpan string JSON dalam satu kunci lalu uraikan. Dengan begitu, satu tanda dapat memuat seluruh eksperimen terstruktur — tema, ambang batas, daftar berurutan — tanpa menambahkan puluhan kunci.
Di bawah ini adalah Dart mandiri yang menunjukkan pola penguraian-dan-pengembalian-nilai-bawaan yang akan Anda terapkan pada rc.getString('promo_banner').
import 'dart:convert';
class PromoBanner {
final String text;
final int priority;
PromoBanner(this.text, this.priority);
}
PromoBanner parsePromo(String raw) {
try {
final map = jsonDecode(raw) as Map<String, dynamic>;
return PromoBanner(
map['text'] as String? ?? '',
map['priority'] as int? ?? 0,
);
} catch (_) {
return PromoBanner('', 0); // malformed JSON -> safe default
}
}
void main() {
final ok = parsePromo('{"text":"Summer Sale","priority":5}');
print('${ok.text} (${ok.priority})');
final bad = parsePromo('not-json');
print('fallback text empty: ${bad.text.isEmpty}');
}Peluncuran Bertahap berdasarkan Persentase
Peluncuran bertahap mengekspos fitur kepada, misalnya, 1% pengguna, lalu 10%, 50%, dan akhirnya 100% — sambil mengamati dasbor kerusakan dan metrik pada setiap tahap. Firebase Remote Config melakukan ini di sisi server dengan kondisi persentase berdasarkan bucket pengguna yang stabil dan diacak.
Persyaratan utamanya: pembagian ke bucket harus stabil. Pengguna yang ditetapkan ke peluncuran harus tetap berada di dalamnya pada setiap sesi; jika tidak, UI akan berkedip dan metrik menjadi tidak bermakna.
Pembagian Bucket Stabil di Sisi Klien
Jika Anda menggunakan backend sendiri, bukan Firebase, Anda menerapkan pembagian bucket di klien. Hash ID pengguna yang stabil menjadi nilai dalam [0, 100), lalu bandingkan dengan ambang peluncuran. ID yang sama selalu masuk ke bucket yang sama.
Hash deterministik ini merupakan inti peluncuran bertahap dan pembagian A/B.
int bucketOf(String userId) {
// Simple stable hash -> 0..99
var hash = 0;
for (final code in userId.codeUnits) {
hash = (hash * 31 + code) & 0x7fffffff;
}
return hash % 100;
}
bool isInRollout(String userId, int percent) {
return bucketOf(userId) < percent;
}
void main() {
const id = 'user-42';
print('bucket: ${bucketOf(id)}');
print('in 10% rollout: ${isInRollout(id, 10)}');
print('stable on retry: ${bucketOf(id) == bucketOf(id)}');
}Sakelar Penonaktifan dan Nilai Bawaan yang Aman
Tanda yang paling berharga adalah sakelar penonaktifan: boolean jarak jauh yang dapat segera menonaktifkan fitur berisiko tanpa rilis. Dua aturan membuat sakelar penonaktifan dapat diandalkan:
- Keadaan aman harus menjadi nilai bawaan. Sakelar penonaktifan seharusnya bernilai bawaan
false(fitur nonaktif), sehingga pengambilan yang gagal tidak pernah secara tidak sengaja mengaktifkan jalur berisiko. - Baca tanda tersebut setiap kali di titik keputusan, bukan hanya sekali saat startup, agar perubahan sakelar berlaku pada penyegaran konfigurasi berikutnya.
Untuk Remote Config, jadwalkan penyegaran saat aplikasi kembali aktif agar sakelar penonaktifan diterapkan dalam satu siklus di latar depan.
// Default OFF => a fetch failure leaves the risky feature disabled.
bool experimentalSyncEnabled(AppConfig config) {
return config.newCheckoutEnabled; // example risky path
}
void onAppResumed(FirebaseRemoteConfig rc) {
// Re-fetch so a flipped kill switch reaches the user quickly.
refreshConfig(rc);
}Mendengarkan Pembaruan Waktu Nyata
Firebase Remote Config versi yang lebih baru mendukung pembaruan waktu nyata: aliran yang berjalan saat server menerbitkan nilai baru, sehingga Anda tidak perlu menunggu pengambilan terjadwal berikutnya. Anda tetap memanggil activate() agar nilai tersebut berlaku.
Gunakan ini untuk sakelar penonaktifan ketika hitungan menit sangat penting. Gabungkan pendengar dengan setState/pembatalan validasi penyedia untuk membangun ulang widget yang terdampak.
import 'package:firebase_remote_config/firebase_remote_config.dart';
void subscribeToUpdates(FirebaseRemoteConfig rc, void Function() onChanged) {
rc.onConfigUpdated.listen((event) async {
await rc.activate();
onChanged(); // e.g. trigger a UI rebuild
});
}Pemeriksaan Singkat
Uji pemahaman Anda tentang desain peluncuran yang aman.
Ringkasan
Anda telah mempelajari cara mengirimkan fitur dalam keadaan tersembunyi dan mengendalikannya dari jarak jauh:
- Modelkan tanda sebagai
AppConfigbertipe dengan nilai bawaan yang jelas. - Inisialisasi Remote Config dengan
setDefaultsdanRemoteConfigSettingsyang disesuaikan, lalu panggilfetchAndActivate()secara defensif. - Baca nilai bertipe dan batasi UI pada satu titik keputusan yang dangkal; bawa muatan yang kaya sebagai string JSON.
- Jalankan peluncuran bertahap dengan pembagian persentase yang stabil agar pengguna tetap secara konsisten berada di dalam atau di luar peluncuran.
- Jadikan keadaan aman sebagai nilai bawaan setiap sakelar penonaktifan, lalu gunakan pembaruan waktu nyata serta penyegaran saat aplikasi kembali aktif agar perubahan diterapkan dengan cepat.
Bersama-sama, semua ini memungkinkan Anda memisahkan penerapan dari rilis dan merespons insiden tanpa perlu menunggu proses toko aplikasi.
Belajar Dart dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap” gratis?
Ya — teks lengkap “Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Flutter Mobile Development, upgrade ke CoddyKit PRO. Kursus Flutter Mobile Development mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap”?
Aktifkan atau nonaktifkan fitur dari jarak jauh dan luncurkan perubahan secara bertahap tanpa mengirim ulang aplikasi. Kamu berlatih Flutter Mobile Development dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Flutter Mobile Development?
Tidak diperlukan pengalaman sebelumnya. Flutter Mobile Development di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Flutter Mobile Development ini?
Ya. Setiap pelajaran Flutter Mobile Development menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Varian Build dan Konfigurasi Environment
- Pipeline Otomatis dengan Fastlane dan GitHub Actions
- Pelaporan Crash dan Stack Trace dengan Simbol
- Konfigurasi Jarak Jauh, Flag Fitur, dan Peluncuran Bertahap