Flutter配置注解插件json_config_annotation的使用

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

Flutter配置注解插件json_config_annotation的使用

Annotations for json_config_generator。此包在没有json_config_generator的情况下无法工作。

示例代码

import 'package:json_config_annotation/json_config_annotation.dart';
import 'dart:convert';
import 'package:flutter/services.dart';

// 此文件为生成的配置文件
part 'config.g.dart';

// 使用 [@Configuration](/user/Configuration) 注解来定义环境配置
[@Configuration](/user/Configuration)(
  // 定义环境枚举名称
  environmentEnumName: 'Env',
  // 定义环境列表
  environments: [
    // 开发环境配置
    Environment(name: 'dev', path: 'assets/config/dev.json'),
    // 生产环境配置
    Environment(name: 'prd', path: 'assets/config/prd.json'),
  ],
)
class $Config {}

步骤说明:

  1. 导入必要的库

    import 'package:json_config_annotation/json_config_annotation.dart';
    import 'dart:convert';
    import 'package:flutter/services.dart';
    
  2. 生成配置文件

    • 创建一个名为 config.g.dart 的文件,并在该文件中使用 [@Configuration](/user/Configuration) 注解来定义环境配置。
    • 配置环境枚举名称(如 Env)。
    • 指定不同的环境(如开发环境和生产环境),并提供每个环境的配置路径。
  3. 使用配置文件

    • 在你的项目中使用生成的配置文件来获取不同环境下的配置信息。
    • 可以通过读取 config.g.dart 文件中的配置信息来动态加载不同的配置文件。

完整示例代码

import 'package:json_config_annotation/json_config_annotation.dart';
import 'dart:convert';
import 'package:flutter/services.dart';

// 生成的配置文件
part 'config.g.dart';

// 定义配置类
[@Configuration](/user/Configuration)(
  // 环境枚举名称
  environmentEnumName: 'Env',
  // 环境列表
  environments: [
    // 开发环境配置
    Environment(name: 'dev', path: 'assets/config/dev.json'),
    // 生产环境配置
    Environment(name: 'prd', path: 'assets/config/prd.json'),
  ],
)
class $Config {}

void main() async {
  // 初始化配置
  await $Config.init();

  // 获取当前环境配置
  var config = $Config.of(Env.dev);

  // 输出配置信息
  print(jsonEncode(config));
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中配置和使用json_config_annotation插件的示例代码案例。json_config_annotation插件通常用于将JSON配置文件映射到Dart类,以便在Flutter应用中使用。为了简单起见,我们假设你已经在你的Flutter项目中添加了该插件的依赖。

1. 添加依赖

首先,确保在你的pubspec.yaml文件中添加了json_config_annotation及其运行时依赖json_annotation的依赖项:

dependencies:
  flutter:
    sdk: flutter
  json_config_annotation: ^x.y.z  # 请替换为最新版本号
  json_annotation: ^x.y.z  # 请替换为最新版本号,且需要与json_config_annotation兼容的版本

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号

2. 创建配置文件

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

{
  "apiUrl": "https://api.example.com",
  "timeout": 30
}

3. 创建数据模型

接下来,你需要创建一个Dart类来映射这个JSON配置文件。使用json_config_annotation提供的注解来标记这个类。

创建一个名为config_model.dart的文件,并添加以下内容:

import 'package:json_annotation/json_annotation.dart';
import 'package:json_config_annotation/json_config_annotation.dart';

part 'config_model.g.dart';

@JsonSerializable()
@JsonConfig(filePath: 'assets/config.json')  // 假设你的config.json文件放在assets目录下
class ConfigModel {
  final String apiUrl;
  final int timeout;

  ConfigModel({required this.apiUrl, required this.timeout});

  // 生成的fromJson方法
  factory ConfigModel.fromJson(Map<String, dynamic> json) => _$ConfigModelFromJson(json);

  // 生成的toJson方法(虽然在这个场景下可能不需要,但通常是个好习惯)
  Map<String, dynamic> toJson() => _$ConfigModelToJson(this);
}

4. 生成代码

现在你需要运行flutter pub run build_runner build命令来生成config_model.g.dart文件,这个文件将包含fromJsontoJson方法的实现。

flutter pub run build_runner build

5. 加载配置

最后,在你的Flutter应用中加载并使用这个配置。例如,在main.dart文件中:

import 'package:flutter/material.dart';
import 'package:your_app_name/config_model.dart';
import 'dart:async';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  late Future<ConfigModel> _futureConfig;

  MyApp() {
    _futureConfig = _loadConfig();
  }

  Future<ConfigModel> _loadConfig() async {
    // 确保在Flutter中正确加载assets文件
    final rootBundle = await rootBundle;
    final String jsonString = await rootBundle.loadString('assets/config.json');
    
    // 手动解析JSON(由于我们使用了注解,通常不需要这一步,但为了展示如何从字符串加载JSON)
    final Map<String, dynamic> jsonMap = jsonDecode(jsonString);
    
    // 正常情况下,你应该直接使用ConfigModel.fromJson(jsonMap),但由于json_config_annotation
    // 插件的@JsonConfig注解目前并不直接支持从字符串加载(通常是从文件路径加载),
    // 这里我们手动演示解析过程。如果你需要直接从文件路径加载到对象,
    // 可能需要查看插件的更新文档或使用其他方式实现(例如,先加载到字符串,再解析)。
    
    // 假设我们已经有了fromJson方法,直接调用它(实际上这一步在真实使用中由生成的代码处理)
    return ConfigModel.fromJson(jsonMap);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Config Example'),
        ),
        body: FutureBuilder<ConfigModel>(
          future: _futureConfig,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              if (snapshot.hasError) {
                return Text('Error loading config: ${snapshot.error}');
              }
              final config = snapshot.data!;
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('API URL: ${config.apiUrl}'),
                    Text('Timeout: ${config.timeout}s'),
                  ],
                ),
              );
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

注意json_config_annotation插件的@JsonConfig注解通常用于直接从文件路径加载配置到对象,但具体实现可能依赖于插件的最新版本和API。上面的代码示例展示了如何从字符串加载JSON并手动解析,但在实际使用中,你可能需要查看插件的文档来确认如何从文件路径直接加载配置。如果插件支持直接从文件路径加载,你可能不需要rootBundle.loadStringjsonDecode部分,而是直接使用插件提供的方法。

回到顶部