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