Flutter Swagger代码生成插件swagger_dart_code_generator_solve_generic的使用

Flutter Swagger代码生成插件swagger_dart_code_generator_solve_generic的使用

Swagger dart code generator

📣 从Swagger/OpenAPI模式构建dart类型 #

pub package build Discord codecov Discord

SwaggerDartCodeGenerator是一个代码生成器,它查找*.swagger文件并基于模式生成.swagger.dart文件。代码生成基于Chopper和JsonAnnotation模型,并可以根据您的需求进行配置。


概述 #

通常情况下,每个.swagger文件将生成三种输出。
.dartSwagger dart code generator生成,包含所有模型、请求、转换器等。
自v1.2.0起,.enums.dartSwagger dart code generator生成,包含所有枚举和枚举映射。
.chopper.dart - 由chopper生成。
.g.dart - 由json_serializable生成。

Bloc

安装 #

pubspec.yaml文件中添加以下内容以支持代码生成:

dev_dependencies:
  chopper_generator: ^3.0.5
  json_annotation: ^3.0.1
  json_serializable: ^3.4.1
  swagger_dart_code_generator: any

运行时使用的包包括:

dependencies:
  chopper: ^3.0.3

然后运行以下命令来获取包:

pub packages get

或者

flutter packages get

现在,通过运行以下命令让SwaggerGenerator为您生成API文件:

pub run build_runner build

或者

flutter pub run build_runner build

配置 #

Swagger生成器提供了一些配置选项以生成代码。所有选项都应包含在项目的根目录下的build.yaml文件中:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          # 自定义配置选项!

以下是配置选项表:

选项 默认值 是否必需 描述
use_inheritance true false 启用或禁用extends关键字。
with_base_url true false 如果此选项为false,则生成器将忽略Swagger文件中的baseUrl。
use_required_attribute_for_headers true false 如果此选项为false,则生成器不会为headers添加@required属性。
with_converter true false 如果选项为true,则会生成所有映射的组合。
ignore_headers false false 如果选项为true,则不会生成headers。
use_path_for_request_names false false 如果属性为false,则方法名等于operationId ?? path+methodType。如果为true,则只有path+methodType。
enums_case_sensitive true false 如果值为false,则enumValue将被定义为Enum.enumValue即使它的json键等于ENUMVALUE
use_default_null_for_lists false false 如果选项为true,则列表的默认值为null,否则为[]
build_only_models false false 如果选项为true,则不会生成chopper类。
include_if_null null false 启用或禁用includeIfNull JsonAnnotation功能并设置其值。参见IncludeIfNull
default_values_map [] false 包含类型及其默认值的映射。参见DefaultValueMap
response_override_value_map [] false 包含响应及其覆盖值的映射。参见ResponseOverrideValueMap
input_folder - true .swagger文件所在的文件夹路径(例如swagger_examples或lib/swaggers)。
output_folder - true 输出文件夹路径(例如lib/generated)。

重要的是要记住,默认情况下,build会遵循Dart的包布局约定,这意味着只会考虑某些文件夹来解析输入文件。因此,如果您想引用lib/之外的文件夹中的文件,请确保已在sources中包含了该文件夹:

targets:
  $default:
    sources:
      - lib/**
      - swagger_examples/**
      - swaggers/**

模型生成的IncludeIfNull #

此选项用于为模型字段添加includeIfEmpty注解。如果未启用或为空,则includeIfNull注解将不会添加到字段中。详情请参阅官方文档。请参阅以下示例:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          input_folder: 'lib/swaggers'
          output_folder: 'lib/generated_code/'
          include_if_null:
            enabled: true
            value: false

模型生成的默认值映射 #

如果您希望为特定类型的字段添加defaultValue:属性,可以使用默认值映射。请参阅以下示例:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          input_folder: 'lib/swaggers'
          output_folder: 'lib/generated_code/'
          default_values_map:
            - type_name: int
              default_value: '36'
            - type_name: String
              default_value: 'default'
            - type_name: 'List<String>'
              default_value: '[]'

请求生成的响应覆盖值映射 #

如果您希望为具体的请求覆盖响应,可以使用response_override_value_map。例如:

targets:
  $default:
    builders:
      swagger_dart_code_generator:
        options:
          input_folder: 'lib/swaggers'
          output_folder: 'lib/generated_code/'
          response_override_value_map:
            - url: '/store/inventory'
              method: get
              overridden_value: 'List<dynamic>'
            - url: '/news/latest'
              method: put
              overridden_value: 'MyPerfectType'

检查示例以详细了解如何使用它。


示例代码

example/lib/main.dart

import 'dart:async';
import 'package:example/generated_code/example_swagger.enums.swagger.dart';
import 'package:example/generated_code/example_swagger.swagger.dart';

Future main() async {
  final client = ExampleSwagger.create();

  final pet = Pet(
      name: 'Boris',
      tags: [],
      id: 11,
      photoUrls: [
        'https://i.pinimg.com/originals/de/71/bb/de71bb8a57ff473cc58ebc6af58c4858.jpg'
      ],
      category: Category(id: 1, name: 'Mops'),
      status: PetStatus.available);

  final postResult = await client.petPost(body: pet);

  if (postResult.statusCode != 200) {
    /// Some network error
  }

  final getResult = await client.petPetIdGet(petId: 11);

  if (getResult.statusCode != 200) {
    // Some network error
  }

  print(
      'Hello, my name is ${getResult.body!.name}, I am ${getResult.body!.category!.name}');
}

更多关于Flutter Swagger代码生成插件swagger_dart_code_generator_solve_generic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Swagger代码生成插件swagger_dart_code_generator_solve_generic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


swagger_dart_code_generator 是一个用于从 Swagger/OpenAPI 规范生成 Dart 代码的 Flutter 插件。它可以帮助你快速生成 API 客户端、模型类和其他相关的代码,从而减少手动编写这些代码的工作量。

swagger_dart_code_generator_solve_generic 是一个扩展插件,用于解决 swagger_dart_code_generator 在处理泛型类型时的一些问题。它可以帮助生成更准确的泛型类型代码。

使用步骤

  1. 安装依赖

    首先,你需要在 pubspec.yaml 文件中添加 swagger_dart_code_generatorswagger_dart_code_generator_solve_generic 作为开发依赖。

    dev_dependencies:
      swagger_dart_code_generator: ^2.0.0
      swagger_dart_code_generator_solve_generic: ^1.0.0
    

    然后运行 flutter pub get 以安装这些依赖。

  2. 配置 build.yaml

    在项目的根目录下创建一个 build.yaml 文件(如果还没有的话),并配置生成器的选项。

    targets:
      $default:
        builders:
          swagger_dart_code_generator|swagger_dart_code_generator:
            enabled: true
            options:
              input_folder: "swagger"
              output_folder: "lib/generated"
              use_null_safety: true
              solve_generic: true
    
    • input_folder: 指定包含 Swagger/OpenAPI 文件的文件夹。
    • output_folder: 指定生成的 Dart 代码的输出文件夹。
    • use_null_safety: 是否生成支持 null safety 的代码。
    • solve_generic: 启用 swagger_dart_code_generator_solve_generic 插件来解决泛型问题。
  3. 运行代码生成

    在终端中运行以下命令来生成代码:

    flutter pub run build_runner build
    

    这将会根据 build.yaml 中的配置生成 Dart 代码,并将其输出到指定的文件夹中。

  4. 使用生成的代码

    生成的代码通常包括 API 客户端、模型类等。你可以在你的 Flutter 项目中直接使用这些生成的类来进行 API 调用。

    import 'generated/api_client.dart';
    import 'generated/models/user_model.dart';
    
    void fetchUser() async {
      final client = ApiClient();
      final UserModel user = await client.getUserById(1);
      print(user.name);
    }
回到顶部