프로그램으로 Dart 코드를 만들어 보십시오

19810 단어 FlutterDarttech

freezed와 모조된build를 가지고 있습니다runner로 코드를 생성하는 시스템의 패키지가 있습니다. 그러나 처음에 프로그램으로Dart 코드를 생성하려면 어떻게 해야 합니까?신경 쓰이니까 한번 해 봐.

code_builder


https://pub.dev/packages/code_builder
code_builder 패키지를 사용하면 프로그램에서 Dart 코드를 생성할 수 있습니다.
import 'package:code_builder/code_builder.dart';
import 'package:dart_style/dart_style.dart';

void main() {
 final animal = Class((b) => b
   ..name = 'Animal'
   ..extend = refer('Organism')
   ..methods.add(Method.returnsVoid((b) => b
     ..name = 'eat'
     ..body = const Code("print('Yum');"))));
 final emitter = DartEmitter();
 print(DartFormatter().format('${animal.accept(emitter)}'));
}
README의 샘플 코드는 이렇습니다.정의 클래스, 정의 방법, 출력하면 완성.쉽게 사용할 수 있어요.
class Animal extends Organism {
 void eat() => print('Yum!');
}
dart_스타일 포장을 사용했지만 전선을 정돈해 감각이 좋은 물건입니다.일단 넣으면 돼.
https://pub.dev/packages/dart_style
・code프로그램으로 코드를 만드는 녀석
데이터스타일: 생성된 코드를 성형한 녀석

JSON을 기반으로 Dart 코드를 만들어 봅니다.


실제 사용처로는 모조를 기반으로 코드를 만들거나, 어떤 구조화된 정보가 기재된 파일(JSON이나 YAML 등)을 기반으로 코드를 만드는 느낌이라고 생각한다.번거로운 일을 줄일 것 같다.
여기서 JSON을 정의하고 이를 바탕으로 코드를 만들어 보려고 합니다.시도해 본 전체적인 상황은 이렇다.
JSON
{
  "User": {
    "id": "String",
    "age": "int",
  }
}
을 정의할 때
class User {
  User({this.id, this.age})
  final String id;
  final int age;
}
같은 느낌의 코드를 만들었으면 좋겠어요.

전체 코드


전체적으로 JSON에서 데이터를 생성할 수 있는 코드라는 느낌이 든다.
// @dart=2.9
import 'dart:convert';

import 'package:code_builder/code_builder.dart';
import 'package:dart_style/dart_style.dart';

void main() {
 final json = '''
 {
   "User": {
     "id": "String",
     "name": "String",
     "age": "int",
     "createdAt": "DateTime",
     "updatedAt": "DateTime"
   },
   "Post": {
     "id": "String",
     "title": "String",
     "body": "String",
     "createdAt": "DateTime",
     "updatedAt": "DateTime"
   }
 }
 ''';
 final emitter = DartEmitter();
 final formatter = DartFormatter();

 final data = jsonDecode(json) as Map<String, dynamic>;
 for (final entry in data.entries) {
   final fields = entry.value as Map<String, dynamic>;
   final klass = Class((b) {
     // クラス名
     b.name = entry.key;

     // コンストラクタ
     b.constructors.add(Constructor(
       // Namedパラメータ
       (b) => b.optionalParameters.addAll([
         for (final entry in fields.entries)
           Parameter((b) => b
             ..name = entry.key
             ..named = true
             ..toThis = true)
       ]),
     ));

     // インスタンス変数
     b.fields.addAll([
       for (final entry in fields.entries)
         Field((b) => b
           ..name = entry.key
           ..modifier = FieldModifier.final$
           ..type = Reference(entry.value)),
     ]);
   });

   // クラスをコードとして出力
   print(formatter.format('${klass.accept(emitter)}'));
 }
}
class User {
 User({this.id, this.name, this.age, this.createdAt, this.updatedAt});

 final String id;

 final String name;

 final int age;

 final DateTime createdAt;

 final DateTime updatedAt;
}

class Post {
 Post({this.id, this.title, this.body, this.createdAt, this.updatedAt});

 final String id;

 final String title;

 final String body;

 final DateTime createdAt;

 final DateTime updatedAt;
}
는 기본적으로 클래스에 대해 구조기나 변수 같은 정의할 요소를 계속 증가하면 된다.어떤 요소든 XxBuilder를 통해 상세한 요소를 추가할 수 있기 때문에 매우 간단하다.하지만 인상 속의 처리가 어떤 요소인지 사용해보지 않으면 모르는 부분도 있으니 시도와 오류를 반복해 보자.

최후


비교적 간단한 코드라면 간단하게 생성할 수 있다.복잡한 코드라도 노력만 하면 만들 수 있지만 단순히 귀찮을 수도 있다.
다음은build나는 runner를 통해 코드 생성을 시도하고 싶다.

제작 학습, Flutter 및 Firebase 응용 프로그램 개발


나는 Flutter와Firebase를 이용한 응용 개발과 관련된 서적을 총결하였다.
  • Zenn: https://zenn.dev/umatoma/books/1f4cb2404f3fa9
  • BOOTH: https://umatoma.booth.pm/items/3024238
  • Amazon: https://amzn.to/3h7ie0V

  • Flutter에서 어플리케이션 개발 시작


    https://www.flutter-study.dev/

    좋은 웹페이지 즐겨찾기