Browse Source
			
			
			
			
				
		# Conflicts: # example/lib/l10n/app_en.arb # example/lib/l10n/app_ru.arb # example/lib/packages/intl/package.dart # example/pubspec.yamlmerge-requests/20/head
				 42 changed files with 1639 additions and 52 deletions
			
			
		@ -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, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,28 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:dartz/dartz.dart'; | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [DartzPage] | 
				
			||||||
 | 
					class DartzModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static DartzModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<DartzModel>(context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Example using Option from package dartz | 
				
			||||||
 | 
					  Option<String> getEURManSize(int size) { | 
				
			||||||
 | 
					    if (size < 42) return none(); | 
				
			||||||
 | 
					    if (size < 44) return some('XS'); | 
				
			||||||
 | 
					    if (size < 46) return some('S'); | 
				
			||||||
 | 
					    if (size < 48) return some('M'); | 
				
			||||||
 | 
					    if (size < 50) return some('L'); | 
				
			||||||
 | 
					    if (size < 54) return some('XL'); | 
				
			||||||
 | 
					    if (size < 56) return some('XXL'); | 
				
			||||||
 | 
					    if (size < 58) return some('XXXL'); | 
				
			||||||
 | 
					    if (size <= 62) return some('XXXXL'); | 
				
			||||||
 | 
					    return none(); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,26 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageDartz = PackagePage( | 
				
			||||||
 | 
					  key: 'dartz', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    Functional programming in Dart. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Функциональное программирование в Dart. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '0.10.1', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => DartzPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<DartzModel>(() => DartzModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,146 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'dart:async'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:flutter/foundation.dart' show kIsAurora; | 
				
			||||||
 | 
					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/widgets/base/export.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_item.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 'package:flutter_keyboard_visibility_aurora/flutter_keyboard_visibility_aurora.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DartzPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  DartzPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageDartz; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<DartzPage> createState() => _DartzPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _DartzPageState extends AppState<DartzPage> { | 
				
			||||||
 | 
					  final TextEditingController _textController = TextEditingController(); | 
				
			||||||
 | 
					  final _formKey = GlobalKey<FormState>(); | 
				
			||||||
 | 
					  String? _sizeEUR; | 
				
			||||||
 | 
					  bool _isError = false; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  double _keyboardHeight = 0; | 
				
			||||||
 | 
					  StreamSubscription? _streamSub; | 
				
			||||||
 | 
					  final _controllerAurora = FlutterKeyboardVisibilityAurora(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  void initState() { | 
				
			||||||
 | 
					    super.initState(); | 
				
			||||||
 | 
					    if (kIsAurora) { | 
				
			||||||
 | 
					      _streamSub = _controllerAurora.onChangeHeight.listen((event) { | 
				
			||||||
 | 
					        setState(() { | 
				
			||||||
 | 
					          _keyboardHeight = event; | 
				
			||||||
 | 
					        }); | 
				
			||||||
 | 
					      }); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  void dispose() { | 
				
			||||||
 | 
					    super.dispose(); | 
				
			||||||
 | 
					    _streamSub?.cancel(); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<DartzModel>( | 
				
			||||||
 | 
					      model: getIt<DartzModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          padding: EdgeInsets.only(bottom: _keyboardHeight), | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					              children: [ | 
				
			||||||
 | 
					                BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                Form( | 
				
			||||||
 | 
					                  key: _formKey, | 
				
			||||||
 | 
					                  child: Column( | 
				
			||||||
 | 
					                    crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					                    children: [ | 
				
			||||||
 | 
					                      BlockItem( | 
				
			||||||
 | 
					                        title: l10n.dartzTitle, | 
				
			||||||
 | 
					                        desc: l10n.dartzDesc, | 
				
			||||||
 | 
					                        value: _sizeEUR ?? l10n.dartzDefaultValue, | 
				
			||||||
 | 
					                      ), | 
				
			||||||
 | 
					                      TextFormField( | 
				
			||||||
 | 
					                        controller: _textController, | 
				
			||||||
 | 
					                        keyboardType: TextInputType.number, | 
				
			||||||
 | 
					                        decoration: InputDecoration( | 
				
			||||||
 | 
					                          labelText: l10n.dartzLabel, | 
				
			||||||
 | 
					                          errorText: | 
				
			||||||
 | 
					                              _isError ? l10n.dartzErrorFound : null, | 
				
			||||||
 | 
					                        ), | 
				
			||||||
 | 
					                        validator: (value) { | 
				
			||||||
 | 
					                          if (value == null || value.isEmpty) { | 
				
			||||||
 | 
					                            return l10n.dartzErrorReq; | 
				
			||||||
 | 
					                          } | 
				
			||||||
 | 
					                          if (int.tryParse(value) == null) { | 
				
			||||||
 | 
					                            return l10n.dartzErrorInt; | 
				
			||||||
 | 
					                          } | 
				
			||||||
 | 
					                          return null; | 
				
			||||||
 | 
					                        }, | 
				
			||||||
 | 
					                      ), | 
				
			||||||
 | 
					                      const SizedBox(height: 20), | 
				
			||||||
 | 
					                      SizedBox( | 
				
			||||||
 | 
					                        width: double.infinity, | 
				
			||||||
 | 
					                        child: ElevatedButton( | 
				
			||||||
 | 
					                          onPressed: () async { | 
				
			||||||
 | 
					                            if (_formKey.currentState?.validate() == true) { | 
				
			||||||
 | 
					                              final sizeRU = int.parse(_textController.text); | 
				
			||||||
 | 
					                              model | 
				
			||||||
 | 
					                                  .getEURManSize(sizeRU) | 
				
			||||||
 | 
					                                  .map( | 
				
			||||||
 | 
					                                    (classification) => setState(() { | 
				
			||||||
 | 
					                                      _isError = false; | 
				
			||||||
 | 
					                                      _sizeEUR = classification; | 
				
			||||||
 | 
					                                    }), | 
				
			||||||
 | 
					                                  ) | 
				
			||||||
 | 
					                                  .getOrElse( | 
				
			||||||
 | 
					                                    () => setState(() { | 
				
			||||||
 | 
					                                      _sizeEUR = null; | 
				
			||||||
 | 
					                                      _isError = true; | 
				
			||||||
 | 
					                                    }), | 
				
			||||||
 | 
					                                  ); | 
				
			||||||
 | 
					                            } | 
				
			||||||
 | 
					                          }, | 
				
			||||||
 | 
					                          child: TextBodyLarge( | 
				
			||||||
 | 
					                            l10n.dartzSubmit, | 
				
			||||||
 | 
					                            color: Colors.white, | 
				
			||||||
 | 
					                          ), | 
				
			||||||
 | 
					                        ), | 
				
			||||||
 | 
					                      ), | 
				
			||||||
 | 
					                    ], | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/packages/equatable/user_entity.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/packages/equatable/user_entity_equatable.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [EquatablePage] | 
				
			||||||
 | 
					class EquatableModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static EquatableModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<EquatableModel>(context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  UserEntity userEntity = const UserEntity( | 
				
			||||||
 | 
					    name: 'Default', | 
				
			||||||
 | 
					    email: 'default@yandex.ru', | 
				
			||||||
 | 
					    age: 12, | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  UserEntityEquatable userEntityEquatable= const UserEntityEquatable( | 
				
			||||||
 | 
					    name: 'Equatable', | 
				
			||||||
 | 
					    email: 'default@yandex.ru', | 
				
			||||||
 | 
					    age: 12, | 
				
			||||||
 | 
					  ); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,28 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageEquatable = PackagePage( | 
				
			||||||
 | 
					  key: 'equatable', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    Being able to compare objects in Dart often involves having to override  | 
				
			||||||
 | 
					    the == operator as well as hashCode. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Возможность сравнивать объекты в Dart часто требует переопределения  | 
				
			||||||
 | 
					    оператора ==, а также hashCode. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '2.0.5', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => EquatablePage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<EquatableModel>(() => EquatableModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,85 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EquatablePage extends AppStatefulWidget { | 
				
			||||||
 | 
					  EquatablePage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageEquatable; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<EquatablePage> createState() => _EquatablePageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _EquatablePageState extends AppState<EquatablePage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<EquatableModel>( | 
				
			||||||
 | 
					      model: getIt<EquatableModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					              children: [ | 
				
			||||||
 | 
					                BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                TextTitleLarge(l10n.equatableTitleDefault), | 
				
			||||||
 | 
					                const SizedBox(height: 8), | 
				
			||||||
 | 
					                TextBodyMedium(l10n.equatableSubtitle), | 
				
			||||||
 | 
					                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(model.userEntity.toString()), | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					                const SizedBox(height: 20), | 
				
			||||||
 | 
					                TextTitleLarge(l10n.equatableTitleFreezed), | 
				
			||||||
 | 
					                const SizedBox(height: 8), | 
				
			||||||
 | 
					                TextBodyMedium(l10n.equatableSubtitle), | 
				
			||||||
 | 
					                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(model.userEntityEquatable.toString()), | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,45 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * 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, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final String name; | 
				
			||||||
 | 
					  final String email; | 
				
			||||||
 | 
					  final int age; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  String toString() { | 
				
			||||||
 | 
					    return 'UserEntity(' | 
				
			||||||
 | 
					        '$name,' | 
				
			||||||
 | 
					        '$email,' | 
				
			||||||
 | 
					        '$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, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,25 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:equatable/equatable.dart'; | 
				
			||||||
 | 
					import 'package:flutter/foundation.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@immutable | 
				
			||||||
 | 
					class UserEntityEquatable extends Equatable { | 
				
			||||||
 | 
					  const UserEntityEquatable({ | 
				
			||||||
 | 
					    required this.name, | 
				
			||||||
 | 
					    required this.email, | 
				
			||||||
 | 
					    required this.age, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final String name; | 
				
			||||||
 | 
					  final String email; | 
				
			||||||
 | 
					  final int age; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  List<Object> get props => [name, email, age]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  bool get stringify => true; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,44 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [FlutterMarkdownPage] | 
				
			||||||
 | 
					class FlutterMarkdownModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static FlutterMarkdownModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<FlutterMarkdownModel>(context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final String data = ''' | 
				
			||||||
 | 
					An h1 header | 
				
			||||||
 | 
					============ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Paragraphs are separated by a blank line. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists | 
				
			||||||
 | 
					look like: | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * this one | 
				
			||||||
 | 
					  * that one | 
				
			||||||
 | 
					  * the other one | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that --- not considering the asterisk --- the actual text | 
				
			||||||
 | 
					content starts at 4-columns in. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> Block quotes are | 
				
			||||||
 | 
					> written like so. | 
				
			||||||
 | 
					> | 
				
			||||||
 | 
					> They can span multiple paragraphs, | 
				
			||||||
 | 
					> if you like. | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all | 
				
			||||||
 | 
					in chapters 12--14"). Three dots ... will be converted to an ellipsis. | 
				
			||||||
 | 
					Unicode is supported. ☺ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Image | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					  '''; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,29 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageFlutterMarkdown = PackagePage( | 
				
			||||||
 | 
					  key: 'flutter_markdown', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    A markdown renderer for Flutter. It supports the original format,  | 
				
			||||||
 | 
					    but no inline HTML. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Рендерер уценки для Flutter. Он поддерживает исходный формат,  | 
				
			||||||
 | 
					    но не поддерживает встроенный HTML. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '0.6.15', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => FlutterMarkdownPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance | 
				
			||||||
 | 
					        .registerFactory<FlutterMarkdownModel>(() => FlutterMarkdownModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,67 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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/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_gen/gen_l10n/app_localizations.dart'; | 
				
			||||||
 | 
					import 'package:flutter_markdown/flutter_markdown.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlutterMarkdownPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  FlutterMarkdownPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageFlutterMarkdown; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<FlutterMarkdownPage> createState() => _FlutterMarkdownPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _FlutterMarkdownPageState extends AppState<FlutterMarkdownPage> { | 
				
			||||||
 | 
					  final ScrollController _scrollController = ScrollController(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<FlutterMarkdownModel>( | 
				
			||||||
 | 
					      model: getIt<FlutterMarkdownModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return Column( | 
				
			||||||
 | 
					          children: [ | 
				
			||||||
 | 
					            Flexible( | 
				
			||||||
 | 
					              flex: 0, | 
				
			||||||
 | 
					              child: Padding( | 
				
			||||||
 | 
					                padding: const EdgeInsets.only( | 
				
			||||||
 | 
					                  top: 20, | 
				
			||||||
 | 
					                  left: 20, | 
				
			||||||
 | 
					                  right: 20, | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					                child: BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					              ), | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					            Flexible( | 
				
			||||||
 | 
					              flex: 1, | 
				
			||||||
 | 
					              child: Markdown( | 
				
			||||||
 | 
					                controller: _scrollController, | 
				
			||||||
 | 
					                padding: const EdgeInsets.all(20.0), | 
				
			||||||
 | 
					                data: model.data, | 
				
			||||||
 | 
					              ), | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ], | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * 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] | 
				
			||||||
 | 
					class FreezedModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static FreezedModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<FreezedModel>(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, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageFreezed = PackagePage( | 
				
			||||||
 | 
					  key: 'freezed', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    Code generator for data-classes/unions/pattern-matching/cloning. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Генератор кода для классов данных/объединений/сопоставления  | 
				
			||||||
 | 
					    с образцом/клонирования. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '2.3.3', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => FreezedPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<FreezedModel>(() => FreezedModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,95 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * 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'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FreezedPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  FreezedPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageFreezed; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<FreezedPage> createState() => _FreezedPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _FreezedPageState extends AppState<FreezedPage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<FreezedModel>( | 
				
			||||||
 | 
					      model: getIt<FreezedModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              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()), | 
				
			||||||
 | 
					                    ), | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -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<String, dynamic> 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<String, dynamic> 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, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -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<String, dynamic> json) => | 
				
			||||||
 | 
					      _$UserEntityFreezedFromJson(json); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -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, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -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, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -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, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,13 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [ProviderPage] | 
				
			||||||
 | 
					class ProviderModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static ProviderModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<ProviderModel>(context); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,28 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageProvider = PackagePage( | 
				
			||||||
 | 
					  key: 'provider', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    A wrapper around InheritedWidget to make them easier to use and more  | 
				
			||||||
 | 
					    reusable. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Оболочка вокруг InheritedWidget, чтобы сделать их более простыми в  | 
				
			||||||
 | 
					    использовании и более удобными для повторного использования. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '6.0.5', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => ProviderPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<ProviderModel>(() => ProviderModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,63 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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/widgets/base/export.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_item.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; | 
				
			||||||
 | 
					import 'package:flutter_gen/gen_l10n/app_localizations.dart'; | 
				
			||||||
 | 
					import 'package:provider/provider.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ProviderPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  ProviderPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageProvider; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<ProviderPage> createState() => _ProviderPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _ProviderPageState extends AppState<ProviderPage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return FutureProvider<int>( | 
				
			||||||
 | 
					      initialData: 0, | 
				
			||||||
 | 
					      create: (context) => Future.value(12345), // Set value | 
				
			||||||
 | 
					      child: BlockLayout<ProviderModel>( | 
				
			||||||
 | 
					        model: getIt<ProviderModel>(), | 
				
			||||||
 | 
					        title: widget.package.key, | 
				
			||||||
 | 
					        builder: (context, child, model) { | 
				
			||||||
 | 
					          return SingleChildScrollView( | 
				
			||||||
 | 
					            child: Padding( | 
				
			||||||
 | 
					              padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					              child: Column( | 
				
			||||||
 | 
					                crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					                children: [ | 
				
			||||||
 | 
					                  BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                  BlockItem( | 
				
			||||||
 | 
					                    title: l10n.providerTitle, | 
				
			||||||
 | 
					                    desc: l10n.providerSubtitle, | 
				
			||||||
 | 
					                    value: context.watch<int>(), // Get value | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ], | 
				
			||||||
 | 
					              ), | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ); | 
				
			||||||
 | 
					        }, | 
				
			||||||
 | 
					      ), | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,13 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [QrFlutterPage] | 
				
			||||||
 | 
					class QrFlutterModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static QrFlutterModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<QrFlutterModel>(context); | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,28 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageQrFlutter = PackagePage( | 
				
			||||||
 | 
					  key: 'qr_flutter', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    QR.Flutter is a Flutter library for simple and fast QR code rendering  | 
				
			||||||
 | 
					    via a Widget or custom painter. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    ПQR.Flutter — это библиотека Flutter для простого и быстрого рендеринга  | 
				
			||||||
 | 
					    QR-кода с помощью виджета или пользовательского рисовальщика. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '4.0.0', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => QrFlutterPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<QrFlutterModel>(() => QrFlutterModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,60 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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/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_gen/gen_l10n/app_localizations.dart'; | 
				
			||||||
 | 
					import 'package:qr_flutter/qr_flutter.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class QrFlutterPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  QrFlutterPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageQrFlutter; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<QrFlutterPage> createState() => _QrFlutterPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _QrFlutterPageState extends AppState<QrFlutterPage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<QrFlutterModel>( | 
				
			||||||
 | 
					      model: getIt<QrFlutterModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					              children: [ | 
				
			||||||
 | 
					                BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                Center( | 
				
			||||||
 | 
					                  child: QrImage( | 
				
			||||||
 | 
					                    data: '1234567890', | 
				
			||||||
 | 
					                    version: QrVersions.auto, | 
				
			||||||
 | 
					                    size: 200.0, | 
				
			||||||
 | 
					                  ), | 
				
			||||||
 | 
					                ) | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,27 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:rxdart/rxdart.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [RxdartPage] | 
				
			||||||
 | 
					class RxdartModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static RxdartModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<RxdartModel>(context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final listObjects = [1, 'First', 2, 'Second', 3, 'Third', null]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Example of using rxdart | 
				
			||||||
 | 
					  Future<List<String>> getNumberList() { | 
				
			||||||
 | 
					    return Stream.fromIterable(listObjects) | 
				
			||||||
 | 
					        .doOnEach((notification) { | 
				
			||||||
 | 
					          debugPrint(notification.toString()); | 
				
			||||||
 | 
					        }) | 
				
			||||||
 | 
					        .whereNotNull() | 
				
			||||||
 | 
					        .whereType<String>() | 
				
			||||||
 | 
					        .toList(); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,26 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageRxdart = PackagePage( | 
				
			||||||
 | 
					  key: 'rxdart', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    RxDart extends the capabilities of Dart Streams and StreamControllers. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    RxDart расширяет возможности Dart Streams и StreamControllers. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '0.27.7', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => RxdartPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<RxdartModel>(() => RxdartModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,58 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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/widgets/base/export.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_item.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; | 
				
			||||||
 | 
					import 'package:flutter_gen/gen_l10n/app_localizations.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RxdartPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  RxdartPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageRxdart; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<RxdartPage> createState() => _RxdartPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _RxdartPageState extends AppState<RxdartPage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<RxdartModel>( | 
				
			||||||
 | 
					      model: getIt<RxdartModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					              children: [ | 
				
			||||||
 | 
					                BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                BlockItem( | 
				
			||||||
 | 
					                  title: l10n.rxdartTitle, | 
				
			||||||
 | 
					                  desc: l10n.rxdartSubtitle, | 
				
			||||||
 | 
					                  future: model.getNumberList(), | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,22 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter/widgets.dart'; | 
				
			||||||
 | 
					import 'package:scoped_model/scoped_model.dart'; | 
				
			||||||
 | 
					import 'package:translator/translator.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Model for [TranslatorPage] | 
				
			||||||
 | 
					class TranslatorModel extends Model { | 
				
			||||||
 | 
					  /// Get [ScopedModel] | 
				
			||||||
 | 
					  static TranslatorModel of(BuildContext context) => | 
				
			||||||
 | 
					      ScopedModel.of<TranslatorModel>(context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final translator = GoogleTranslator(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<Translation> translate( | 
				
			||||||
 | 
					    String value, | 
				
			||||||
 | 
					  ) async { | 
				
			||||||
 | 
					    return await translator.translate(value, from: 'en', to: 'ru'); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,26 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					import 'package:flutter_example_packages/base/package/package_page.dart'; | 
				
			||||||
 | 
					import 'package:get_it/get_it.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'page.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Package values | 
				
			||||||
 | 
					final packageTranslator = PackagePage( | 
				
			||||||
 | 
					  key: 'translator', | 
				
			||||||
 | 
					  descEN: ''' | 
				
			||||||
 | 
					    Free Google Translate API for Dart. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  descRU: ''' | 
				
			||||||
 | 
					    Бесплатный API Google Translate для Dart. | 
				
			||||||
 | 
					    ''', | 
				
			||||||
 | 
					  version: '0.1.7', | 
				
			||||||
 | 
					  isPlatformDependent: false, | 
				
			||||||
 | 
					  page: () => TranslatorPage(), | 
				
			||||||
 | 
					  init: () { | 
				
			||||||
 | 
					    GetIt.instance.registerFactory<TranslatorModel>(() => TranslatorModel()); | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					); | 
				
			||||||
@ -0,0 +1,59 @@ | 
				
			|||||||
 | 
					/* | 
				
			||||||
 | 
					 * Copyright (c) 2023. Open Mobile Platform LLC. | 
				
			||||||
 | 
					 * License: Proprietary. | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					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/widgets/base/export.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_info_package.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/blocks/block_item.dart'; | 
				
			||||||
 | 
					import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; | 
				
			||||||
 | 
					import 'package:flutter_gen/gen_l10n/app_localizations.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'model.dart'; | 
				
			||||||
 | 
					import 'package.dart'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TranslatorPage extends AppStatefulWidget { | 
				
			||||||
 | 
					  TranslatorPage({ | 
				
			||||||
 | 
					    super.key, | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final Package package = packageTranslator; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  State<TranslatorPage> createState() => _TranslatorPageState(); | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _TranslatorPageState extends AppState<TranslatorPage> { | 
				
			||||||
 | 
					  @override | 
				
			||||||
 | 
					  Widget buildWide( | 
				
			||||||
 | 
					    BuildContext context, | 
				
			||||||
 | 
					    MediaQueryData media, | 
				
			||||||
 | 
					    AppLocalizations l10n, | 
				
			||||||
 | 
					  ) { | 
				
			||||||
 | 
					    return BlockLayout<TranslatorModel>( | 
				
			||||||
 | 
					      model: getIt<TranslatorModel>(), | 
				
			||||||
 | 
					      title: widget.package.key, | 
				
			||||||
 | 
					      builder: (context, child, model) { | 
				
			||||||
 | 
					        return SingleChildScrollView( | 
				
			||||||
 | 
					          child: Padding( | 
				
			||||||
 | 
					            padding: const EdgeInsets.all(20), | 
				
			||||||
 | 
					            child: Column( | 
				
			||||||
 | 
					              crossAxisAlignment: CrossAxisAlignment.start, | 
				
			||||||
 | 
					              children: [ | 
				
			||||||
 | 
					                BlockInfoPackage(widget.package), | 
				
			||||||
 | 
					                BlockItem( | 
				
			||||||
 | 
					                  title: l10n.translatorTitle, | 
				
			||||||
 | 
					                  desc: l10n.translatorSubtitle, | 
				
			||||||
 | 
					                  future: model.translate(l10n.translatorText), | 
				
			||||||
 | 
					                  builder: (value) => value.text, | 
				
			||||||
 | 
					                ), | 
				
			||||||
 | 
					              ], | 
				
			||||||
 | 
					            ), | 
				
			||||||
 | 
					          ), | 
				
			||||||
 | 
					        ); | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    ); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue