diff --git a/example/.gitignore b/example/.gitignore index 3db3823..bf6a5bc 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -45,3 +45,7 @@ app.*.map.json # Aurora generated /aurora/flutter + +# Dart generated +*.g.dart +*.freezed.dart diff --git a/example/lib/l10n/app_en.arb b/example/lib/l10n/app_en.arb index bd7d8a8..a51d44c 100644 --- a/example/lib/l10n/app_en.arb +++ b/example/lib/l10n/app_en.arb @@ -1,4 +1,9 @@ { + "@_FREEZED": {}, + "freezedTitleDefault": "It's default class, 74 of lines", + "freezedTitleFreezed": "It's freezed class, 21 of lines", + "freezedSubtitle": "Methods: fromJson, copyWith, toJson, toString, operator ==, hashCode.", + "@_DARTZ": {}, "dartzTitle": "Convert size", "dartzDesc": "Convert the size grid of Russia to the size grid of Europe.", diff --git a/example/lib/l10n/app_ru.arb b/example/lib/l10n/app_ru.arb index 258d113..cde7dd7 100644 --- a/example/lib/l10n/app_ru.arb +++ b/example/lib/l10n/app_ru.arb @@ -1,4 +1,9 @@ { + "@_FREEZED": {}, + "freezedTitleDefault": "Класс по умолчанию, 74 строки", + "freezedTitleFreezed": "Класс c freezed, 21 строка", + "freezedSubtitle": "Методы: fromJson, copyWith, toJson, toString, operator ==, hashCode.", + "@_DARTZ": {}, "dartzTitle": "Преобразовать размер", "dartzDesc": "Преобразовать размерную сетку России в размерную сетку Европы.", diff --git a/example/lib/packages/build_runner/package.dart b/example/lib/packages/build_runner/package.dart new file mode 100644 index 0000000..942b083 --- /dev/null +++ b/example/lib/packages/build_runner/package.dart @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageBuildRunner = PackageDialog( + key: 'build_runner', + descEN: ''' + The build_runner package provides a concrete way of generating files using + Dart code. Files are always generated directly on disk, and rebuilds + are incremental - inspired by tools such as Bazel. + ''', + descRU: ''' + Пакет build_runner предоставляет конкретный способ создания файлов с + использованием кода Dart. Файлы всегда генерируются непосредственно на + диске и перестраиваются являются инкрементными — вдохновлены такими + инструментами, как Bazel. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '2.3.3', + isPlatformDependent: false, +); diff --git a/example/lib/packages/freezed/model.dart b/example/lib/packages/freezed/model.dart index 98718c5..c431b93 100644 --- a/example/lib/packages/freezed/model.dart +++ b/example/lib/packages/freezed/model.dart @@ -3,6 +3,8 @@ * License: Proprietary. */ import 'package:flutter/widgets.dart'; +import 'package:flutter_example_packages/packages/freezed/user_entity.dart'; +import 'package:flutter_example_packages/packages/freezed/user_entity_freezed.dart'; import 'package:scoped_model/scoped_model.dart'; /// Model for [FreezedPage] @@ -10,4 +12,16 @@ class FreezedModel extends Model { /// Get [ScopedModel] static FreezedModel of(BuildContext context) => ScopedModel.of(context); + + UserEntity userEntity = UserEntity.fromJson(const { + 'name': 'Default', + 'email': 'default@yandex.ru', + 'age': 12, + }); + + UserEntityFreezed userEntityFreezed = UserEntityFreezed.fromJson(const { + 'name': 'Default', + 'email': 'default@yandex.ru', + 'age': 12, + }); } diff --git a/example/lib/packages/freezed/page.dart b/example/lib/packages/freezed/page.dart index 0ae75ae..3177f78 100644 --- a/example/lib/packages/freezed/page.dart +++ b/example/lib/packages/freezed/page.dart @@ -2,12 +2,16 @@ * Copyright (c) 2023. Open Mobile Platform LLC. * License: Proprietary. */ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_example_packages/base/di/app_di.dart'; import 'package:flutter_example_packages/base/package/package.dart'; +import 'package:flutter_example_packages/theme/radius.dart'; import 'package:flutter_example_packages/widgets/base/export.dart'; import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; +import 'package:flutter_example_packages/widgets/texts/export.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'model.dart'; @@ -42,6 +46,45 @@ class _FreezedPageState extends AppState { crossAxisAlignment: CrossAxisAlignment.start, children: [ BlockInfoPackage(widget.package), + TextTitleLarge(l10n.freezedTitleDefault), + const SizedBox(height: 8), + TextBodyMedium(l10n.freezedSubtitle), + const SizedBox(height: 14), + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.blue.shade50, + borderRadius: AppRadius.small, + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: TextBodyMedium( + const JsonEncoder.withIndent(' ').convert( + model.userEntity.copyWith(name: 'My name').toJson()), + ), + ), + ), + const SizedBox(height: 20), + TextTitleLarge(l10n.freezedTitleFreezed), + const SizedBox(height: 8), + TextBodyMedium(l10n.freezedSubtitle), + const SizedBox(height: 14), + Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.blue.shade50, + borderRadius: AppRadius.small, + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: TextBodyMedium( + const JsonEncoder.withIndent(' ').convert(model + .userEntityFreezed + .copyWith(name: 'My name') + .toJson()), + ), + ), + ), ], ), ), diff --git a/example/lib/packages/freezed/user_entity.dart b/example/lib/packages/freezed/user_entity.dart new file mode 100644 index 0000000..d852223 --- /dev/null +++ b/example/lib/packages/freezed/user_entity.dart @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:flutter/foundation.dart'; + +@immutable +class UserEntity { + const UserEntity({ + required this.name, + required this.email, + required this.age, + }); + + factory UserEntity.fromJson(Map json) { + return UserEntity( + name: json['name'] as String, + email: json['email'] as String, + age: json['age'] as int, + ); + } + + final String name; + final String email; + final int age; + + UserEntity copyWith({ + String? name, + String? email, + int? age, + }) { + return UserEntity( + name: name ?? this.name, + email: email ?? this.email, + age: age ?? this.age, + ); + } + + Map toJson() { + return { + 'name': name, + 'email': email, + 'age': age, + }; + } + + @override + String toString() { + return 'UserEntity(' + 'name: $name' + 'email: $email' + 'age: $age' + ')'; + } + + @override + bool operator ==(dynamic other) { + return other is UserEntity && + other.name == name && + other.email == email && + other.age == age; + } + + @override + int get hashCode { + return Object.hash( + runtimeType, + name, + email, + age, + ); + } +} diff --git a/example/lib/packages/freezed/user_entity_freezed.dart b/example/lib/packages/freezed/user_entity_freezed.dart new file mode 100644 index 0000000..7dd2917 --- /dev/null +++ b/example/lib/packages/freezed/user_entity_freezed.dart @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'user_entity_freezed.freezed.dart'; +part 'user_entity_freezed.g.dart'; + +@freezed +class UserEntityFreezed with _$UserEntityFreezed { + const factory UserEntityFreezed({ + required String name, + required String email, + required int age, + }) = _UserEntityFreezed; + + factory UserEntityFreezed.fromJson(Map json) => + _$UserEntityFreezedFromJson(json); +} diff --git a/example/lib/packages/freezed_annotation/package.dart b/example/lib/packages/freezed_annotation/package.dart new file mode 100644 index 0000000..7fbc8cd --- /dev/null +++ b/example/lib/packages/freezed_annotation/package.dart @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageFreezedAnnotation = PackageDialog( + key: 'freezed_annotation', + descEN: ''' + Annotations for freezed. This package does nothing without freezed. + ''', + descRU: ''' + Аннотации для freezed. Этот пакет ничего не делает без freezed. + ''', + messageEN: ''' + This is a platform independent plugin used in this application in the demo + of the freezed plugin. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении в + демострации работы плагина freezed. + ''', + version: '2.2.0', + isPlatformDependent: false, +); diff --git a/example/lib/packages/intl/package.dart b/example/lib/packages/intl/package.dart index 6f88cbf..92e801a 100644 --- a/example/lib/packages/intl/package.dart +++ b/example/lib/packages/intl/package.dart @@ -18,13 +18,13 @@ final packageIntl = PackageDialog( форматирование и разбор даты/числа, а также двунаправленный текст. ''', messageEN: ''' - This is a platform independent plugin used in this app, should work - for you too. - ''', + This is a platform independent plugin used in this app, should work + for you too. + ''', messageRU: ''' - Это плагин независимый от платформы, используется в этом приложении, - должен работать и у вас. - ''', + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', version: '0.17.0', isPlatformDependent: false, ); diff --git a/example/lib/packages/json_annotation/package.dart b/example/lib/packages/json_annotation/package.dart new file mode 100644 index 0000000..28eeecc --- /dev/null +++ b/example/lib/packages/json_annotation/package.dart @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageJsonAnnotation = PackageDialog( + key: 'json_annotation', + descEN: ''' + Defines the annotations used by json_serializable to create code for + JSON serialization and deserialization. + ''', + descRU: ''' + Определяет аннотации, используемые json_serializable для создания кода для + JSON Serialization и Deserialization. + ''', + messageEN: ''' + This is a platform independent plugin used in this application in the demo + of the freezed plugin. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении в + демострации работы плагина freezed. + ''', + version: '4.8.0', + isPlatformDependent: false, +); diff --git a/example/lib/packages/json_serializable/package.dart b/example/lib/packages/json_serializable/package.dart new file mode 100644 index 0000000..bbd0ab5 --- /dev/null +++ b/example/lib/packages/json_serializable/package.dart @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2023. Open Mobile Platform LLC. + * License: Proprietary. + */ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageJsonSerializable = PackageDialog( + key: 'json_serializable', + descEN: ''' + Provides Dart Build System builders for handling JSON. + ''', + descRU: ''' + Предоставляет Dart Build System System для обработки JSON. + ''', + messageEN: ''' + This is a platform independent plugin used in this application in the demo + of the freezed plugin. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении в + демострации работы плагина freezed. + ''', + version: '6.6.1', + isPlatformDependent: false, +); diff --git a/example/lib/packages/packages.dart b/example/lib/packages/packages.dart index 4505280..8abef57 100644 --- a/example/lib/packages/packages.dart +++ b/example/lib/packages/packages.dart @@ -4,6 +4,7 @@ */ import 'package:flutter_example_packages/base/package/package.dart'; import 'package:flutter_example_packages/packages/battery_plus/package.dart'; +import 'package:flutter_example_packages/packages/build_runner/package.dart'; import 'package:flutter_example_packages/packages/cached_network_image/package.dart'; import 'package:flutter_example_packages/packages/cupertino_icons/package.dart'; import 'package:flutter_example_packages/packages/dartz/package.dart'; @@ -14,9 +15,12 @@ import 'package:flutter_example_packages/packages/flutter_local_notifications/pa import 'package:flutter_example_packages/packages/flutter_markdown/package.dart'; import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart'; import 'package:flutter_example_packages/packages/freezed/package.dart'; +import 'package:flutter_example_packages/packages/freezed_annotation/package.dart'; import 'package:flutter_example_packages/packages/get_it/package.dart'; import 'package:flutter_example_packages/packages/google_fonts/package.dart'; import 'package:flutter_example_packages/packages/intl/package.dart'; +import 'package:flutter_example_packages/packages/json_annotation/package.dart'; +import 'package:flutter_example_packages/packages/json_serializable/package.dart'; import 'package:flutter_example_packages/packages/package_info_plus/package.dart'; import 'package:flutter_example_packages/packages/path_provider/package.dart'; import 'package:flutter_example_packages/packages/photo_view/package.dart'; @@ -37,6 +41,7 @@ import 'flutter_keyboard_visibility/package.dart'; /// List app packages final packages = [ packageBatteryPlus, + packageBuildRunner, packageCachedNetworkImage, packageCrypto, packageCupertinoIcons, @@ -49,9 +54,12 @@ final packages = [ packageFlutterMarkdown, packageFlutterSecureStorage, packageFreezed, + packageFreezedAnnotation, packageGetIt, packageGoogleFonts, packageIntl, + packageJsonAnnotation, + packageJsonSerializable, packagePackageInfoPlus, packagePathProvider, packagePhotoView, diff --git a/example/pubspec.lock b/example/pubspec.lock index 86f1094..84df1d0 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -466,14 +466,14 @@ packages: source: sdk version: "0.0.0" freezed: - dependency: "direct main" + dependency: "direct dev" description: name: freezed url: "https://pub.dartlang.org" source: hosted version: "2.3.3" freezed_annotation: - dependency: transitive + dependency: "direct main" description: name: freezed_annotation url: "https://pub.dartlang.org" @@ -557,12 +557,19 @@ packages: source: hosted version: "0.6.4" json_annotation: - dependency: transitive + dependency: "direct main" description: name: json_annotation url: "https://pub.dartlang.org" source: hosted version: "4.8.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "6.6.1" lints: dependency: transitive description: @@ -896,6 +903,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.2" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.3" source_span: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index af63cbf..f881644 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -38,8 +38,6 @@ dependencies: photo_view: ^0.14.0 ## https://pub.dev/packages/dartz dartz: ^0.10.1 - ## https://pub.dev/packages/freezed - freezed: ^2.3.3 ## https://pub.dev/packages/provider provider: ^6.0.5 ## https://pub.dev/packages/equatable @@ -52,6 +50,10 @@ dependencies: translator: ^0.1.7 ## https://pub.dev/packages/flutter_markdown flutter_markdown: ^0.6.15 + ## https://pub.dev/packages/freezed_annotation + freezed_annotation: ^2.2.0 + ## https://pub.dev/packages/json_annotation + json_annotation: ^4.8.0 ## https://os-git.omprussia.ru/non-oss/flutter/flutter-plugins/-/tree/master/packages/xdga_directories xdga_directories: @@ -145,8 +147,14 @@ dev_dependencies: flutter_test: sdk: flutter + ## https://pub.dev/packages/flutter_lints @todo flutter_lints: ^2.0.0 + ## https://pub.dev/packages/build_runner build_runner: ^2.3.3 + ## https://pub.dev/packages/freezed + freezed: ^2.3.3 + ## https://pub.dev/packages/json_serializable + json_serializable: ^6.6.1 flutter: generate: true