DartWriter

DartWriter 提供生成 Dart 源代码的 API。在开发 flutter/dart 工具时,它可以使您的工作更轻松。您还可以生成 Flutter UI 代码。

Hello World 示例

var context = EditorContext(enableDartFormatter: true);
var code = Method(
  name: 'main',
  returnType: 'void',
  statements: [
    Call('print',
      argument: Argument([
        ArgumentItem("'Hello World!'")
      ])
    ),
    Return('0')
  ]
);
print(context.build([code]));

生成如下

void main() {
  print('Hello World!');
  return 0;
}

Flutter 无状态小部件示例

输入

{
  "as": "Scaffold",
  "appBar": {
    "as": "AppBar",
    "title": {
      "as": "Text",
      "params": [
        "'Ahmet'"
      ]
    },
    "centerTitle": "false"
  },
  "body": {
    "as": "Center",
    "child": {
      "as": "Row",
      "children": [
        {
          "as": "Icon",
          "params": ["Icons.add"],
          "color": "Colors.red"
        },
        {
          "as": "Text",
          "params": ["'Ahmet'"],
          "textAlign": "TextAlign.center"
        }
      ]
    }
  }
}

代码

var context = EditorContext(enableDartFormatter: true);
var dartHelper = DartHelper.instance;
Map map = jsonDecode(json);

var homePage = Class('HomePage',
  baseClass: 'StatelessWidget',
  methods: [
    Annotation('override'),
    Method(
      name: 'build',
      returnType: 'Widget',
      param: Parameter([
        ParameterItem('BuildContext context'),
      ]),
      statements: [ Return(dartHelper.getCodeFromMap(map)) ]
    )
  ]
);

print(context.build([
  Import('package:flutter/material.dart'),
  homePage
]));

生成的 UI 代码

import 'package:flutter/material.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text('Ahmet'), centerTitle: false),
        body: Center(
            child: Row(children: [
          Icon(Icons.add, color: Colors.red),
          Text('Ahmet', textAlign: TextAlign.center)
        ])));
  }
}

安装

在您的 Flutter / Dart 项目的 pubspec.yaml 中,添加以下依赖项

dependencies:
  ...
  dart_writer: any

在您的库文件中添加以下导入:

import 'package:dart_writer/dart_writer.dart';

API文档

条件

Method(
  name: 'getMin',
  returnType: 'int',
  statements: [
    Assign('var num1', '5'),
    Assign('var num2', '10'),
    If(condition: 'num1 < num2', statements: [Return('num1')]),
    ElseIf(condition: 'num1 == num2', statements: [Return('num1')]),
    Else(statements: [Return('num2')])
  ]  
)

生成的代码

int getMin() {
  var num1 = 5;
  var num2 = 10;
  if (num1 < num2) {
    return num1;
  } else if (num1 == num2) {
    return num1;
  } else {
    return num2;
  }
}

循环

Method(
  name: 'loops',
  returnType: 'void',
  statements: [
    For('i = 0', 'i < 5', 'i++',
      statements: [RawCode('print(i);')]
    ),
    ForEach('item', 'userList',
      statements: [
        Return('UserCard(item)')
      ]
    ),
    While('i < 5',
      statements: [ RawCode('print(i);'), Assign('i', 'i + 1')]
    )
  ]  
)

生成的代码

void loops() {
  for (var i = 0; i < 5; i++) {
    print(i);
  }
  for (var item in userList) { 
    return UserCard(item);     
  }
  while (i < 5) {
    print(i);
    i = i + 1;
  }
}

声明

Method(name: 'do', returnType: 'int',
  statements: [
    Assign('var i', '5'),
    Assign('var name', Call('getName')),
    Return('i')
  ] 
)

生成的代码

int do() {
  var i = 5;
  var name = getName();
  return i;
}

OOP 概念

参数 描述 输出
String className 类名 class Bird
bool isAbstract? 如果值为 true,则生成抽象类 abstract class Animalclass Animal
List<Constructors>? 可以定义多个构造函数 Singleton._init() , Singleton({this.a}) : super(a)
String? baseClass 继承自基类 class Bird extends Animal
List<String>? mixins 表示 mixins 的使用 class Bird with Feather, Walk
List<String>? interfaces 实现接口 class Bird implements Flyable, Crowable
List<Attribute>? attributes; 类的属性 final String name;
List<IExpression>? methods; 类的所有方法,例如 Method、Getters、Settters final String name;

构造函数

参数 描述 输出
String className 类名 class Singleton
String consturctorName? 如果值为 null,则是默认构造函数。如果不是 null,则是命名构造函数。 Singleton._init() , Singleton({this.a})
Parameter? param 构造函数参数 Singleton({required this.a}), Singleton(this.a, {this.b})
String? superArgument 调用基类的构造函数 Singleton(this.a) : super(a)
String? modifier 构造函数的修饰符,例如 factory factory Singleton()

属性

参数 描述 输出
String name 属性名 名称
String type Attribute 类型 String name
String? modifiers Attribute 修饰符 final String name
String? value 为属性初始化值 final String name = 'Ahmet'

方法

方法

参数 描述 输出
String name 方法名 walk
String returnType? 返回类型 void walk
Parameter? param 方法的参数 void walk({required int step})
bool? isAsync 是异步方法吗? void walk({required int step}) async {}
String? modifier 方法的修饰符,例如 static static void walk
List<IExpression>? statements 方法的体。 在此处写代码...

Getter

参数 描述 输出
String name Getter 名称 get walk
String returnType? 返回类型 void get walk
String? modifier 方法的修饰符,例如 static static void get name
List<IExpression>? statements 方法的体。 在此处写代码...

Setter

参数 描述 输出
String name Getter 名称 set name
String param? 返回类型 set name(String name)
List<IExpression>? statements 方法的体。 在此处写代码...

示例类代码

Class(
  'Bird',
  baseClass: 'Animal',
  interfaces: ['Flyable', 'Crowable'],
  mixins: ['Feather', 'Walk'],
  attributes: <Attribute> [
    Attribute(modifiers: 'final', type: 'String', name: 'name'),
  ],
  constructors: <Constructor> [
    Constructor(
      className: 'Bird',
      constructorName: 'fromName',
      param: Parameter([ParameterItem('this.name', isRequired: true, isNamed: true)]),
        superArgument: Argument([ArgumentItem('name')])
    ),
  ],
  methods: [
    Method(
      name: 'onFly',
      returnType: 'double',
      param: Parameter([ParameterItem('double height')]),
      statements: [Return('height * 2')]
    ),
  ]
);

生成的代码

class Bird extends Animal with Feather, Walk implements Flyable, Crowable {   
  final String name;

  Bird.fromName({required this.name}) : super(name);

  double onFly(double height) {        
    return height * 2;
  }
}

接口

参数 描述 输出
String name 接口名称 interface Flyable
String? baseClass 继承类 interface Flyable extends Breathable
List<IExpression>? prototypes 接口的抽象方法 void doFly();

示例接口

Interface('Flyable',
    baseClass: 'Breathable',
    prototypes: [
      Method(name: 'doFly', returnType: 'void')
    ]
)

生成的代码

abstract class Flyable extends Breathable {
  void doFly();
}

其他

表达式 示例代码 输出
说明 Annotation('override') @override
导入 Import('package:dart_writer/dart_writer.dart', as: 'writer') import 'package:dart_writer/dart_writer.dart' as writer;
Enum Enum('Roles', enums: ['USER', 'ADMIN', 'DEVELOPER']) enum Roles { USER, ADMIN, DEVELOPER }
参数 Parameter([ParameterItem('String name', isNamed: true, isRequired: true)]) {required String name}
参数 Argument([ArgumentItem("'Star'", name:'surname']) surname: 'Star'
RawCode RawCode('var name = user?.name ?? "'ahmet'"') [输出]: var name = user?.name ?? 'ahmet'

任务列表

  • [ ] 单元测试

GitHub

https://github.com/ahm3tcelik/dart_writer