Flutter代码生成插件codis_generator的使用
Flutter代码生成插件codis_generator的使用
CodeGenerator
提供了生成 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:
...
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;
}
面向对象编程概念
类
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;
}
}
构造函数
Constructor(
className: 'Singleton',
constructorName: '_init',
param: Parameter([ParameterItem('this.a', isRequired: true)]),
modifier: 'factory'
)
生成的代码:
factory Singleton() { ... }
属性
Attribute(modifiers: 'final', type: 'String', name: 'name')
生成的代码:
final String name;
方法
Method(
name: 'walk',
returnType: 'void',
param: Parameter([ParameterItem('int step', isRequired: true)]),
statements: [RawCode('print(step);')]
)
生成的代码:
void walk(int step) {
print(step);
}
Getter
Getter(
name: 'getName',
returnType: 'String',
statements: [Return('name')]
)
生成的代码:
String get getName => name;
Setter
Setter(
name: 'setName',
param: Parameter([ParameterItem('String name', isRequired: true)]),
statements: [Assign('name', 'value')]
)
生成的代码:
void set setName(String name) {
this.name = name;
}
接口
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('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"')
生成的代码:
var name = user?.name ?? 'ahmet'
更多关于Flutter代码生成插件codis_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter代码生成插件codis_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
codis_generator
是一个用于 Flutter 的代码生成插件,它可以帮助开发者自动生成一些重复性的代码,从而提高开发效率。以下是如何使用 codis_generator
的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 codis_generator
和 build_runner
的依赖。
dependencies:
flutter:
sdk: flutter
codis_generator: ^版本号
dev_dependencies:
build_runner: ^版本号
请确保将 ^版本号
替换为最新的版本号。
2. 创建模型类
假设你有一个简单的数据模型类,例如:
import 'package:codis_generator/codis_generator.dart';
part 'user.g.dart';
@Codis()
class User {
final String name;
final int age;
User({required this.name, required this.age});
}
3. 生成代码
在终端中运行以下命令来生成代码:
flutter pub run build_runner build
这将生成一个名为 user.g.dart
的文件,其中包含一些自动生成的代码,例如 toJson
和 fromJson
方法。
4. 使用生成的代码
生成的文件 user.g.dart
会自动包含在 user.dart
中,你可以直接使用生成的方法:
void main() {
final user = User(name: 'John', age: 30);
// 使用生成的 toJson 方法
final json = user.toJson();
print(json); // 输出: {"name":"John","age":30}
// 使用生成的 fromJson 方法
final newUser = User.fromJson(json);
print(newUser.name); // 输出: John
}
5. 持续生成代码
如果你修改了模型类,可以再次运行 flutter pub run build_runner build
来重新生成代码。如果你想在文件更改时自动重新生成代码,可以使用 watch
命令:
flutter pub run build_runner watch
这将监视你的文件变化,并在需要时自动重新生成代码。
6. 清理生成的文件
如果你需要清理生成的文件,可以运行以下命令:
flutter pub run build_runner clean