CodisGenerator
- Fork自已弃用的DartWriter
CodisGenerator 提供了一个API来生成Dart源代码。它可以使您在开发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 无状态 Widget 示例
输入
{
"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:
...
codis_generator: any
在您的库文件中添加以下导入:
import 'package:codis_generator/codis_generator.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;
}
面向对象概念
类
| 参数 | 描述 | 输出 |
|---|---|---|
| String className | 类名 | class Bird |
| bool isAbstract? | 如果值为true,则生成抽象类 | abstract class Animal 或 class Animal |
| List<Constructors>? | 可以定义多个构造函数 | Singleton._init() , Singleton({this.a}) : super(a) |
| String? baseClass | 继承自基类 | class Bird extends Animal |
| List<String>? mixins | 指示mixin的使用 | 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,则为默认构造函数。如果值不为空,则为命名构造函数。 | 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 | 属性类型 | String name |
| String? modifiers | 属性修饰符 | 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:codis_generator/codis_generator.dart’, as: ‘writer’) | import 'package:codis_generator/codis_generator.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(‘var name = user?.name ?? “‘ahmet'”‘) | [Output]: var name = user?.name ?? 'ahmet' |
任务列表
- 单元测试