{"id":378926,"date":"2024-06-14T21:00:05","date_gmt":"2024-06-14T21:00:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=378926"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=378926","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430 Dart\u00a03.5 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043a\u043e\u0434\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u00a0Dart 3.5\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u043e: \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u042d\u0442\u043e \u043a\u0430\u043a\u00a0\u0441\u0442\u0430\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430, \u043d\u043e\u00a0\u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u043b\u044e\u0441 \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u0431\u0435\u0442\u0430, \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u0430\u043b\u043e. \u0412\u043e\u0442 <a href=\"https:\/\/dart.dev\/language\/macros#timeline\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u043d<\/a> \u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 <code>json_serializable<\/code> \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442.g.dart\u2011\u0444\u0430\u0439\u043b\u044b. \u041d\u0430\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u00a0\u0442\u0435\u0447\u0435\u043d\u0438\u0435 2024\u00a0\u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u00a0\u043d\u0430\u0447\u0430\u043b\u0435 2025\u00a0\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e\u00a0\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441: \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/args_macro%D1%91\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441<\/a>, \u0438 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0\u2014 \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0436\u0434\u0430\u0442\u044c 2025\u00a0\u0433\u043e\u0434\u0430. \u041c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>@JsonCodable<\/code> \u043e\u0442\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043c\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e data\u2011\u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<h3>Dart 3.5<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0431\u0435\u0442\u0430\u2011\u0432\u0435\u0440\u0441\u0438\u044e Dart 3.5\u00a0\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438: <a href=\"https:\/\/dart.dev\/language\/macros#set-up-the-experiment\" rel=\"noopener noreferrer nofollow\">https:\/\/dart.dev\/language\/macros#set\u2011up\u2011the\u2011experiment<\/a><\/p>\n<p>\u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u043b ZIP\u2011\u0444\u0430\u0439\u043b \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/p>\n<h3>VSCode<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Dart \u0434\u043b\u044f\u00a0VSCode.<\/p>\n<h3>pubspec.yaml<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>@JsonCodable<\/code>, \u043d\u0443\u0436\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Dart <code>3.5.0-154<\/code> \u0438\u043b\u0438\u00a0\u0432\u044b\u0448\u0435. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u00a0pubspec.yaml:<\/p>\n<pre><code class=\"yaml\">name: macro_client environment:   sdk: ^3.5.0-154  dependencies:   json: ^0.20.2<\/code><\/pre>\n<h3>analysis_options.yaml<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0435\u00a0\u0440\u0443\u0433\u0430\u043b\u0441\u044f, \u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0435\u043c\u0443, \u0447\u0442\u043e\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 analysis_options.yaml:<\/p>\n<pre><code class=\"yaml\">analyzer:   enable-experiment:     - macros<\/code><\/pre>\n<h3>\u041a\u043e\u0434<\/h3>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"dart\">import 'package:json\/json.dart';  @JsonCodable() \/\/ \u0410\u043d\u043d\u0442\u043e\u0430\u0446\u0438\u044f-\u043c\u0430\u043a\u0440\u043e\u0441. class User {   final int? age;   final String name;   final String username; }  void main() {   \/\/ \u0411\u0435\u0440\u0451\u043c \u0442\u0430\u043a\u043e\u0439 JSON:   final userJson = {     'age': 5,     'name': 'Roger',     'username': 'roger1337',   };    \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c:   final user = User.fromJson(userJson);   print(user);   print(user.toJson()); }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c \u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code>dart run --enable-experiment=macros lib\/example.dart<\/code><\/pre>\n<p>\u0418\u043b\u0438\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 VSCode \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 settings.json:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/817\/d3b\/0eb\/817d3b0ebf8590b59aeb4507d8bf244e.png\" width=\"1326\" height=\"837\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/817\/d3b\/0eb\/817d3b0ebf8590b59aeb4507d8bf244e.png\"\/><\/figure>\n<p>\u0418 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0442\u0430\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4e6\/fdf\/1db\/4e6fdf1db9260e09dbd394db31ed9440.png\" width=\"1044\" height=\"296\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e6\/fdf\/1db\/4e6fdf1db9260e09dbd394db31ed9440.png\"\/><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Instance of 'User' {age: 5, name: Roger, username: roger1337}<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 6\u00a0\u0441\u0442\u0440\u043e\u043a \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<pre><code class=\"dart\">@JsonCodable() class User {   final int? age;   final String name;   final String username; }<\/code><\/pre>\n<p>\u0410 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c <code>json_serializable<\/code> \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e 16 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"dart\">@JsonSerializable() class User {   const Commit({     required this.age,     required this.name,     required this.username,   });    final int? age;   final String name;   final String username;    factory User.fromJson(Map&lt;String, dynamic> map) => _$UserFromJson(map);    Map&lt;String, dynamic> toJson() => _$UserToJson(this); }<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434<\/h3>\n<p>\u0412\u00a0VSCode \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u00abGo to Augmentation\u00bb \u043f\u043e\u0434\u00a0\u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>. \u041e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043a\u043e\u0434:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b7d\/ca0\/daf\/b7dca0daf3760c4bff41bfe79cf6b42a.png\" width=\"1600\" height=\"819\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b7d\/ca0\/daf\/b7dca0daf3760c4bff41bfe79cf6b42a.png\"\/><\/figure>\n<p>\u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u043d\u0435\u00a0\u0444\u0430\u0439\u043b \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0440\u0430\u0437\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0\u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0410\u00a0\u0435\u0441\u043b\u0438 VSCode \u0432\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/show_augmentation\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439\u00a0\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0412\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430: \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f (\u00abaugmentation\u00bb, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00bb). \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0447\u043b\u0435\u043d\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u00a0\u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043d\u0435\u00a0\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"dart\">class Cat {   final String name; \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \"Uninitialized\", \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. }  augment class Cat {   Cat(this.name); \/\/    \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443. }<\/code><\/pre>\n<p>\u041e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438 \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u043e\u00a0\u0441\u0443\u0442\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u00a0\u2014 \u0432\u044b\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u00a0\u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439. \u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043e\u0442\u00a0\u0441\u0442\u0430\u0440\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.g.dart\u2011\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>json_serializable<\/code> \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439\u00a0\u0436\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u00a0\u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0430\u00a0\u0444\u043e\u0440\u0432\u0430\u0440\u0434\u0435\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>toJson<\/code> \u0438 <code>fromJson<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u043e\u0447\u0435\u0441\u0442\u0438\u00a0\u2014 \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430\u00a0\u043d\u0435\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c. \u0414\u0430, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u0430\u0436\u043d\u044b, \u043d\u043e\u00a0\u0438\u0445 \u0440\u043e\u043b\u044c \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u0430 \u0432\u00a0\u0442\u043e\u0439 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043e\u0440\u043e \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 hello-world \u043c\u0430\u043a\u0440\u043e\u0441<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 <code>hello.dart<\/code> \u0441\u00a0\u043a\u043e\u0434\u043e\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"dart\">import 'dart:async';  import 'package:macros\/macros.dart';  final _dartCore = Uri.parse('dart:core');  macro class Hello implements ClassDeclarationsMacro {   const Hello();    @override   Future&lt;void> buildDeclarationsForClass(     ClassDeclaration clazz,     MemberDeclarationBuilder builder,   ) async {     final fields = await builder.fieldsOf(clazz);     final fieldsString = fields.map((f) => f.identifier.name).join(', ');      final print = await builder.resolveIdentifier(_dartCore, 'print');      builder.declareInType(       DeclarationCode.fromParts([         'void hello() {',         print,         '(\"Hello! I am ${clazz.identifier.name}. I have $fieldsString.\");}',       ]),     );   } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0435\u0442\u043e\u0434 <code>hello<\/code> \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c. \u041c\u0435\u0442\u043e\u0434 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u00a0\u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0441\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>macro<\/code>. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>ClassDeclarationsMacro<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0\u043d\u0438\u0445. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u043c\u0438 \u043a\u00a0\u0440\u0430\u0437\u043d\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u041e\u0431\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0412\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>buildDeclarationsForClass<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0415\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ol>\n<li>\n<p><code>ClassDeclaration<\/code> \u0441\u00a0\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u00a0\u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u043b\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c class declaration \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0432\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u043b\u0434\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0423\u00a0\u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>declareInType<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u0412\u00a0\u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e\u00a0\u0435\u0441\u0442\u044c \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u0441\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>print<\/code>.<\/p>\n<p>\u0412\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>JsonCodable<\/code> \u0432\u044b\u0448\u0435 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>dart:core<\/code> \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u00a0\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c:<\/p>\n<pre><code class=\"dart\">import 'dart:core' as prefix0;<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 \u043a\u043e\u0434 \u043d\u0435\u00a0\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u043b \u0441\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0435\u0433\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432 <code>print(something)<\/code> \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0438\u0437 <em>\u0447\u0430\u0441\u0442\u0435\u0439<\/em>:<\/p>\n<pre><code class=\"dart\">final print = await builder.resolveIdentifier(_dartCore, 'print');  builder.declareInType(   DeclarationCode.fromParts([ \/\/ \u0427\u0430\u0441\u0442\u0438:     'void hello() {',     print,     '(\"Hello! I am ${clazz.identifier.name}. I have $fieldsString.\");}',   ]), );<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438\u043b\u0438\u00a0\u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430\u00a0\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b. \u0412\u00a0\u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043b\u0435\u0435\u043d\u043e \u0432\u00a0\u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b.<\/p>\n<p>\u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441:<\/p>\n<pre><code class=\"dart\">import 'hello.dart';  @Hello() class User {   const User({     required this.age,     required this.name,     required this.username,   });    final int? age;   final String name;   final String username; }  void main() {   final user = User(age: 5, name: 'Roger', username: 'roger1337');   user.hello(); }<\/code><\/pre>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u00abGo to Augmentation\u00bb \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c5c\/feb\/d52\/c5cfebd52c8de26f38996ca71f1b9bca.png\" width=\"1600\" height=\"907\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c5c\/feb\/d52\/c5cfebd52c8de26f38996ca71f1b9bca.png\"\/><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u043f\u0435\u0440\u0435\u0434 <code>print<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>prefix0<\/code>, \u043f\u043e\u0434\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>dart:core<\/code>\u00a0\u0431\u044b\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0430\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u00a0\u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a\u00a0\u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code>print<\/code> \u0432\u00a0\u043a\u043e\u0434\u00a0\u2014 \u043c\u044b \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435:<\/p>\n<pre><code>dart run --enable-experiment=macros hello_client.dart<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Hello! I am User. I have age, name, username.<\/code><\/pre>\n<h2>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/h2>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<h3>JsonCodable<\/h3>\n<p>\u042d\u0442\u043e \u043f\u0438\u043b\u043e\u0442\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043e\u0442\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u0421\u043e\u0432\u0435\u0442\u0443\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c <a href=\"https:\/\/github.com\/dart-lang\/sdk\/blob\/main\/pkg\/json\/lib\/json.dart\" rel=\"noopener noreferrer nofollow\">\u0435\u0433\u043e \u043a\u043e\u0434<\/a>. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u043c\u0443 \u044f \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u00a0\u043d\u0435\u0433\u043e.<\/p>\n<h3>Args<\/h3>\n<p>\u042d\u0442\u043e \u043c\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u00a0\u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pub.dev\/packages\/args\" rel=\"noopener noreferrer nofollow\">args<\/a>:<\/p>\n<pre><code class=\"dart\">import 'package:args\/args.dart';  void main(List&lt;String> argv) {   final parser = ArgParser();   parser.addOption('name');   final results = parser.parse(argv);   print('Hello, ' + results.option('name')); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/p>\n<pre><code>dart run main.dart --name=Alexey<\/code><\/pre>\n<p>\u0422\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Hello, Alexey<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u0442\u043e \u044d\u0442\u043e \u0433\u0440\u044f\u0437\u043d\u043e. \u0412\u00a0\u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f. \u041d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e\u00a0\u0432\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0438\u0445 \u0432\u00a0\u043a\u043e\u0434\u0435. \u0418\u0445 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/args_macro\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441 <\/a><code>Args<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u0434\u0430\u0451\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"dart\">import 'package:args_macro\/args_macro.dart';  @Args() class HelloArgs {   String name;   int count = 1; }  void main(List&lt;String> argv) {   final parser = HelloArgsParser(); \/\/ \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430.   final HelloArgs args = parser.parse(argv);    for (int n = 0; n &lt; args.count; n++)     print('Hello, ${args.name}!'); }<\/code><\/pre>\n<p>\u042f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043a\u0430\u043a\u00a0\u044f \u0435\u0433\u043e \u0434\u0435\u043b\u0430\u043b \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0451:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0432\u00a0Telegram: <a href=\"https:\/\/t.me\/ainkin_com\" rel=\"noopener noreferrer nofollow\">ainkin_com<\/a><\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0439 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043a\u0430\u043d\u0430\u043b (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0440\u0435\u0436\u0435 \u0438 \u0441\u00a0\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439): <a href=\"https:\/\/t.me\/ainkin_com_ru\" rel=\"noopener noreferrer nofollow\">ainkin_com_ru<\/a><\/p>\n<\/li>\n<li>\n<p>Twitter: <a href=\"https:\/\/x.com\/AlexeyInkin\" rel=\"noopener noreferrer nofollow\">https:\/\/x.com\/AlexeyInkin<\/a><\/p>\n<\/li>\n<li>\n<p>LinkedIn: <a href=\"https:\/\/www.linkedin.com\/in\/alexey-inkin\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.linkedin.com\/in\/alexey\u2011inkin\/<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/821911\/\"> https:\/\/habr.com\/ru\/articles\/821911\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u00a0Dart 3.5\u00a0\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u043e: \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u042d\u0442\u043e \u043a\u0430\u043a\u00a0\u0441\u0442\u0430\u0440\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430, \u043d\u043e\u00a0\u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043f\u043b\u044e\u0441 \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u044d\u0442\u043e \u0431\u0435\u0442\u0430, \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u0430\u043b\u043e. \u0412\u043e\u0442 <a href=\"https:\/\/dart.dev\/language\/macros#timeline\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u043d<\/a> \u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043e\u0434\u0438\u043d \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 <code>json_serializable<\/code> \u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442.g.dart\u2011\u0444\u0430\u0439\u043b\u044b. \u041d\u0430\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u0442\u0430\u043d\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u00a0\u0442\u0435\u0447\u0435\u043d\u0438\u0435 2024\u00a0\u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u00a0\u043d\u0430\u0447\u0430\u043b\u0435 2025\u00a0\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e\u00a0\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0443\u0436\u0435 \u0441\u0435\u0439\u0447\u0430\u0441: \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/args_macro%D1%91\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441<\/a>, \u0438 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0\u2014 \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0436\u0434\u0430\u0442\u044c 2025\u00a0\u0433\u043e\u0434\u0430. \u041c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u00a0\u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0430\u00a0\u043f\u0440\u043e\u0434\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a:<\/p>\n<ol>\n<li>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>@JsonCodable<\/code> \u043e\u0442\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043c\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0432\u0430\u0448\u0435\u0433\u043e data\u2011\u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<\/ol>\n<h2>\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442<\/h2>\n<h3>Dart 3.5<\/h3>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0431\u0435\u0442\u0430\u2011\u0432\u0435\u0440\u0441\u0438\u044e Dart 3.5\u00a0\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u00a0\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438: <a href=\"https:\/\/dart.dev\/language\/macros#set-up-the-experiment\" rel=\"noopener noreferrer nofollow\">https:\/\/dart.dev\/language\/macros#set\u2011up\u2011the\u2011experiment<\/a><\/p>\n<p>\u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u043b ZIP\u2011\u0444\u0430\u0439\u043b \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443.<\/p>\n<h3>VSCode<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430 Dart \u0434\u043b\u044f\u00a0VSCode.<\/p>\n<h3>pubspec.yaml<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>@JsonCodable<\/code>, \u043d\u0443\u0436\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Dart <code>3.5.0-154<\/code> \u0438\u043b\u0438\u00a0\u0432\u044b\u0448\u0435. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u00a0pubspec.yaml:<\/p>\n<pre><code class=\"yaml\">name: macro_client environment:   sdk: ^3.5.0-154  dependencies:   json: ^0.20.2<\/code><\/pre>\n<h3>analysis_options.yaml<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0435\u00a0\u0440\u0443\u0433\u0430\u043b\u0441\u044f, \u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0435\u043c\u0443, \u0447\u0442\u043e\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 analysis_options.yaml:<\/p>\n<pre><code class=\"yaml\">analyzer:   enable-experiment:     - macros<\/code><\/pre>\n<h3>\u041a\u043e\u0434<\/h3>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"dart\">import 'package:json\/json.dart';  @JsonCodable() \/\/ \u0410\u043d\u043d\u0442\u043e\u0430\u0446\u0438\u044f-\u043c\u0430\u043a\u0440\u043e\u0441. class User {   final int? age;   final String name;   final String username; }  void main() {   \/\/ \u0411\u0435\u0440\u0451\u043c \u0442\u0430\u043a\u043e\u0439 JSON:   final userJson = {     'age': 5,     'name': 'Roger',     'username': 'roger1337',   };    \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c:   final user = User.fromJson(userJson);   print(user);   print(user.toJson()); }<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u00a0\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c \u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<pre><code>dart run --enable-experiment=macros lib\/example.dart<\/code><\/pre>\n<p>\u0418\u043b\u0438\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 VSCode \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 settings.json:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0418 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0442\u0430\u043c:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0438 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Instance of 'User' {age: 5, name: Roger, username: roger1337}<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e 6\u00a0\u0441\u0442\u0440\u043e\u043a \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435:<\/p>\n<pre><code class=\"dart\">@JsonCodable() class User {   final int? age;   final String name;   final String username; }<\/code><\/pre>\n<p>\u0410 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c <code>json_serializable<\/code> \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e 16 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"dart\">@JsonSerializable() class User {   const Commit({     required this.age,     required this.name,     required this.username,   });    final int? age;   final String name;   final String username;    factory User.fromJson(Map&lt;String, dynamic> map) => _$UserFromJson(map);    Map&lt;String, dynamic> toJson() => _$UserToJson(this); }<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434<\/h3>\n<p>\u0412\u00a0VSCode \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u00abGo to Augmentation\u00bb \u043f\u043e\u0434\u00a0\u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>@JsonCodable<\/code>. \u041e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043a\u043e\u0434:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u00a0\u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442\u00a0\u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u043d\u0435\u00a0\u0444\u0430\u0439\u043b \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435\u00a0\u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0440\u0430\u0437\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u00a0\u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0410\u00a0\u0435\u0441\u043b\u0438 VSCode \u0432\u0430\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/show_augmentation\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439\u00a0\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442: \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0412\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430: \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f (\u00abaugmentation\u00bb, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a \u00ab\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00bb). \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0447\u043b\u0435\u043d\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0437\u0430\u00a0\u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0433\u0434\u0435 \u043e\u043d\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u044b.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043d\u0435\u00a0\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438. \u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"dart\">class Cat {   final String name; \/\/ \u041e\u0448\u0438\u0431\u043a\u0430 \"Uninitialized\", \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. }  augment class Cat {   Cat(this.name); \/\/    \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443. }<\/code><\/pre>\n<p>\u041e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438 \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041f\u043e\u00a0\u0441\u0443\u0442\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u00a0\u2014 \u0432\u044b\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u00a0\u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439. \u0418 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043e\u0442\u00a0\u0441\u0442\u0430\u0440\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.g.dart\u2011\u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>json_serializable<\/code> \u0441\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439\u00a0\u0436\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043a\u043e\u0434, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432\u00a0\u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0430\u00a0\u0444\u043e\u0440\u0432\u0430\u0440\u0434\u0435\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>toJson<\/code> \u0438 <code>fromJson<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u043e\u0447\u0435\u0441\u0442\u0438\u00a0\u2014 \u043e\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430\u00a0\u043d\u0435\u00a0\u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c. \u0414\u0430, \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432\u0430\u0436\u043d\u044b, \u043d\u043e\u00a0\u0438\u0445 \u0440\u043e\u043b\u044c \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u0430 \u0432\u00a0\u0442\u043e\u0439 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043e\u0440\u043e \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 hello-world \u043c\u0430\u043a\u0440\u043e\u0441<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 <code>hello.dart<\/code> \u0441\u00a0\u043a\u043e\u0434\u043e\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"dart\">import 'dart:async';  import 'package:macros\/macros.dart';  final _dartCore = Uri.parse('dart:core');  macro class Hello implements ClassDeclarationsMacro {   const Hello();    @override   Future&lt;void> buildDeclarationsForClass(     ClassDeclaration clazz,     MemberDeclarationBuilder builder,   ) async {     final fields = await builder.fieldsOf(clazz);     final fieldsString = fields.map((f) => f.identifier.name).join(', ');      final print = await builder.resolveIdentifier(_dartCore, 'print');      builder.declareInType(       DeclarationCode.fromParts([         'void hello() {',         print,         '(\"Hello! I am ${clazz.identifier.name}. I have $fieldsString.\");}',       ]),     );   } }<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0435\u0442\u043e\u0434 <code>hello<\/code> \u0432\u00a0\u043b\u044e\u0431\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c. \u041c\u0435\u0442\u043e\u0434 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u00a0\u2014 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0441\u00a0\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c <code>macro<\/code>. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>ClassDeclarationsMacro<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0432\u00a0\u043d\u0438\u0445. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u043c\u0438 \u043a\u00a0\u0440\u0430\u0437\u043d\u044b\u043c \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u041e\u0431\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0412\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>buildDeclarationsForClass<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0415\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<ol>\n<li>\n<p><code>ClassDeclaration<\/code> \u0441\u00a0\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e\u00a0\u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u043b\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c class declaration \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0432\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u043b\u0434\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0423\u00a0\u0431\u0438\u043b\u0434\u0435\u0440\u0430 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>declareInType<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043b\u044e\u0431\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u0412\u00a0\u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0443, \u043d\u043e\u00a0\u0435\u0441\u0442\u044c \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c \u0441\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>print<\/code>.<\/p>\n<p>\u0412\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 <code>JsonCodable<\/code> \u0432\u044b\u0448\u0435 \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>dart:core<\/code> \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u00a0\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c:<\/p>\n<pre><code class=\"dart\">import 'dart:core' as prefix0;<\/code><\/pre>\n<p>\u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 \u043a\u043e\u0434 \u043d\u0435\u00a0\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432\u0430\u043b \u0441\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0435\u0433\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0437\u043e\u0432 <code>print(something)<\/code> \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u00a0\u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0438\u0437 <em>\u0447\u0430\u0441\u0442\u0435\u0439<\/em>:<\/p>\n<pre><code class=\"dart\">final print = await builder.resolveIdentifier(_dartCore, 'print');  builder.declareInType(   DeclarationCode.fromParts([ \/\/ \u0427\u0430\u0441\u0442\u0438:     'void hello() {',     print,     '(\"Hello! I am ${clazz.identifier.name}. I have $fieldsString.\");}',   ]), );<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0438\u043b\u0438\u00a0\u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430\u00a0\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b. \u0412\u00a0\u043a\u043e\u043d\u0446\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043b\u0435\u0435\u043d\u043e \u0432\u00a0\u0441\u0442\u0440\u043e\u043a\u0443, \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b.<\/p>\n<p>\u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441:<\/p>\n<pre><code class=\"dart\">import 'hello.dart';  @Hello() class User {   const User({     required this.age,     required this.name,     required this.username,   });    final int? age;   final String name;   final String username; }  void main() {   final user = User(age: 5, name: 'Roger', username: 'roger1337');   user.hello(); }<\/code><\/pre>\n<p>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u00abGo to Augmentation\u00bb \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f:<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u043f\u0435\u0440\u0435\u0434 <code>print<\/code> \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>prefix0<\/code>, \u043f\u043e\u0434\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>dart:core<\/code>\u00a0\u0431\u044b\u043b\u0430 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041a\u0441\u0442\u0430\u0442\u0438, \u0441\u0430\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u00a0\u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a\u00a0\u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 <code>print<\/code> \u0432\u00a0\u043a\u043e\u0434\u00a0\u2014 \u043c\u044b \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e\u0442 \u0438\u043c\u043f\u043e\u0440\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435:<\/p>\n<pre><code>dart run --enable-experiment=macros hello_client.dart<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Hello! I am User. I have age, name, username.<\/code><\/pre>\n<h2>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/h2>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<h3>JsonCodable<\/h3>\n<p>\u042d\u0442\u043e \u043f\u0438\u043b\u043e\u0442\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u043e\u0442\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b Dart, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u0421\u043e\u0432\u0435\u0442\u0443\u044e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c <a href=\"https:\/\/github.com\/dart-lang\/sdk\/blob\/main\/pkg\/json\/lib\/json.dart\" rel=\"noopener noreferrer nofollow\">\u0435\u0433\u043e \u043a\u043e\u0434<\/a>. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u043c\u0443 \u044f \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u00a0\u043d\u0435\u0433\u043e.<\/p>\n<h3>Args<\/h3>\n<p>\u042d\u0442\u043e \u043c\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u00a0\u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pub.dev\/packages\/args\" rel=\"noopener noreferrer nofollow\">args<\/a>:<\/p>\n<pre><code class=\"dart\">import 'package:args\/args.dart';  void main(List&lt;String> argv) {   final parser = ArgParser();   parser.addOption('name');   final results = parser.parse(argv);   print('Hello, ' + results.option('name')); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/p>\n<pre><code>dart run main.dart --name=Alexey<\/code><\/pre>\n<p>\u0422\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442:<\/p>\n<pre><code>Hello, Alexey<\/code><\/pre>\n<p>\u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u0442\u043e \u044d\u0442\u043e \u0433\u0440\u044f\u0437\u043d\u043e. \u0412\u00a0\u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f. \u041d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e\u00a0\u0432\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0438\u0445 \u0432\u00a0\u043a\u043e\u0434\u0435. \u0418\u0445 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b <a href=\"https:\/\/pub.dev\/packages\/args_macro\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043a\u0440\u043e\u0441 <\/a><code>Args<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u0434\u0430\u0451\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<pre><code class=\"dart\">import 'package:args_macro\/args_macro.dart';  @Args() class HelloArgs {   String name;   int count = 1; }  void main(List&lt;String> argv) {   final parser = HelloArgsParser(); \/\/ \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0430\u0440\u0441\u0435\u0440\u0430.   final HelloArgs args = parser.parse(argv);    for (int n = 0; n &lt; args.count; n++)     print('Hello, ${args.name}!'); }<\/code><\/pre>\n<p>\u042f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438 \u043a\u0430\u043a\u00a0\u044f \u0435\u0433\u043e \u0434\u0435\u043b\u0430\u043b \u0432\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0451:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u0432\u00a0Telegram: <a href=\"https:\/\/t.me\/ainkin_com\" rel=\"noopener noreferrer nofollow\">ainkin_com<\/a><\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0439 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u043a\u0430\u043d\u0430\u043b (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u0440\u0435\u0436\u0435 \u0438 \u0441\u00a0\u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439): <a href=\"https:\/\/t.me\/ainkin_com_ru\" rel=\"noopener noreferrer nofollow\">ainkin_com_ru<\/a><\/p>\n<\/li>\n<li>\n<p>Twitter: <a href=\"https:\/\/x.com\/AlexeyInkin\" rel=\"noopener noreferrer nofollow\">https:\/\/x.com\/AlexeyInkin<\/a><\/p>\n<\/li>\n<li>\n<p>LinkedIn: <a href=\"https:\/\/www.linkedin.com\/in\/alexey-inkin\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.linkedin.com\/in\/alexey\u2011inkin\/<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/821911\/\"> https:\/\/habr.com\/ru\/articles\/821911\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-378926","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/378926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=378926"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/378926\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=378926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=378926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=378926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}