Flutter通用配置管理插件common_configs的使用

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

Flutter通用配置管理插件common_configs的使用

一个简单的包,可以在你的应用中作为全局配置使用,或者在你的包之间共享配置。

特性

  • 在整个应用中使用全局配置。
  • 在包之间共享配置。
  • 从任何地方访问配置。
  • 使用 Config.fromMapMap 加载配置。

开始使用

将此包添加为依赖项:

dart pub add common_configs

并在文件中导入它:

import 'package:common_configs/common_configs.dart';

使用方法

以下是一个简短的示例。

首先,可以使用任何标识符来表示你的配置类型。在这个例子中,我使用了一个枚举 ConfigType

enum ConfigType {
  devel,
  staging,
  prod,
}

接下来,我们将使用一个预定义的 MapConfig,它使用 Map<String, dynamic> 作为配置,并带有一个标识符。

Config createDevelConfig() => MapConfig(ConfigType.devel, { 'hello': 'world' });

要创建自己的配置,可以从 Config 类继承开始。

要使用此配置,可以使用 [Config.put] 方法设置它。

Config.put(create: createDevelConfig);

默认情况下,配置存储在名称为 default 的配置中。

如果要使用其他名称,则可以在获取或设置配置时使用 name 参数。

Config.put(create: createDevelConfig, name: 'app.config');

额外信息

你可以编写自己的代码从源(如 json 或 .env 文件)获取配置详细信息。

对于更长的例子,可以查看 /example 文件夹。

完整示例代码

// ignore_for_file: unused_local_variable

import 'package:common_configs/common_configs.dart';

/// 创建你自己的配置,通过扩展 [Config]。
class Awesome extends Config {
  Awesome(this.id);
  @override
  final AwesomeType id;
}

/// 可选地使用一个枚举作为标识符以区分不同的 [Config]。
enum AwesomeType {
  good,
  better,
  best,
}

Awesome createGoodConfig() => Awesome(AwesomeType.good);
Awesome createBetterConfig() => Awesome(AwesomeType.better);
Awesome createBestConfig() => Awesome(AwesomeType.best);

class AwesomeMapConfig extends MapConfig<AwesomeType> {
  AwesomeMapConfig(super.id, super.data);
}

AwesomeMapConfig createMapConfig() => AwesomeMapConfig(
      AwesomeType.better,
      {'Hello': 'World'},
    );

void main() {
  print('== `default` config ==');

  /// 设置你的配置使用 [Config.put]。
  ///
  /// 示例用例:不同的入口点可以使用不同的配置。
  Config.put(create: createGoodConfig);

  /// 使用 [isA] 方法,你可以检查当前配置。
  print('is good: ${Config.isA(AwesomeType.good)}');
  print('is better: ${Config.isA(AwesomeType.better)}');
  print('is best: ${Config.isA(AwesomeType.best)}');

  /// 你也可以使用不同的名称来获取或存储配置。
  const someOtherScopeName = 'awesome.map';

  print('== `$someOtherScopeName` config ==');

  Config.put(create: createMapConfig, name: someOtherScopeName);

  print('is good: ${Config.isA(AwesomeType.good, someOtherScopeName)}');
  print('is better: ${Config.isA(AwesomeType.better, someOtherScopeName)}');
  print('is best: ${Config.isA(AwesomeType.best, someOtherScopeName)}');

  /// 如果你想通过名称更方便地管理配置,可以尝试使用 [Config.by]。
  final useItLikeConfig = Config.by(someOtherScopeName);

  useItLikeConfig.get();
  useItLikeConfig.set(createMapConfig);
  useItLikeConfig.setIfAbsent(createMapConfig);
  useItLikeConfig.isA(AwesomeType.best);
  useItLikeConfig.setImmediately(createMapConfig());

  /// 你可以选择性地为其提供类型。
  Config.by<AwesomeType, AwesomeMapConfig>(someOtherScopeName);
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用common_configs插件的一个示例。请注意,由于common_configs并非一个广泛认知的标准Flutter插件(可能是自定义或特定团队的插件),我将提供一个假设性的实现示例,展示如何管理通用配置。如果你使用的是特定团队的common_configs插件,请参考该插件的官方文档进行调整。

假设我们有一个名为common_configs的插件,它允许我们存储和检索应用配置。以下是如何在Flutter项目中设置和使用这个插件的示例代码。

1. 添加依赖

首先,确保在pubspec.yaml文件中添加了common_configs依赖(假设它存在于pub.dev上,或者你可能需要从本地路径或Git仓库添加它)。

dependencies:
  flutter:
    sdk: flutter
  common_configs: ^x.y.z  # 替换为实际版本号

然后运行flutter pub get来安装依赖。

2. 初始化配置

假设common_configs提供了一个全局的Configs类来管理配置,我们可以像这样初始化它:

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

void main() {
  // 初始化配置,可以从本地文件、网络或硬编码数据加载
  Configs.init(configData: {
    'apiUrl': 'https://api.example.com',
    'themeMode': 'light',
    'featureFlagA': true,
  });

  runApp(MyApp());
}

3. 使用配置

在你的应用中,你可以通过Configs类访问这些配置。例如,在一个无状态小部件中:

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

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    String apiUrl = Configs.get('apiUrl') ?? 'https://default-api.example.com';
    String themeMode = Configs.get('themeMode') ?? 'light';
    bool featureFlagA = Configs.getBool('featureFlagA') ?? false;

    return Scaffold(
      appBar: AppBar(
        title: Text('Home Screen'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('API URL: $apiUrl'),
            Text('Theme Mode: $themeMode'),
            if (featureFlagA)
              Text('Feature Flag A is enabled'),
            else
              Text('Feature Flag A is disabled'),
          ],
        ),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomeScreen(),
    );
  }
}

4. 动态更新配置(假设支持)

如果common_configs支持动态更新配置,你可以提供一个方法来更新配置并通知监听器:

void updateConfig(String key, dynamic value) {
  Configs.set(key, value);
  // 假设有一个通知监听器的方法
  Configs.notifyListeners();
}

然后,在需要的地方调用updateConfig方法:

FloatingActionButton(
  onPressed: () {
    updateConfig('themeMode', 'dark');
    // 可能需要重建UI或触发状态更新
    // 例如使用Provider、Bloc等状态管理库
  },
  tooltip: 'Update Theme',
  child: Icon(Icons.brightness_4),
)

注意

  • 上述代码是基于假设的common_configs插件的功能和API。实际使用时,请参考该插件的官方文档。
  • 如果common_configs不支持某些功能(如动态更新),你可能需要寻找替代方案或自己实现这些功能。
  • 考虑使用Flutter的状态管理库(如Provider、Riverpod、Bloc等)来更好地管理应用状态和配置。
回到顶部