DartWriter
DartWriter
provides API to generate Dart source code. It can make your job easier while developing flutter/dart tools. You can also generate Flutter UI code.
Hello World Example
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]));
Generated as below:
void main() {
print('Hello World!');
return 0;
}
Flutter Stateless Widget Example
Input
{
"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"
}
]
}
}
}
Code:
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
]));
Generated ui code:
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)
])));
}
}
Installation
In the pubspec.yaml
of your Flutter / Dart project, add the following dependency:
dependencies:
...
dart_writer: any
In your library file add the following import:
import 'package:dart_writer/dart_writer.dart';
API Documentation
Conditions
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')])
]
)
Generated code:
int getMin() {
var num1 = 5;
var num2 = 10;
if (num1 < num2) {
return num1;
} else if (num1 == num2) {
return num1;
} else {
return num2;
}
}
Loops
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')]
)
]
)
Generated code:
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;
}
}
Statements
Method(name: 'do', returnType: 'int',
statements: [
Assign('var i', '5'),
Assign('var name', Call('getName')),
Return('i')
]
)
Generated code:
int do() {
var i = 5;
var name = getName();
return i;
}
OOP Concepts
Class
Parameter | Description | Output |
---|---|---|
String className | Class Name | class Bird |
bool isAbstract? | Generating abstract class if value is true | abstract class Animal or class Animal |
List<Constructors>? | more than one constructor can be defined | Singleton._init() , Singleton({this.a}) : super(a) |
String? baseClass | extends to base class | class Bird extends Animal |
List<String>? mixins | indicates the use of mixins | class Bird with Feather, Walk |
List<String>? interfaces | implements interface | class Bird implements Flyable, Crowable |
List<Attribute>? attributes; | attributes of class | final String name; |
List<IExpression>? methods; | all methods of class such as Method, Getters, Settters | final String name; |
Constructor
Parameter | Description | Output |
---|---|---|
String className | Class Name | class Singleton |
String consturctorName? | if value is null Default constructor. if not value, named constructor. | Singleton._init() , Singleton({this.a}) |
Parameter? param | Constructor parameters | Singleton({required this.a}) , Singleton(this.a, {this.b}) |
String? superArgument | call constructor of base class | Singleton(this.a) : super(a) |
String? modifier | modifier of constructor such as factory |
factory Singleton() |
Attribute
Parameter | Description | Output |
---|---|---|
String name | Attribute Name | name |
String type | Attribute type | String name |
String? modifiers | Attribute modifiers | final String name |
String? value | initialize value to attribute | final String name = 'Ahmet' |
Methods
Method
Parameter | Description | Output |
---|---|---|
String name | Method Name | walk |
String returnType? | Return type | void walk |
Parameter? param | Method parameters | void walk({required int step}) |
bool? isAsync | is async method? | void walk({required int step}) async {} |
String? modifier | Modifier of method such as static |
static void walk |
List<IExpression>? statements | body of method. | Code here... |
Getter
Parameter | Description | Output |
---|---|---|
String name | Getter Name | get walk |
String returnType? | Return type | void get walk |
String? modifier | Modifier of method such as static |
static void get name |
List<IExpression>? statements | body of method. | Code here... |
Setter
Parameter | Description | Output |
---|---|---|
String name | Getter Name | set name |
String param? | Return type | set name(String name) |
List<IExpression>? statements | body of method. | Code here... |
Example Class Code:
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')]
),
]
);
Generated code:
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;
}
}
Interface
Parameter | Description | Output |
---|---|---|
String name | Interface Name | interface Flyable |
String? baseClass | extends class | interface Flyable extends Breathable |
List<IExpression>? prototypes | abstract methods of interface | void doFly(); |
Example Interface
Interface('Flyable',
baseClass: 'Breathable',
prototypes: [
Method(name: 'doFly', returnType: 'void')
]
)
Generated code:
abstract class Flyable extends Breathable {
void doFly();
}
Other
Expression | Example Code | Output |
---|---|---|
Annotation | Annotation('override') | @override |
Import | 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 } |
Paramter | Parameter(ParameterItem('String name', isNamed: true, isRequired: true)) | {required String name} |
Argument | Argument(ArgumentItem("'Star'", name:'surname' ) |
surname: 'Star' |
RawCode | RawCode('var name = user?.name ?? "'ahmet'"') | [Output]: var name = user?.name ?? 'ahmet' |