flutter - 如何从 GraphQL 生成 Dart - graphql 到 dart 生成器

标签 flutter dart types graphql code-generation

如何从 GraphQL 模式定义将简单的对象类型 [1](例如接口(interface)和/类)生成到 Dart 中?

  • 动机
  • 单一事实来源:GraphQL 模式
  • 从 GraphQL 所有简单的类型都生成为多种语言
  • 在我们的例子中,Typescript 和 Dart


  • 到目前为止我们已经尝试过的
  • 所有与 [2] 相关的解决方案 - 甚至 fork - 都不做简单类型

  • 我们知道的可能的DIY方法
  • GraphQL 代码生成器 [3]
  • quicktype 类似的替代品 [4]


  • GraphQL 到 Typescript 示例
    鉴于此架构定义
    type Person {
        age: Int
        name: String!
    }
    
    运行此脚本
    import { GraphQLDefinitionsFactory } from '@nestjs/graphql';
    import { join } from 'path';
    
    
    const definitionsFactory = new GraphQLDefinitionsFactory();
    
    definitionsFactory.generate({
        typePaths: ['./**/*.graphql'],
        path: join(process.cwd(), './class.ts'),
        outputAs: 'class'
    });
    
    definitionsFactory.generate({
        typePaths: ['./src/**/*.graphql'],
        path: join(process.cwd(), './interface.ts'),
        outputAs: 'interface'
    });
    
    
    输出
    export interface Person {
        age?: number;
        name: string;
    }
    
    export class Person {
        age?: number;
        name: string;
    }
    
    1:简单对象类型应该只是简单的普通对象类型,没有注释、编码和解码逻辑等。
    2:https://github.com/gql-dart/gql
    3:https://graphql-code-generator.com
    4:https://app.quicktype.io

    最佳答案

    我个人尝试使用Artemis或希望Apollo正在扩展,但 @Ryosukegraphql_to_dart是直向前和倾斜的。
    如果您已经有一个 GraphQL 端点并且您的架构已启动并正在运行,您只需要设置它的 graphql_config.yaml例如像这样:

    package_name: example
    graphql_endpoint: http://example.com/graphql
    models_directory_path: lib/graphql/models/
    
    给定模式定义
    type Person {
        age: Int
        name: String!
    }
    
    .dart 输出
    class Person{
      int age;
      String name;
      Person({
        this.age,this.name
      });
    
      Person.fromJson(Map<String, dynamic> json){
        age = json['age'];
        name = json['name'];
      }
    
      Map toJson(){
        Map _data = {};
        _data['age'] = age;
        _data['name'] = name;
        return _data;
      }
    }
    
    使用附加选项 type_override您可以根据需要设置自定义标量类型。
    编辑:
    现在有一个 expanded version作为 PR .
    可以在 lib/ 之外生成它们没有导入路径冲突,通过选择退出选项 dynamic_import_path: false .type_override键也不再需要以小写形式显式编写。

    关于flutter - 如何从 GraphQL 生成 Dart - graphql 到 dart 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62590497/

    相关文章:

    flutter - 如何将小部件堆叠在TextField下,并使其在加载更多内容时增长到底部?

    list - 在Dart中返回[…list]有什么用?

    c# - 函数中传递的类型的返回值

    class - flutter 的语法含义

    Flutter:如何在一定长度内隐藏或显示更多文本

    http - 单元测试-如何在 flutter 中模拟第三方库类Dio的参数

    php - 为什么1 == '1,2'为真?

    types - 如何确定 interface{} 值的 "real"类型?

    Flutter - TabBarView 内部的 ListView 失去滚动位置

    dart - Flutter中的NPM 'prestart'脚本等效