Flutter远程配置管理插件remote_config_feature_manager的使用

发布于 1周前 作者 caililin 来自 Flutter

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.

Basic Usage

  • 创建功能代码生成
    • 自从版本 3.0.0,feature_manager 支持代码生成来简化功能的创建和管理。

Steps to Use Code Generation

  1. 添加注解到您的功能上
    • 创建一个 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;
      }
      
  2. 使用代码生成
    • 使用以下命令生成特征类:
      flutter packages pub run build_runner build
      
  3. 使用生成的功能
    • 导入生成的文件并在代码中使用功能:
      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

1 回复

更多关于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项目中,你可以按照以下步骤进行配置和使用:

  1. 初始化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));
}
  1. 在应用中使用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();
              }
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们:

  1. 初始化了Firebase和Remote Config。
  2. 设置了Remote Config的默认值。
  3. 配置了Remote Config的最小获取间隔时间。
  4. 尝试获取并激活最新的远程配置值。
  5. 创建了一个FeatureManager实例,并将其传递给应用的主组件。
  6. 在主组件中使用FutureBuilder来异步获取特征标志的状态,并根据状态显示不同的文本。

这个示例展示了如何使用remote_config_feature_manager插件来管理远程配置特征。根据你的实际需求,你可以进一步扩展这个示例,比如添加更多的远程配置值、处理错误情况、或者根据远程配置值动态调整UI等。

回到顶部