Flutter远程配置管理插件remote_config_feature_manager的使用
Flutter远程配置管理插件remote_config_feature_manager的使用
标题
Flutter远程配置管理插件remote_config_feature_manager的使用
内容
Feature Manager 允许您隐藏一些未完成/秘密的功能,这些功能可以从远程数据源或本地设置进行管理。
- 如果您只需要本地功能切换或偏好,请使用 Feature Manager。
Getting Started
- 安装
- 添加以下依赖项到您的
pubspec.yaml
文件中:dependencies: remote_config_feature_manager: ^latest_version dev_dependencies: build_runner: feature_manager_generator: ^latest_version
- 在项目根目录运行以下命令以获取依赖项:
flutter packages get
- 添加以下依赖项到您的
Setup Firebase Remote Config in your project.
- 要开始使用 Firebase Remote Config for Flutter,请参阅文档:Firebase Remote Config 文档 可用链接:https://firebase.flutter.dev
Basic Usage
- 创建功能代码生成
- 自从版本 3.0.0,
feature_manager
支持代码生成来简化功能的创建和管理。
- 自从版本 3.0.0,
Steps to Use Code Generation
- 添加注解到您的功能上
- 创建一个 Dart 文件(例如
app_features.dart
),并使用提供的注解定义您的功能:import 'package:feature_manager/annotations.dart'; import 'package:feature_manager/feature.dart'; import 'package:feature_manager/feature_manager.dart'; part 'features.g.dart'; @FeatureManagerInit() class AppFeatures { AppFeatures({ required this.textFeature, required this.booleanFeature, required this.doubleFeature, required this.integerFeature, required this.jsonFeature, }); factory AppFeatures.instance() => _$AppFeatures(); @FeatureOptions( key: 'dev-prefs-text-pref', remoteSourceKey: 'REMOTE-KEY-dev-prefs-text-pref', title: 'Text pref', description: 'This is text preference', defaultValue: '', valueType: FeatureValueType.text, ) final Feature textFeature; @FeatureOptions( key: 'dev-prefs-bool-pref', remoteSourceKey: 'remote_prefs_bool_pref', title: 'Toggle pref', description: 'This is toggle preference', defaultValue: false, valueType: FeatureValueType.toggle, ) final Feature booleanFeature; @FeatureOptions( key: 'dev-prefs-double-pref', title: 'Number double pref', description: 'This is number double preference', defaultValue: null, valueType: FeatureValueType.doubleNumber, ) final Feature doubleFeature; @FeatureOptions( key: 'dev-prefs-integer-pref', title: 'Number integer pref', description: 'This is number integer preference', defaultValue: null, valueType: FeatureValueType.integerNumber, ) final Feature integerFeature; @FeatureOptions( key: 'dev-prefs-json-pref', title: 'Json pref', description: 'This is json preference', defaultValue: "{value: 'Json default value'}", valueType: FeatureValueType.json, ) final Feature jsonFeature; }
- 创建一个 Dart 文件(例如
- 使用代码生成
- 使用以下命令生成特征类:
flutter packages pub run build_runner build
- 使用以下命令生成特征类:
- 使用生成的功能
- 导入生成的文件并在代码中使用功能:
import 'features.dart'; // 由于 'part' 指令,生成的部分文件会自动包含进来。 void main() { final appFeatures = AppFeatures.instance(); // 访问单个功能 final textValue = appFeatures.textFeature.value; final isEnabled = appFeatures.booleanFeature.isEnabled; // 使用扩展访问所有功能 for (final feature in appFeatures.values) { print('Feature key: ${feature.key}'); } }
- 导入生成的文件并在代码中使用功能:
Activate feature manager
- 要获取并激活功能值,请使用
activate
函数。您应该调用RemoteConfigFeatureManager.getInstance()
函数初始化RemoteConfigFeatureManager
实例及其依赖项。之后,您可以在整个应用程序中使用RemoteConfigFeatureManager.instance
。
...
final featureManager =
await RemoteConfigFeatureManager.getInstance();
await featureManager.activate(
Features.values,
minimumFetchInterval: const Duration(
minutes: 5,
),
);
...
- 如果您希望在其他地方初始化 FirebaseRemoteConfig,请只需使用
refresh
函数将远程值映射到您的功能。
...
featureManager.refresh(Features.values);
...
Using Features
- 要检查某个功能是否启用,请通过依赖注入(例如 Provider, GetIt)或直接创建实例:
import 'package:feature_manager/feature_manager.dart';
final featureManager = RemoteConfigFeatureManager.instance;
final appFeatures = AppFeatures.instance();
// 检查功能是否启用
final isEnabled = featureManager.isEnabled(appFeatures.booleanFeature);
- 或者,由于每个功能都提供了一个
isEnabled
属性,您可以直接访问它:
final isEnabled = featureManager.booleanFeature.isEnabled;
// 或
final isEnabled = appFeatures.booleanFeature.isEnabled;
Modify remote feature values in Firebase Console
- 修改 Firebase 控制台中的远程功能值:
Modify feature values in DEBUG mode
- 在调试模式下修改功能值:
- 打开开发人员首选项屏幕,传递您的功能列表作为参数。
- 注意:生产构建时应隐藏此按钮。
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) =>
DeveloperPreferencesScreen(Features.values),
),
);
Feature parameters
参数 | 默认值 | 描述 |
---|---|---|
key | String | 用于在本地存储中存储值的关键字。 |
type | FeatureType | 可以用来区分本地功能和 远程驱动的一些实验。 |
valueType | FeatureValueType | 功能值的类型。如果需要开关,请使用 FeatureValueType.toggle |
title | String | 开发者首选项屏幕中的标题。 |
remoteSourceKey | String | 远程源的关键字。 |
description | String | 开发者首选项屏幕中的描述。 |
value | Object? | 存储的功能值。将从本地存储中获取。 |
defaultValue | Object? | 功能的默认值。如果存储的值为 Null ,则由 FeatureManager 返回。 |
enum FeatureType { feature, experiment }
enum FeatureValueType { text, toggle, doubleNumber, integerNumber, json }
更多关于Flutter远程配置管理插件remote_config_feature_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter远程配置管理插件remote_config_feature_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter中的remote_config_feature_manager
插件的使用,这里提供一个示例代码来展示如何进行远程配置管理。请注意,这个示例假设你已经安装了remote_config_feature_manager
插件,并且已经在Firebase中设置了远程配置。
首先,确保在pubspec.yaml
文件中添加了依赖:
dependencies:
flutter:
sdk: flutter
remote_config_feature_manager: ^latest_version # 请替换为实际最新版本号
然后,在你的Flutter项目中,你可以按照以下步骤进行配置和使用:
- 初始化Firebase和Remote Config:
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_remote_config/firebase_remote_config.dart';
import 'package:remote_config_feature_manager/remote_config_feature_manager.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
// 初始化Remote Config
final RemoteConfig remoteConfig = await RemoteConfig.instance;
// 设置默认的远程配置值
await remoteConfig.setDefaults(<String, dynamic>{
'new_feature_enabled': false,
});
// 配置Remote Config的最小获取间隔时间(例如30分钟)
await remoteConfig.setConfigSettings(RemoteConfigSettings(
fetchTimeout: const Duration(seconds: 60),
minimumFetchInterval: const Duration(minutes: 30),
));
// 尝试获取最新的远程配置值
try {
await remoteConfig.fetch(cacheExpiration: const Duration(hours: 1));
await remoteConfig.activateFetched();
} catch (e) {
print('Failed to fetch remote config: $e');
}
// 创建FeatureManager实例
final featureManager = FeatureManager(remoteConfig: remoteConfig);
runApp(MyApp(featureManager: featureManager));
}
- 在应用中使用FeatureManager:
import 'package:flutter/material.dart';
import 'package:remote_config_feature_manager/remote_config_feature_manager.dart';
class MyApp extends StatelessWidget {
final FeatureManager featureManager;
MyApp({required this.featureManager});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Remote Config Example'),
),
body: Center(
child: FutureBuilder<bool>(
future: featureManager.isFeatureEnabled('new_feature_enabled'),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
bool isEnabled = snapshot.data ?? false;
return isEnabled
? Text('New Feature is ENABLED')
: Text('New Feature is DISABLED');
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
}
在这个示例中,我们:
- 初始化了Firebase和Remote Config。
- 设置了Remote Config的默认值。
- 配置了Remote Config的最小获取间隔时间。
- 尝试获取并激活最新的远程配置值。
- 创建了一个
FeatureManager
实例,并将其传递给应用的主组件。 - 在主组件中使用
FutureBuilder
来异步获取特征标志的状态,并根据状态显示不同的文本。
这个示例展示了如何使用remote_config_feature_manager
插件来管理远程配置特征。根据你的实际需求,你可以进一步扩展这个示例,比如添加更多的远程配置值、处理错误情况、或者根据远程配置值动态调整UI等。