Flutter配置管理插件configuration_service的使用

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

Flutter配置管理插件configuration_service的使用

此插件使应用程序能够有效地利用JSON配置文件。特别适用于后端服务或用Dart编写的CLI工具,但也可以与Flutter一起使用。

特性

  • 类型安全处理JSON配置文件
  • 不需要代码生成
  • 处理可选值和必需值
  • 如果值缺失可以使用默认值
  • 支持环境变量(方便注入密钥)

开始使用

假设有一个名为config.json的配置文件,其内容如下:

{
    "enable_graphql_playground": true,
    "enable_introspection": true,
    "enable_schema_download": true
}

为了在应用中加载这样的配置文件,创建一个继承自ConfigurationService的类MyConfigurationService,并定义每个配置值的类型属性:

class MyConfigurationService extends ConfigurationService {
  // ConfigurationValue<bool> 定义一个布尔值。你可以使用bool, int, String, List<> 以及你自己的复杂类型(详见下方)。
  final enableGraphQLPlayground = ConfigurationValue<bool>(
    // 配置文件中值的名称
    name: "enable_graphql_playground",
    // 可选参数,如果配置文件中不存在该值,则使用默认值
    defaultValue: const Optional(false),
  );

  final enableIntrospection = ConfigurationValue<bool>(
    name: "enable_introspection",
    // 值可以被标记为必需。如果配置文件中缺少该值,将抛出异常。
    isRequired: true,
  );

  final enableSchemaDownload = ConfigurationValue<bool>(
    name: "enable_schema_download",
    defaultValue: const Optional(false),
  );

  final authVerifyToken = ConfigurationValue<bool>(
    name: "auth.verify_token",
    defaultValue: const Optional(true),
  );

  MyConfigurationService() {
    // 注册所有配置值,以便加载器可以识别它们
    register(enableGraphQLPlayground);
    register(enableIntrospection);
    register(enableSchemaDownload);
    register(authVerifyToken);
  }
}

加载配置文件使用loadFromJson()方法:

void main() async {
  final configurationService = MyConfigurationService();
  await configurationService.loadFromJson(
    filePath: 'config.json',
    allowEnvironmentOverrides: true,
    configurationEnvironmentVariable: 'SAMPLE_CONFIGURATION',
  );

  print(
      'auth.verify_token was present in the configuration file: ${configurationService.authVerifyToken.hasValue(ignoreDefault: true)}');
  print(
      'auth.verify_token has a value (default or explicit): ${configurationService.authVerifyToken.hasValue()}');
  print(
      'auth.verify_token is set to: ${configurationService.authVerifyToken.value}');
}

使用说明

访问配置文件中的值

假设存在以下配置文件:

{ "test": true }

以下代码会读取它:

final configurationValue = ConfigurationValue<bool>(name: 'test');

final configurationService = ConfigurationService();
configurationService.register(configurationValue);
await configurationService.loadFromJson(filePath: 'config.json');

print(configurationValue.value); // 输出 "true"

检查值是否存在

final configurationValue = ConfigurationValue<bool>(name: 'test');

final configurationService = ConfigurationService();
configurationService.register(configurationValue);
await configurationService.loadFromJson(filePath: 'config.json');

print(configurationValue.hasValue()); // 如果值存在于config.json中,则输出 "true"

使用默认值

final configurationValue = ConfigurationValue<bool>(name: 'test', defaultValue: Optional(true));

final configurationService = ConfigurationService();
configurationService.register(configurationValue);
await configurationService.loadFromJson(filePath: 'config.json');

print(configurationValue.hasValue()); // 即使在config.json中不存在,也会输出 "true"
print(configurationValue.hasValue(ignoreDefaults: true)); // 只有当值存在于config.json中时才输出 "true"

标记值为必需

final configurationValue = ConfigurationValue<bool>(name: 'test', isRequired: true);

final configurationService = ConfigurationService();
configurationService.register(configurationValue);

// 如果找不到 "test" 将抛出异常
await configurationService.loadFromJson(filePath: 'config.json');

print(configurationValue.value);

允许环境变量覆盖

使用allowEnvironmentOverrides优先考虑环境变量中的值。环境变量名通过将配置值的名称转换为CONSTANT_CASE来确定。

例如:

  • verify_token 变为 VERIFY_TOKEN
  • auth.verify_token 变为 AUTH_VERIFY_TOKEN
final configurationValue = ConfigurationValue<bool>(name: 'test', isRequired: true);

final configurationService = ConfigurationService();
configurationService.register(configurationValue);

await configurationService.loadFromJson(
  filePath: 'config.json',
  allowEnvironmentOverrides: true,
);

print(configurationValue.value); // 输出从环境变量TEST中找到的值,否则输出配置文件中的值

使用配置文件的部分

通常,分区配置文件以提高可维护性是有益的。可以通过使用点表示法指定配置值的层次结构。

假设以下配置文件:

{
  "auth": {
    "verify_token": true
  }
}

可以通过指定auth.verify_token作为其名称来访问该值。

使用复杂类型

configuration_service 原生支持 int, Stringbool 以及相应的 List 类型。要加载自定义复杂类型,注册类型时指定反序列化方法:

configurationService.register(authEntityIdFallback, deserializers: {
      EntityIdFallbackConfig: EntityIdFallbackConfig.fromJson,
    });

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用configuration_service插件来进行配置管理的示例代码。假设你已经安装了configuration_service插件,可以通过以下步骤进行配置管理。

1. 添加依赖

首先,确保在你的pubspec.yaml文件中添加configuration_service的依赖:

dependencies:
  flutter:
    sdk: flutter
  configuration_service: ^最新版本号  # 请替换为最新版本号

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

2. 初始化ConfigurationService

在你的Flutter应用的入口文件(通常是main.dart)中初始化ConfigurationService

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

void main() {
  // 初始化配置服务
  ConfigurationService.init(
    jsonFilePath: 'path/to/your/config.json', // 配置文件路径
    defaultValues: {
      'apiUrl': 'https://api.example.com',
      'themeMode': 'dark',
      // 其他默认配置
    },
    onChange: (key, value) {
      // 当配置发生变化时的回调
      print('Configuration changed: $key -> $value');
    },
  );

  runApp(MyApp());
}

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String apiUrl = '';
  String themeMode = '';

  @override
  void initState() {
    super.initState();

    // 获取配置值
    apiUrl = ConfigurationService.getString('apiUrl') ?? '';
    themeMode = ConfigurationService.getString('themeMode') ?? 'light';

    // 监听配置变化
    ConfigurationService.addListener(() {
      setState(() {
        apiUrl = ConfigurationService.getString('apiUrl') ?? '';
        themeMode = ConfigurationService.getString('themeMode') ?? 'light';
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Configuration Management'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('API URL: $apiUrl'),
            Text('Theme Mode: $themeMode'),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 示例:修改配置
          ConfigurationService.setString('themeMode', themeMode == 'light' ? 'dark' : 'light');
        },
        tooltip: 'Toggle Theme',
        child: Icon(Icons.toggle_on),
      ),
    );
  }
}

3. 创建配置文件

在你的项目根目录或assets目录下创建一个名为config.json的文件,内容如下:

{
  "apiUrl": "https://api.example.com/v2",
  "themeMode": "dark"
}

别忘了在pubspec.yaml中声明该配置文件为资产文件:

flutter:
  assets:
    - assets/config.json  # 根据你的实际路径调整

4. 运行应用

现在你可以运行你的Flutter应用,应用将会读取config.json中的配置,并可以在运行时动态修改配置值。

这个示例展示了如何使用configuration_service插件来管理应用的配置,包括读取配置文件、监听配置变化以及动态修改配置值。如果你有更多的需求,可以参考configuration_service的官方文档以获取更多功能和高级用法。

回到顶部