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