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