fetchDefaultFlags method
Fetches and merges feature flags from local defaults and Remote Config.
Local defaults from assets/feature_flags.json serve as the baseline.
If Remote Config is available and contains a key present in the defaults,
the remote value takes precedence. Any keys present only in Remote Config
are also included.
Implementation
Future<Map<String, FeatureFlagData>> fetchDefaultFlags() async {
final jsonString = await loadLocalJson();
final localDefaults = jsonDecode(jsonString) as Map<String, dynamic>;
final result = firebaseService.getRemoteConfigString('feature_flags');
final remoteString = result.value;
final isRemote = result.isRemote;
final finalFlags = <String, FeatureFlagData>{};
Map<String, dynamic> remoteJson = {};
if (remoteString.isNotEmpty) {
try {
remoteJson = jsonDecode(remoteString) as Map<String, dynamic>;
} catch (e) {
firebaseService.log('Failed to decode feature_flags remote config: $e');
}
}
for (final entry in localDefaults.entries) {
final key = entry.key;
final localValue = entry.value;
if (isRemote && remoteJson.containsKey(key)) {
finalFlags[key] = (value: remoteJson[key], isRemote: true);
} else {
finalFlags[key] = (value: localValue, isRemote: false);
}
}
// Add any keys that are ONLY in remote
if (isRemote) {
for (final entry in remoteJson.entries) {
if (!finalFlags.containsKey(entry.key)) {
finalFlags[entry.key] = (value: entry.value, isRemote: true);
}
}
}
return finalFlags;
}