Flutter功能管理插件feature_manager的使用

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

Flutter功能管理插件feature_manager的使用

Feature Manager for Flutter

Feature Manager 允许您隐藏未完成或秘密的功能,或者从远程数据源或本地设置管理实验。

如果您想使用 Firebase Remote Config 进行 A/B 测试或功能切换,请使用 Remote Config Feature Manager

示例代码

import 'package:flutter/material.dart';
import 'package:feature_manager/feature_manager.dart';

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}');
  }
}

安装

在您的 pubspec.yaml 文件中添加以下内容:

dependencies:
  feature_manager: ^latest_version
  # Other dependencies

dev_dependencies:
  build_runner:
  feature_manager_generator: ^latest_version

然后运行:

flutter packages get

基本使用

创建功能并使用代码生成

从版本 3.0.0 开始,feature_manager 支持代码生成以简化功能创建和管理。

  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.fm.g.dart';
    
    [@FeatureManagerInit](/user/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',
        title: 'Text pref',
        description: 'This is text preference',
        defaultValue: '',
        valueType: FeatureValueType.text,
      )
      final Feature textFeature;
    
      @FeatureOptions(
        key: 'dev-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. 使用代码生成

    app_features.dart 文件中添加上述代码,并运行以下命令来生成功能类:

    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}');
      }
    }
    

使用功能

要通过 FeatureManager 检查某个功能是否启用,请通过依赖注入(例如 Provider, GetIt) 或直接创建实例:

import 'package:feature_manager/feature_manager.dart';

final featureManager = FeatureManager();

final appFeatures = AppFeatures.instance();

// 检查功能是否启用
final isEnabled = featureManager.isEnabled(appFeatures.booleanFeature);

或者,因为每个功能都提供了一个 isEnabled 属性,可以直接访问它:

final isEnabled = appFeatures.booleanFeature.isEnabled;

在调试模式中修改功能值

要在调试模式中修改功能值,只需打开应用程序中的开发者偏好屏幕。应将您的功能列表作为参数传递给此屏幕。

注意:在生产构建中隐藏此屏幕或导航选项以防止用户访问开发功能。

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (BuildContext context) =>
      DeveloperPreferencesScreen(Features.values),
    ),
);

功能参数

参数 默认值 描述
key String 将用于存储值的键。
type FeatureType 可以用来区分本地功能和由某些远程提供程序驱动的实验。
valueType FeatureValueType 功能值的类型。如果需要切换,请使用 FeatureValueType.toggle
title String 内部开发者偏好屏幕使用的标题。
remoteSourceKey String 远程源的键。
description String 内部开发者偏好屏幕使用的描述。
value Object? 存储的特征值。将从本地存储获取。
defaultValue Object? 特征的默认值。如果存储的值为 Null,则由 FeatureManager 返回。

贡献

请随时联系我 (a.e.getman@gmail.com) 或为此仓库创建 Pull Requests :)

enum FeatureType { feature, experiment }
enum FeatureValueType { text, toggle, doubleNumber, integerNumber, json }

更多关于Flutter功能管理插件feature_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能管理插件feature_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,feature_manager 插件可以用于管理和控制应用中的功能开关(Feature Flags)。这对于在不同环境下启用或禁用特定功能非常有用,比如在开发、测试和生产环境中。以下是一个如何使用 feature_manager 插件的示例代码。

首先,确保你的 pubspec.yaml 文件中包含了 feature_manager 依赖:

dependencies:
  flutter:
    sdk: flutter
  feature_manager: ^最新版本号  # 替换为实际最新版本号

然后,运行 flutter pub get 来获取依赖。

配置 Feature Manager

  1. 创建配置文件

    创建一个 JSON 文件(例如 feature_flags.json),用于定义你的功能开关。

    {
      "enable_new_ui": true,
      "enable_analytics": false
    }
    
  2. 加载配置文件

    在你的 Flutter 应用中,初始化并加载这个配置文件。

    import 'package:flutter/material.dart';
    import 'package:feature_manager/feature_manager.dart';
    import 'dart:convert';
    import 'package:flutter/services.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      // 从 assets 加载 feature_flags.json
      final String jsonData = await rootBundle.loadString('assets/feature_flags.json');
      final Map<String, dynamic> featureFlags = jsonDecode(jsonData);
    
      // 初始化 FeatureManager
      FeatureManager.instance.init(featureFlags);
    
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Feature Manager Demo',
          home: FeatureFlagDemo(),
        );
      }
    }
    
    class FeatureFlagDemo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Feature Manager Demo'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'New UI Enabled: ${FeatureManager.instance.isFeatureEnabled('enable_new_ui')}',
                  style: TextStyle(fontSize: 20),
                ),
                SizedBox(height: 20),
                Text(
                  'Analytics Enabled: ${FeatureManager.instance.isFeatureEnabled('enable_analytics')}',
                  style: TextStyle(fontSize: 20),
                ),
              ],
            ),
          ),
        );
      }
    }
    
  3. 确保 JSON 文件在 assets 中

    pubspec.yaml 中添加你的 JSON 文件到 assets:

    flutter:
      assets:
        - assets/feature_flags.json
    

使用功能开关

在上面的示例中,FeatureFlagDemo 组件使用 FeatureManager.instance.isFeatureEnabled 方法来检查特定的功能开关是否启用,并根据这些开关的值显示不同的文本。

小结

这个示例展示了如何在 Flutter 应用中使用 feature_manager 插件来管理和控制功能开关。你可以根据需要扩展这个示例,比如根据用户角色、应用版本或其他条件动态地更改功能开关的状态。

回到顶部