Remote Config, ominaisuusliput ja vaiheistetut julkaisut
Ota ominaisuuksia käyttöön etänä ja julkaise muutokset asteittain lähettämättä sovellusta uudelleen tarkistettavaksi.
Remote Config, ominaisuusliput ja vaiheistetut julkaisut on ilmainen Mobiilikehitys Flutterilla-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Mobiilikehitys Flutterilla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Mobiilikehitys Flutterilla-kurssilla on yhteensä 4 oppituntia.
Miksi etäkonfiguraatio
Sovelluskauppojen tarkistuskierrokset ovat hitaita. Jos ominaisuus julkaistaan rikkinäisenä, saatat joutua odottamaan päiviä, ennen kuin pikakorjaus saavuttaa käyttäjät. Etäkonfiguraatio erottaa koodin julkaisemisen sen käyttöönotosta.
- Ominaisuusliput rajaavat koodipolkuja boolean-arvolla, jota hallitset palvelimelta.
- Etäkonfiguraatio toimittaa säädettäviä arvoja (merkkijonoja, lukuja ja JSON-dataa) ilman uutta koontiversiota.
- Vaiheistetut käyttöönotot altistavat kasvavan prosenttiosuuden käyttäjistä muutokselle.
Flutterissa yleinen työkalu on firebase_remote_config, mutta samat mallit pätevät myös LaunchDarklyyn, ConfigCatiin tai omaan taustajärjestelmääsi.
Lipin mallintaminen paikallisesti
Ennen minkään SDK:n kytkemistä mallinna lippusi tavallisena Dart-koodina, jotta muu sovellus ei koskaan käsittele raakoja merkkijonoja. Tyypitetty konfiguraatio-olio tekee oletusarvoista yksiselitteisiä ja helpottaa koodin testaamista.
Tämä on puhdasta Dartia järkevine oletusarvoineen — juuri se, mitä julkaiset, jos verkko ei ole käytettävissä.
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}');
}Firebase Remote Configin määritys
Kun Firebase on alustettu, haet FirebaseRemoteConfig-singletonin, asetat sovelluksen sisäiset oletusarvot ja määrität noutamisen toiminnan RemoteConfigSettings-asetuksilla.
fetchTimeoutrajoittaa noutamisen odotusaikaa.minimumFetchIntervalrajoittaa noutotiheyttä kiintiöiden noudattamiseksi. Käytä debug-tilassa pientä arvoa ja tuotannossa tuntien mittaista väliä.
Oletusarvot varmistavat, että sovellus toimii järkevästi ennen ensimmäistä onnistunutta noutoa.
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;
}Nouda ja aktivoi
Remote Config erottaa toisistaan noutamisen (arvojen lataamisen paikalliseen välimuistiin) ja aktivoinnin (noudettujen arvojen ottamisen käyttöön). Kätevä metodi fetchAndActivate() tekee molemmat ja palauttaa tiedon siitä, aktivoitiinko uusia arvoja.
Ympäröi kutsu aina virheenkäsittelyllä: verkkovirheen tulee palauttaa käyttöön viimeksi aktivoidut arvot tai sovelluksen sisäiset oletusarvot — käynnistyspolku ei saa koskaan kaatua.
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');
}
}Tyypitettyjen arvojen lukeminen
Remote Config tallentaa kaiken sisäisesti merkkijonoina, mutta tarjoaa tyypitetyt hakumetodit: getBool, getInt, getDouble ja getString. Muunna ne takaisin AppConfig-olioksi, jotta muu sovellus säilyy tyypitettynä.
Keskitytä tämä muunnos yhteen paikkaan. Jos avaimen nimi muuttuu, korjaat sen vain kerran.
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'),
);
}Käyttöliittymän rajaaminen lipulla
Ominaisuuslipun pitäisi suojata yhtä päätöspistettä. Lue se kerran widget-puun yläosassa (tai providerista) ja tee haarautuminen.
Pidä rajaaminen pinnallisena: haarauta lipun perusteella, älä syvällä liiketoimintalogiikan sisällä, jotta lipun myöhempi poistaminen on siisti poistotoimenpide.
Widget buildCheckout(BuildContext context, AppConfig config) {
if (config.newCheckoutEnabled) {
return const NewCheckoutScreen();
}
return const LegacyCheckoutScreen();
}JSON-muotoisen konfiguraation jäsentäminen
Monipuolisempia tietosisältöjä varten tallenna JSON-merkkijono yhteen avaimeen ja pura se. Näin yksi lippu voi sisältää kokonaisen rakenteisen kokeilun — teemat, kynnysarvot ja järjestetyt luettelot — ilman kymmenten avainten lisäämistä.
Alla oleva itsenäinen Dart-esimerkki näyttää purku- ja varamallin, jota käyttäisit kutsulle 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}');
}Vaiheistettu käyttöönotto prosenttiosuuden perusteella
Vaiheistetussa käyttöönotossa ominaisuus otetaan käyttöön esimerkiksi yhdelle prosentille käyttäjistä, sitten kymmenelle, 50:lle ja lopulta kaikille — samalla seuraten kaatumis- ja mittarikoontinäyttöjä jokaisessa vaiheessa. Firebase Remote Config tekee tämän palvelinpuolella käyttämällä prosenttiehtoja, jotka perustuvat vakaaseen ja satunnaistettuun käyttäjäryhmään.
Keskeinen vaatimus on, että ryhmittelyn on oltava vakaa. Käyttöönottoon määrätyn käyttäjän on pysyttävä siinä istuntojen välillä, muuten käyttöliittymä välkkyy ja mittarit ovat merkityksettömiä.
Vakaa ryhmittely asiakaspuolella
Jos käytät Firebasen sijaan omaa taustajärjestelmääsi, toteutat ryhmittelyn asiakaspuolella. Hajauta vakaa käyttäjätunnus arvoksi välillä [0, 100) ja vertaa sitä käyttöönoton kynnysarvoon. Sama tunnus päätyy aina samaan ryhmään.
Tämä deterministinen hajautus on vaiheistettujen käyttöönottojen ja A/B-jakojen ydin.
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)}');
}Poiskytkentäkytkimet ja turvalliset oletusarvot
Arvokkain lippu on poiskytkentäkytkin: etäpalvelussa hallittava boolean-arvo, joka poistaa riskialttiin ominaisuuden välittömästi käytöstä ilman uutta julkaisua. Kaksi sääntöä tekee poiskytkentäkytkimistä luotettavia:
- Turvallisen tilan on oltava oletus. Poiskytkentäkytkimen oletusarvon tulee olla
false(ominaisuus pois käytöstä), jotta epäonnistunut nouto ei vahingossa ota riskialtista polkua käyttöön. - Lue lippu päätöspisteessä joka kerta, älä vain käynnistyksen yhteydessä, jotta muutos tulee voimaan seuraavan konfiguraation päivityksen yhteydessä.
Remote Configia käytettäessä ajoita päivitys sovelluksen palautuessa aktiiviseksi, jotta poiskytkentäkytkin välittyy yhden etualajakson aikana.
// 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);
}Reaaliaikaisten päivitysten kuunteleminen
Uudemmat Firebase Remote Config -versiot tukevat reaaliaikaisia päivityksiä: virtaa, joka laukeaa palvelimen julkaistessa uusia arvoja, joten seuraavaa ajoitettua noutoa ei tarvitse odottaa. Sinun on silti kutsuttava activate() niiden ottamiseksi käyttöön.
Käytä tätä poiskytkentäkytkimiin, joissa minuutit ovat tärkeitä. Yhdistä kuuntelija kutsuun setState/providerin invalidointiin, jotta vaikutuksen alaiset widgetit rakennetaan uudelleen.
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
});
}Pikatarkistus
Testaa, miten hyvin ymmärrät turvallisen käyttöönoton suunnittelun.
Kertaus
Opit julkaisemaan ominaisuudet oletuksena pois käytöstä ja hallitsemaan niitä etänä:
- Mallinna liput tyypitettynä
AppConfig-oliona, jolla on yksiselitteiset oletusarvot. - Alusta Remote Config
setDefaults-metodilla ja säädetyilläRemoteConfigSettings-asetuksilla ja kutsu sen jälkeenfetchAndActivate()-metodia virheet kestävästi. - Lue tyypitetyt arvot ja rajaa käyttöliittymä yhteen pinnalliseen päätöspisteeseen; välitä monipuoliset tietosisällöt JSON-merkkijonoina.
- Toteuta vaiheistetut käyttöönotot vakaalla prosenttipohjaisella ryhmittelyllä, jotta käyttäjät pysyvät johdonmukaisesti joko mukana tai ulkopuolella.
- Aseta jokaisen poiskytkentäkytkimen oletukseksi sen turvallinen tila ja käytä reaaliaikaisia päivityksiä sekä sovelluksen aktivoituessa tehtävää päivitystä, jotta muutokset välittyvät nopeasti.
Näin voit erottaa käyttöönoton julkaisusta ja reagoida häiriöihin ilman sovelluskaupan kautta tehtävää uutta julkaisukierrosta.
Opi Dart tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 22
- Oppitunnit
- 88
Usein kysytyt kysymykset
Onko oppitunti ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Mobiilikehitys Flutterilla-oppimispolun 3 oppituntia, myös oppitunnin “Remote Config, ominaisuusliput ja vaiheistetut julkaisut”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Mobiilikehitys Flutterilla-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut”?
Ota ominaisuuksia käyttöön etänä ja julkaise muutokset asteittain lähettämättä sovellusta uudelleen tarkistettavaksi. Harjoittelet Mobiilikehitys Flutterilla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Mobiilikehitys Flutterilla-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Mobiilikehitys Flutterilla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Remote Config, ominaisuusliput ja vaiheistetut julkaisut”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Mobiilikehitys Flutterilla-oppitunnilla?
Kyllä. Jokainen Mobiilikehitys Flutterilla-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Build-variantit ja ympäristöasetukset
- Automaattiset putket Fastlanella ja GitHub Actionsilla
- Kaatumisraportointi ja symboloidut pinojäljet
- Remote Config, ominaisuusliput ja vaiheistetut julkaisut