这是什么?

一些仅使用 package:analyzerpackage:code_builder 从另一个 dart 代码构建 dart 代码的示例(即,没有 build_runnerbuild.yaml 文件)。

example 文件夹中,有三个独立的示例。每个示例都可以按如下方式执行:

[~/path/to/repo] dart run example/<file_name>.dart
  • ast_example
    • 展示了如何使用 package:analyzer 从源代码生成抽象语法树 (AST)。
    • 如何访问树中的元素。

  • code_builder
    • 展示了如何使用 package:code_builder 以编程方式构建代码。

  • data_class_builder_example

    • 结合了以上两个示例来生成一个数据类。

    • 简而言之,它将此作为输入

    class Person  { 
        final String name;
        final String? nickname;
        final int age;
        final double height;
        final List<String> hobbies;
    }
    • 以此作为输出

    class Person {
        const Person({
            required this.name,
            this.nickname,
            required this.age,
            required this.height,
            required this.hobbies,
        });
    
        factory Person.fromMap(Map<String, dynamic> map) {
            return Person(
            name: map['name'],
            nickname: map['nickname'],
            age: map['age'].toInt(),
            height: map['height'].toDouble(),
            hobbies: List.from(map['hobbies']),
            );
        }
    
        factory Person.fromJson(String source) => Person.fromMap(json.decode(source));
    
        final String name;
    
        final String? nickname;
    
        final int age;
    
        final double height;
    
        final List<String> hobbies;
    
        Person copyWith({
            String? name,
            String? nickname,
            int? age,
            double? height,
            List<String>? hobbies,
        }) {
            return Person(
            name: name ?? this.name,
            nickname: nickname ?? this.nickname,
            age: age ?? this.age,
            height: height ?? this.height,
            hobbies: hobbies ?? this.hobbies,
            );
        }
    
        String toJson() => json.encode(toMap());
        Map<String, dynamic> toMap() {
            return {
            'name': name,
            'nickname': nickname,
            'age': age,
            'height': height,
            'hobbies': hobbies,
            };
        }
    
        @override
        String toString() {
            return 'Person(name: $name, nickname: $nickname, age: $age, height: $height, hobbies: $hobbies)';
        }
    
        @override
        bool operator ==(Object other) {
            if (identical(this, other)) return true;
            // TODO: handle list equality here
            return other is Person &&
                other.name == name &&
                other.nickname == nickname &&
                other.age == age &&
                other.height == height &&
                other.hobbies == hobbies;
        }
    
        @override
        int get hashCode {
            return name.hashCode ^ nickname.hashCode ^ age.hashCode ^ height.hashCode ^ hobbies.hashCode;
            }
    }
    

免责声明
这些示例是(拙劣地)为学习目的而编写的,旨在理解这些包如何协同工作——仅此而已。

GitHub

查看 Github