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

1 回复

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


codis_generator 是一个用于 Flutter 的代码生成插件,它可以帮助开发者自动生成一些重复性的代码,从而提高开发效率。以下是如何使用 codis_generator 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 codis_generatorbuild_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 的文件,其中包含一些自动生成的代码,例如 toJsonfromJson 方法。

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
回到顶部