Browse Source

[flutter_example_packages] Add filters, refactoring

merge-requests/21/head
Vitaliy Zarubin 2 years ago
parent
commit
b2dbcd2d08
  1. BIN
      example/assets/images/leading.png
  2. BIN
      example/aurora/icons/108x108.png
  3. BIN
      example/aurora/icons/128x128.png
  4. BIN
      example/aurora/icons/172x172.png
  5. BIN
      example/aurora/icons/86x86.png
  6. BIN
      example/data/raw/icon.png
  7. BIN
      example/data/raw/icon.xcf
  8. BIN
      example/data/raw/icon2.png
  9. 2
      example/lib/base/app/app.dart
  10. 18
      example/lib/l10n/app_en.arb
  11. 18
      example/lib/l10n/app_ru.arb
  12. 12
      example/lib/packages/battery_plus/page.dart
  13. 12
      example/lib/packages/cached_network_image/page.dart
  14. 24
      example/lib/packages/cupertino_icons/package.dart
  15. 12
      example/lib/packages/device_info_plus/page.dart
  16. 12
      example/lib/packages/flutter_cache_manager/page.dart
  17. 12
      example/lib/packages/flutter_local_notifications/page.dart
  18. 16
      example/lib/packages/flutter_secure_storage/page.dart
  19. 22
      example/lib/packages/google_fonts/package.dart
  20. 26
      example/lib/packages/intl/package.dart
  21. 12
      example/lib/packages/package_info_plus/page.dart
  22. 13
      example/lib/packages/packages.dart
  23. 12
      example/lib/packages/path_provider/page.dart
  24. 24
      example/lib/packages/scoped_model/package.dart
  25. 12
      example/lib/packages/shared_preferences/page.dart
  26. 20
      example/lib/packages/sqflite/package.dart
  27. 24
      example/lib/packages/universal_io/package.dart
  28. 12
      example/lib/packages/wakelock/page.dart
  29. 12
      example/lib/packages/xdga_directories/page.dart
  30. 251
      example/lib/pages/home/page.dart
  31. 153
      example/lib/pages/home/widgets/home_app_bar.dart
  32. 52
      example/lib/pages/home/widgets/package_info_dialog.dart
  33. 57
      example/lib/pages/home/widgets/package_list_item.dart
  34. 7
      example/lib/theme/colors.dart
  35. 18
      example/lib/theme/theme.dart
  36. 44
      example/lib/widgets/base/app_state.dart
  37. 5
      example/lib/widgets/base/app_stateful_widget.dart
  38. 21
      example/lib/widgets/base/app_stateless_widget.dart
  39. 5
      example/lib/widgets/base/export.dart
  40. 45
      example/lib/widgets/layouts/block_layout.dart
  41. 11
      example/lib/widgets/texts/export.dart
  42. 27
      example/lib/widgets/texts/text_base.dart
  43. 15
      example/lib/widgets/texts/text_body_large.dart
  44. 15
      example/lib/widgets/texts/text_body_medium.dart
  45. 15
      example/lib/widgets/texts/text_body_small.dart
  46. 15
      example/lib/widgets/texts/text_headline_large.dart
  47. 15
      example/lib/widgets/texts/text_headline_medium.dart
  48. 15
      example/lib/widgets/texts/text_headline_small.dart
  49. 15
      example/lib/widgets/texts/text_title_large.dart
  50. 15
      example/lib/widgets/texts/text_title_medium.dart
  51. 15
      example/lib/widgets/texts/text_title_small.dart
  52. 53
      example/pubspec.lock
  53. 8
      example/pubspec.yaml

BIN
example/assets/images/leading.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
example/aurora/icons/108x108.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
example/aurora/icons/128x128.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
example/aurora/icons/172x172.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
example/aurora/icons/86x86.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
example/data/raw/icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
example/data/raw/icon.xcf

Binary file not shown.

BIN
example/data/raw/icon2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

2
example/lib/base/app/app.dart

@ -34,7 +34,7 @@ class MyApp extends StatelessWidget {
builder: (context, child, model) => MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
title: 'Flutter Aurora OS',
debugShowCheckedModeBanner: false,
theme: appTheme,
initialRoute: '/',
routes: routes,

18
example/lib/l10n/app_en.arb

@ -1,7 +1,15 @@
{
"homePageTitle": "Flutter Aurora OS",
"homeWelcomeTitle": "Welcome!",
"homeWelcomeText": "In this application you can find 100500 Flutter plugins supporting Aurora OS. If it happens that something is missing for you, you can write to us or add it yourself.",
"homeWelcomeText": "In this application you can find {count} Flutter plugins supporting Aurora OS. If it happens that something is missing for you, you can write to us or add it yourself.",
"@homeWelcomeText": {
"placeholders": {
"count": {
"type": "int",
"example": "0"
}
}
},
"homeListStateDependent": "platform dependent",
"homeListStateIndependent": "platform independent",
"homeListVersion": "Version: {version}",
@ -12,5 +20,11 @@
"example": "1.0.0"
}
}
}
},
"homeSearchTitle": "Search...",
"homeSearch": "Search packages",
"homeFilter": "Filter",
"homeNotFoundTitle": "Not found",
"homeNotFoundSubtitle": "What you were looking for is not in the list of verified plugins, but this does not mean that it will not work, check it out and you may want to add it to this list of verified plugins.",
"commonClose": "Close"
}

18
example/lib/l10n/app_ru.arb

@ -1,7 +1,15 @@
{
"homePageTitle": "Flutter ОС Аврора",
"homeWelcomeTitle": "Приветствую!",
"homeWelcomeText": "В этом приложении вы можете найти 100500 плагинов Flutter, поддерживающих ОС Aurora. Если вдруг вам чего-то не хватает, вы можете написать нам или добавить самостоятельно.",
"homeWelcomeText": "В этом приложении вы можете найти {count} плагинов Flutter, поддерживающих ОС Aurora. Если вдруг вам чего-то не хватает, вы можете написать нам или добавить самостоятельно.",
"@homeWelcomeText": {
"placeholders": {
"count": {
"type": "int",
"example": "0"
}
}
},
"homeListStateDependent": "платформо-зависимый",
"homeListStateIndependent": "платформонезависимый",
"homeListVersion": "Версия: {version}",
@ -12,5 +20,11 @@
"example": "1.0.0"
}
}
}
},
"homeSearchTitle": "Поиск...",
"homeSearch": "Поиск пакетов",
"homeNotFoundTitle": "Не найдено",
"homeNotFoundSubtitle": "То что вы искали нет в списке провереных плагинов, но это не означает что он работать не будет, проверьте его и возможно вы захотите добавить его в этот список проверенных плагинов.",
"homeFilter": "Фильтр",
"commonClose": "Закрыть"
}

12
example/lib/packages/battery_plus/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/battery_plus/model.dart';
import 'package:flutter_example_packages/packages/battery_plus/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class BatteryPlusPage extends StatefulWidget {
class BatteryPlusPage extends AppStatefulWidget {
BatteryPlusPage({
super.key,
});
@ -15,9 +17,13 @@ class BatteryPlusPage extends StatefulWidget {
State<BatteryPlusPage> createState() => _BatteryPlusPageState();
}
class _BatteryPlusPageState extends State<BatteryPlusPage> {
class _BatteryPlusPageState extends AppState<BatteryPlusPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<BatteryPlusModel>(
title: widget.package.key,
builder: (context, child, model) {

12
example/lib/packages/cached_network_image/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/cached_network_image/model.dart';
import 'package:flutter_example_packages/packages/cached_network_image/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class CachedNetworkImagePage extends StatefulWidget {
class CachedNetworkImagePage extends AppStatefulWidget {
CachedNetworkImagePage({
super.key,
});
@ -15,9 +17,13 @@ class CachedNetworkImagePage extends StatefulWidget {
State<CachedNetworkImagePage> createState() => _CachedNetworkImagePageState();
}
class _CachedNetworkImagePageState extends State<CachedNetworkImagePage> {
class _CachedNetworkImagePageState extends AppState<CachedNetworkImagePage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<CachedNetworkImageModel>(
title: widget.package.key,
builder: (context, child, model) {

24
example/lib/packages/cupertino_icons/package.dart

@ -0,0 +1,24 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageCupertinoIcons = PackageDialog(
key: 'cupertino_icons',
descEN: '''
This is an asset repo containing the default set of icon assets
used by Flutter's Cupertino widgets.
''',
descRU: '''
Это репозиторий ресурсов, содержащий набор ресурсов значков по умолчанию
используется виджетами Flutter Cupertino.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '1.0.5',
isPlatformDependent: false,
);

12
example/lib/packages/device_info_plus/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/device_info_plus/model.dart';
import 'package:flutter_example_packages/packages/device_info_plus/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class DeviceInfoPlusPage extends StatefulWidget {
class DeviceInfoPlusPage extends AppStatefulWidget {
DeviceInfoPlusPage({
super.key,
});
@ -15,9 +17,13 @@ class DeviceInfoPlusPage extends StatefulWidget {
State<DeviceInfoPlusPage> createState() => _DeviceInfoPlusPageState();
}
class _DeviceInfoPlusPageState extends State<DeviceInfoPlusPage> {
class _DeviceInfoPlusPageState extends AppState<DeviceInfoPlusPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<DeviceInfoPlusModel>(
title: widget.package.key,
builder: (context, child, model) {

12
example/lib/packages/flutter_cache_manager/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/flutter_cache_manager/model.dart';
import 'package:flutter_example_packages/packages/flutter_cache_manager/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class FlutterCacheManagerPage extends StatefulWidget {
class FlutterCacheManagerPage extends AppStatefulWidget {
FlutterCacheManagerPage({
super.key,
});
@ -16,9 +18,13 @@ class FlutterCacheManagerPage extends StatefulWidget {
_FlutterCacheManagerPageState();
}
class _FlutterCacheManagerPageState extends State<FlutterCacheManagerPage> {
class _FlutterCacheManagerPageState extends AppState<FlutterCacheManagerPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<FlutterCacheManagerModel>(
title: widget.package.key,
builder: (context, child, model) {

12
example/lib/packages/flutter_local_notifications/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/flutter_local_notifications/model.dart';
import 'package:flutter_example_packages/packages/flutter_local_notifications/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class FlutterLocalNotificationsPage extends StatefulWidget {
class FlutterLocalNotificationsPage extends AppStatefulWidget {
FlutterLocalNotificationsPage({
super.key,
});
@ -17,9 +19,13 @@ class FlutterLocalNotificationsPage extends StatefulWidget {
}
class _FlutterLocalNotificationsPageState
extends State<FlutterLocalNotificationsPage> {
extends AppState<FlutterLocalNotificationsPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<FlutterLocalNotificationsModel>(
title: widget.package.key,
builder: (context, child, model) {

16
example/lib/packages/flutter_secure_storage/page.dart

@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/flutter_secure_storage/model.dart';
import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package.dart';
class FlutterSecureStoragePage extends StatefulWidget {
class FlutterSecureStoragePage extends AppStatefulWidget {
FlutterSecureStoragePage({
super.key,
});
@ -17,9 +18,14 @@ class FlutterSecureStoragePage extends StatefulWidget {
_FlutterSecureStoragePageState();
}
class _FlutterSecureStoragePageState extends State<FlutterSecureStoragePage> {
class _FlutterSecureStoragePageState
extends AppState<FlutterSecureStoragePage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<FlutterSecureStorageModel>(
title: widget.package.key,
builder: (context, child, model) {

22
example/lib/packages/google_fonts/package.dart

@ -0,0 +1,22 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageGoogleFonts = PackageDialog(
key: 'google_fonts',
descEN: '''
A Flutter package to use fonts from fonts.google.com.
''',
descRU: '''
Пакет Flutter для использования шрифтов с fonts.google.com.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '4.0.4',
isPlatformDependent: false,
);

26
example/lib/packages/intl/package.dart

@ -0,0 +1,26 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageIntl = PackageDialog(
key: 'intl',
descEN: '''
Provides internationalization and localization facilities,
including message translation, plurals and genders,
date/number formatting and parsing, and bidirectional text.
''',
descRU: '''
Предоставляет средства интернационализации и локализации,
включая перевод сообщений, множественное число и пол,
форматирование и разбор даты/числа, а также двунаправленный текст.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '0.17.0',
isPlatformDependent: false,
);

12
example/lib/packages/package_info_plus/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/package_info_plus/model.dart';
import 'package:flutter_example_packages/packages/package_info_plus/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PackageInfoPlusPage extends StatefulWidget {
class PackageInfoPlusPage extends AppStatefulWidget {
PackageInfoPlusPage({
super.key,
});
@ -15,9 +17,13 @@ class PackageInfoPlusPage extends StatefulWidget {
State<PackageInfoPlusPage> createState() => _PackageInfoPlusPageState();
}
class _PackageInfoPlusPageState extends State<PackageInfoPlusPage> {
class _PackageInfoPlusPageState extends AppState<PackageInfoPlusPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<PackageInfoPlusModel>(
title: widget.package.key,
builder: (context, child, model) {

13
example/lib/packages/packages.dart

@ -1,30 +1,41 @@
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/battery_plus/package.dart';
import 'package:flutter_example_packages/packages/cached_network_image/package.dart';
import 'package:flutter_example_packages/packages/cupertino_icons/package.dart';
import 'package:flutter_example_packages/packages/device_info_plus/package.dart';
import 'package:flutter_example_packages/packages/flutter_cache_manager/package.dart';
import 'package:flutter_example_packages/packages/flutter_local_notifications/package.dart';
import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart';
import 'package:flutter_example_packages/packages/get_it/package.dart';
import 'package:flutter_example_packages/packages/google_fonts/package.dart';
import 'package:flutter_example_packages/packages/intl/package.dart';
import 'package:flutter_example_packages/packages/package_info_plus/package.dart';
import 'package:flutter_example_packages/packages/path_provider/package.dart';
import 'package:flutter_example_packages/packages/scoped_model/package.dart';
import 'package:flutter_example_packages/packages/shared_preferences/package.dart';
import 'package:flutter_example_packages/packages/sqflite/package.dart';
import 'package:flutter_example_packages/packages/universal_io/package.dart';
import 'package:flutter_example_packages/packages/wakelock/package.dart';
import 'package:flutter_example_packages/packages/xdga_directories/package.dart';
/// List app packages
final packages = <Package>[
// Check with preview
packageBatteryPlus,
packageCachedNetworkImage,
packageCupertinoIcons,
packageDeviceInfoPlus,
packageFlutterCacheManager,
packageFlutterLocalNotifications,
packageFlutterSecureStorage,
packageGetIt,
packageGoogleFonts,
packageIntl,
packagePackageInfoPlus,
packagePathProvider,
packageScopedModel,
packageSharedPreferences,
packageSqflite,
packageUniversalIO,
packageWakelock,
packageXdgaDirectories,
];

12
example/lib/packages/path_provider/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/path_provider/model.dart';
import 'package:flutter_example_packages/packages/path_provider/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PathProviderPage extends StatefulWidget {
class PathProviderPage extends AppStatefulWidget {
PathProviderPage({super.key});
final Package package = packagePathProvider;
@ -13,9 +15,13 @@ class PathProviderPage extends StatefulWidget {
State<PathProviderPage> createState() => _PathProviderPageState();
}
class _PathProviderPageState extends State<PathProviderPage> {
class _PathProviderPageState extends AppState<PathProviderPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<PathProviderModel>(
title: widget.package.key,
builder: (context, child, model) {

24
example/lib/packages/scoped_model/package.dart

@ -0,0 +1,24 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageScopedModel = PackageDialog(
key: 'scoped_model',
descEN: '''
A set of utilities that allow you to easily pass a data Model
from a parent Widget down to its descendants.
''',
descRU: '''
Набор утилит, позволяющих легко передать Модель данных
от родительского виджета до его потомков.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '2.0.0',
isPlatformDependent: false,
);

12
example/lib/packages/shared_preferences/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/shared_preferences/model.dart';
import 'package:flutter_example_packages/packages/shared_preferences/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class SharedPreferencesPage extends StatefulWidget {
class SharedPreferencesPage extends AppStatefulWidget {
SharedPreferencesPage({
super.key,
});
@ -15,9 +17,13 @@ class SharedPreferencesPage extends StatefulWidget {
State<SharedPreferencesPage> createState() => _SharedPreferencesPageState();
}
class _SharedPreferencesPageState extends State<SharedPreferencesPage> {
class _SharedPreferencesPageState extends AppState<SharedPreferencesPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<SharedPreferencesModel>(
title: widget.package.key,
builder: (context, child, model) {

20
example/lib/packages/sqflite/package.dart

@ -0,0 +1,20 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageSqflite = PackageDialog(
key: 'sqflite',
descEN: '''
SQLite plugin for Flutter. Supports iOS, Android, MacOS and Aurora OS.
''',
descRU: '''
Плагин SQLite для Flutter. Поддерживает iOS, Android, MacOS и ОС Aurora.
''',
messageEN: '''
Platform dependent plugin. Preview of work in development.
''',
messageRU: '''
Платформо-зависимый плагин. Превью работы в разработке.
''',
version: '2.2.6',
isPlatformDependent: true,
);

24
example/lib/packages/universal_io/package.dart

@ -0,0 +1,24 @@
import 'package:flutter_example_packages/base/package/package_dialog.dart';
/// Package values
final packageUniversalIO = PackageDialog(
key: 'universal_io',
descEN: '''
A cross-platform dart:io that works on all platforms,
including browsers.
''',
descRU: '''
Кроссплатформенный dart:io, который работает на всех платформах,
включая браузеры.
''',
messageEN: '''
This is a platform independent plugin used in this app, should work
for you too.
''',
messageRU: '''
Это плагин независимый от платформы, используется в этом приложении,
должен работать и у вас.
''',
version: '2.2.0',
isPlatformDependent: false,
);

12
example/lib/packages/wakelock/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/wakelock/model.dart';
import 'package:flutter_example_packages/packages/wakelock/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class WakelockPage extends StatefulWidget {
class WakelockPage extends AppStatefulWidget {
WakelockPage({
super.key,
});
@ -15,9 +17,13 @@ class WakelockPage extends StatefulWidget {
State<WakelockPage> createState() => _WakelockPageState();
}
class _WakelockPageState extends State<WakelockPage> {
class _WakelockPageState extends AppState<WakelockPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<WakelockModel>(
title: widget.package.key,
builder: (context, child, model) {

12
example/lib/packages/xdga_directories/page.dart

@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/xdga_directories/model.dart';
import 'package:flutter_example_packages/packages/xdga_directories/package.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class XdgaDirectoriesPage extends StatefulWidget {
class XdgaDirectoriesPage extends AppStatefulWidget {
XdgaDirectoriesPage({
super.key,
});
@ -15,9 +17,13 @@ class XdgaDirectoriesPage extends StatefulWidget {
State<XdgaDirectoriesPage> createState() => _XdgaDirectoriesPageState();
}
class _XdgaDirectoriesPageState extends State<XdgaDirectoriesPage> {
class _XdgaDirectoriesPageState extends AppState<XdgaDirectoriesPage> {
@override
Widget build(BuildContext context) {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<XdgaDirectoriesModel>(
title: widget.package.key,
builder: (context, child, model) {

251
example/lib/pages/home/page.dart

@ -1,13 +1,18 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/extensions/keys_ext.dart';
import 'package:flutter_example_packages/packages/packages.dart';
import 'package:flutter_example_packages/pages/home/model.dart';
import 'package:flutter_example_packages/pages/home/widgets/home_app_bar.dart';
import 'package:flutter_example_packages/pages/home/widgets/package_list_item.dart';
import 'package:flutter_example_packages/theme/colors.dart';
import 'package:flutter_example_packages/widgets/base/app_state.dart';
import 'package:flutter_example_packages/widgets/base/app_stateful_widget.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';
class HomePage extends StatefulWidget {
class HomePage extends AppStatefulWidget {
const HomePage({
super.key,
});
@ -16,107 +21,183 @@ class HomePage extends StatefulWidget {
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
double _hH = 0;
class _HomePageState extends AppState<HomePage> {
final _header = GlobalKey();
double _hH = 0;
String _search = "";
PlatformFilter _filter = PlatformFilter.disable;
final ScrollController _controllerListView = ScrollController();
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {
_hH = _header.getHeight() ?? 0;
Future.delayed(const Duration(milliseconds: 100), () {
setState(() {
_hH = _header.getHeight() ?? 0;
});
});
Future.delayed(const Duration(milliseconds: 200), () {
setState(() {
_hH = _header.getHeight() ?? 0;
});
});
Future.delayed(const Duration(milliseconds: 500), () {
setState(() {
_hH = _header.getHeight() ?? 0;
});
});
}));
void didChangeMetrics() {
setState(() {
_hH = _header.getHeight() ?? 0;
});
}
List<Package> filterPackages(
String search,
PlatformFilter filter,
) {
return packages.where((element) {
bool result = true;
switch (_filter) {
case PlatformFilter.dependent:
result = element.isPlatformDependent == true;
break;
case PlatformFilter.independent:
result = element.isPlatformDependent == false;
break;
case PlatformFilter.disable:
break;
}
if (_search.isNotEmpty) {
if (!element.key.contains(_search)) {
result = false;
}
}
return result;
}).toList();
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final localizations = AppLocalizations.of(context)!;
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
final packagesFilter = filterPackages(_search, _filter);
return BlockLayout<HomeModel>(builder: (context, child, model) {
return Scaffold(
body: Stack(
children: [
Container(
height: _hH > 0 ? _hH : 0,
color: AppColors.primary,
width: double.infinity,
child: Center(
child: Align(
alignment: FractionalOffset.bottomRight,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 60,
),
child: Opacity(
opacity: 0.2,
child: Image.asset(
'images/logo-head.png',
width: 250,
backgroundColor: Colors.blueGrey,
appBar: HomeAppBar(
onChangeSearch: (String text) {
if (packagesFilter.isNotEmpty) {
_controllerListView.jumpTo(0);
}
setState(() {
_search = text;
});
},
onChangeFilter: (PlatformFilter filter) {
if (packagesFilter.isNotEmpty) {
_controllerListView.jumpTo(0);
}
setState(() {
_filter = filter;
});
},
),
body: GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode());
},
child: Stack(
children: [
Visibility(
visible: _search.isEmpty,
child: Container(
height: _hH > 0 ? _hH : 0,
color: AppColors.primary,
width: double.infinity,
child: Center(
child: Align(
alignment: FractionalOffset.bottomRight,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 40,
),
child: Opacity(
opacity: 0.2,
child: Image.asset(
'images/logo-head.png',
width: 250,
),
),
),
),
),
),
),
),
Container(
key: _header,
width: double.infinity,
padding: const EdgeInsets.only(
left: 20,
right: 20,
top: 60,
bottom: 80,
Visibility(
visible: _search.isEmpty,
child: Container(
key: _header,
width: double.infinity,
padding: const EdgeInsets.only(
left: 20,
right: 20,
top: 30,
bottom: 90,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextTitleLarge(
l10n.homeWelcomeTitle,
color: Colors.white,
),
const SizedBox(height: 40),
TextBodyLarge(
l10n.homeWelcomeText(packages.length),
color: Colors.white,
)
],
),
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
localizations.homeWelcomeTitle,
textAlign: TextAlign.left,
style: theme.textTheme.titleLarge?.copyWith(
color: AppColors.primaryDark,
if (packagesFilter.isNotEmpty)
ListView.builder(
keyboardDismissBehavior:
ScrollViewKeyboardDismissBehavior.onDrag,
controller: _controllerListView,
padding: EdgeInsets.only(
top: _hH > 0 && _search.isEmpty ? _hH - 20 : 0),
itemCount: packagesFilter.length,
itemBuilder: (context, index) {
return PackageListItemWidget(
index: index,
item: packagesFilter[index],
);
},
),
if (packagesFilter.isEmpty)
Container(
width: double.infinity,
height: double.infinity,
color: Colors.white,
child: Padding(
padding: const EdgeInsets.only(
left: 20,
right: 20,
top: 20,
bottom: 0,
),
),
const SizedBox(height: 50),
Text(
localizations.homeWelcomeText,
textAlign: TextAlign.left,
style: theme.textTheme.bodyLarge?.copyWith(
color: AppColors.primaryDark,
height: 1.5,
child: Center(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextTitleSmall(
l10n.homeNotFoundTitle,
textAlign: TextAlign.center,
),
const SizedBox(height: 40),
TextBodyMedium(
l10n.homeNotFoundSubtitle,
textAlign: TextAlign.center,
),
],
),
),
),
),
],
),
),
ListView.builder(
padding: EdgeInsets.only(top: _hH > 0 ? _hH - 16 : 0),
itemCount: packages.length,
itemBuilder: (context, index) {
return PackageListItemWidget(
index: index,
item: packages[index],
);
},
),
],
),
],
),
),
);
});

153
example/lib/pages/home/widgets/home_app_bar.dart

@ -0,0 +1,153 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
enum PlatformFilter {
disable,
dependent,
independent,
}
class HomeAppBar extends AppStatefulWidget implements PreferredSizeWidget {
const HomeAppBar({
super.key,
required this.onChangeSearch,
required this.onChangeFilter,
});
final void Function(String) onChangeSearch;
final void Function(PlatformFilter) onChangeFilter;
@override
State<HomeAppBar> createState() => _HomeAppBarState();
@override
Size get preferredSize => const Size.fromHeight(56.0);
}
class _HomeAppBarState extends AppState<HomeAppBar> {
bool _enableSearch = false;
PlatformFilter _filter = PlatformFilter.disable;
final TextEditingController _searchController = TextEditingController();
final FocusNode _searchFocus = FocusNode();
@override
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
final theme = Theme.of(context);
return AppBar(
centerTitle: true,
shape: const Border(bottom: BorderSide(width: 0)),
leading: _enableSearch
? Padding(
padding: const EdgeInsets.all(8.0),
child: ClipOval(
child: Material(
color: Colors.blueGrey,
child: IconButton(
icon: const Icon(Icons.close),
tooltip: l10n.homeSearch,
onPressed: () {
setState(() {
widget.onChangeSearch.call("");
_searchController.clear();
_enableSearch = false;
});
},
),
),
),
)
: null,
title: _enableSearch
? TextField(
focusNode: _searchFocus,
controller: _searchController,
style: theme.textTheme.titleSmall?.copyWith(color: Colors.white),
cursorColor: Colors.white,
decoration: InputDecoration(
hintText: l10n.homeSearchTitle,
hintStyle:
theme.textTheme.titleSmall?.copyWith(color: Colors.white54),
border: InputBorder.none,
),
onChanged: (value) {
widget.onChangeSearch.call(value);
},
)
: null,
actions: [
if (!_enableSearch)
Padding(
padding: const EdgeInsets.all(8.0),
child: ClipOval(
child: Material(
color: Colors.blueGrey,
child: IconButton(
icon: const Icon(Icons.search),
tooltip: l10n.homeSearch,
onPressed: () {
setState(() {
_enableSearch = true;
_searchFocus.requestFocus();
});
},
),
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: ClipOval(
child: Material(
color: () {
switch (_filter) {
case PlatformFilter.disable:
return Colors.blueGrey;
case PlatformFilter.dependent:
return Colors.deepOrangeAccent;
case PlatformFilter.independent:
return Colors.blueAccent;
}
}.call(),
child: IconButton(
icon: () {
switch (_filter) {
case PlatformFilter.disable:
return const Icon(Icons.filter_list_off);
case PlatformFilter.dependent:
return const Icon(Icons.filter_list);
case PlatformFilter.independent:
return const Icon(Icons.filter_list);
}
}.call(),
tooltip: l10n.homeFilter,
onPressed: () {
setState(() {
switch (_filter) {
case PlatformFilter.disable:
_filter = PlatformFilter.dependent;
widget.onChangeFilter.call(_filter);
break;
case PlatformFilter.dependent:
_filter = PlatformFilter.independent;
widget.onChangeFilter.call(_filter);
break;
case PlatformFilter.independent:
_filter = PlatformFilter.disable;
widget.onChangeFilter.call(_filter);
break;
}
});
},
),
),
),
),
],
);
}
}

52
example/lib/pages/home/widgets/package_info_dialog.dart

@ -1,7 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/package/package_dialog.dart';
import 'package:flutter_example_packages/theme/radius.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/texts/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PackageInfoDialog extends StatelessWidget {
class PackageInfoDialog extends AppStatelessWidget {
const PackageInfoDialog({
super.key,
required this.package,
@ -10,44 +14,34 @@ class PackageInfoDialog extends StatelessWidget {
final PackageDialog package;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return Dialog(
shape: RoundedRectangleBorder(borderRadius: AppRadius.small),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
package.key,
textAlign: TextAlign.left,
style: theme.textTheme.titleSmall,
),
TextTitleSmall(package.key),
const SizedBox(height: 15),
Text(
package.message,
textAlign: TextAlign.left,
style: theme.textTheme.bodyLarge?.copyWith(
height: 1.5,
),
),
TextBodyLarge(package.message),
const SizedBox(height: 20),
Row(
children: [
const Spacer(),
OutlinedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text("Close"),
Row(
children: [
const Spacer(),
OutlinedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(l10n.commonClose),
),
],
),
],
),
],
),
),

57
example/lib/pages/home/widgets/package_list_item.dart

@ -5,9 +5,11 @@ import 'package:flutter_example_packages/base/package/package_page.dart';
import 'package:flutter_example_packages/pages/home/widgets/package_info_dialog.dart';
import 'package:flutter_example_packages/theme/colors.dart';
import 'package:flutter_example_packages/theme/radius.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/texts/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class PackageListItemWidget extends StatelessWidget {
class PackageListItemWidget extends AppStatelessWidget {
const PackageListItemWidget({
super.key,
required this.index,
@ -18,13 +20,14 @@ class PackageListItemWidget extends StatelessWidget {
final Package item;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final localizations = AppLocalizations.of(context)!;
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return Container(
decoration: BoxDecoration(
color: Colors.white,
color: Colors.blueGrey,
borderRadius: index == 0
? const BorderRadius.only(
topLeft: Radius.circular(20),
@ -47,35 +50,27 @@ class PackageListItemWidget extends StatelessWidget {
SizedBox(
width: double.infinity,
child: Card(
color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.key,
textAlign: TextAlign.left,
style: theme.textTheme.titleSmall,
),
TextTitleSmall(item.key),
const SizedBox(height: 10),
Text(
TextBodyMedium(
item.desc,
textAlign: TextAlign.left,
style: theme.textTheme.bodyMedium?.copyWith(
color: Colors.black.withOpacity(0.6)),
color: Colors.black.withOpacity(0.6),
),
const SizedBox(height: 12),
Divider(
height: 1,
color:
AppColors.primaryDark.withOpacity(0.2)),
height: 1,
color: AppColors.primary.withOpacity(0.2),
),
const SizedBox(height: 12),
Text(
localizations.homeListVersion(item.version),
textAlign: TextAlign.left,
style: theme.textTheme.caption?.copyWith(
color: AppColors.primaryDark
.withOpacity(0.7)),
TextBodySmall(
l10n.homeListVersion(item.version),
color: AppColors.primary.withOpacity(0.7),
),
],
),
@ -115,7 +110,7 @@ class PackageListItemWidget extends StatelessWidget {
margin: const EdgeInsets.only(right: 16),
decoration: BoxDecoration(
color: item.isPlatformDependent
? Colors.orange
? Colors.deepOrangeAccent
: Colors.blueAccent,
borderRadius: AppRadius.small,
),
@ -126,15 +121,11 @@ class PackageListItemWidget extends StatelessWidget {
right: 6,
bottom: 6,
),
child: Text(
child: TextBodySmall(
item.isPlatformDependent
? localizations.homeListStateDependent
: localizations.homeListStateIndependent,
textAlign: TextAlign.left,
style: theme.textTheme.caption?.copyWith(
color: Colors.white,
fontWeight: FontWeight.w100,
),
? l10n.homeListStateDependent
: l10n.homeListStateIndependent,
color: Colors.white,
),
),
),

7
example/lib/theme/colors.dart

@ -1,8 +1,7 @@
import 'dart:ui';
import 'package:flutter/material.dart';
class AppColors {
static const Color primary = Color(0xFFCBDCF8);
static const Color primaryDark = Color(0xFF3c67b5);
static const Color secondary = Color(0xFF00b3ad);
static const Color primary = Color(0xFF080614);
static const Color secondary = Colors.blueGrey;
static const Color warning = Color(0xFFfb7d4a);
}

18
example/lib/theme/theme.dart

@ -44,36 +44,36 @@ final appTheme = ThemeData(
/// [Text]
textTheme: TextTheme(
headlineLarge: GoogleFonts.ubuntu(
headlineLarge: GoogleFonts.roboto(
fontSize: 44,
fontWeight: FontWeight.bold,
),
headlineMedium: GoogleFonts.ubuntu(
headlineMedium: GoogleFonts.roboto(
fontSize: 36,
fontWeight: FontWeight.bold,
),
headlineSmall: GoogleFonts.ubuntu(
headlineSmall: GoogleFonts.roboto(
fontSize: 24,
fontWeight: FontWeight.bold,
),
titleLarge: GoogleFonts.ubuntu(
titleLarge: GoogleFonts.roboto(
fontSize: 44,
),
titleMedium: GoogleFonts.ubuntu(
titleMedium: GoogleFonts.roboto(
fontSize: 36,
),
titleSmall: GoogleFonts.ubuntu(
titleSmall: GoogleFonts.roboto(
fontSize: 24,
),
bodyLarge: GoogleFonts.ubuntu(
bodyLarge: GoogleFonts.openSans(
fontSize: 18,
height: 1.5,
),
bodyMedium: GoogleFonts.ubuntu(
bodyMedium: GoogleFonts.openSans(
fontSize: 16,
height: 1.5,
),
bodySmall: GoogleFonts.ubuntu(
bodySmall: GoogleFonts.openSans(
fontSize: 12,
height: 1.5,
),

44
example/lib/widgets/base/app_state.dart

@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
abstract class AppState<T extends StatefulWidget> extends State<T>
with WidgetsBindingObserver {
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
);
void onPostFrameCallback() {}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((_) {
didChangeMetrics();
Future.delayed(const Duration(milliseconds: 100), () {
didChangeMetrics();
});
Future.delayed(const Duration(milliseconds: 200), () {
didChangeMetrics();
});
Future.delayed(const Duration(milliseconds: 500), () {
didChangeMetrics();
});
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) => buildWide(
context,
MediaQuery.of(context),
AppLocalizations.of(context)!,
);
}

5
example/lib/widgets/base/app_stateful_widget.dart

@ -0,0 +1,5 @@
import 'package:flutter/material.dart';
abstract class AppStatefulWidget extends StatefulWidget {
const AppStatefulWidget({super.key});
}

21
example/lib/widgets/base/app_stateless_widget.dart

@ -0,0 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
abstract class AppStatelessWidget extends StatelessWidget {
const AppStatelessWidget({super.key});
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
);
void onPostFrameCallback() {}
@override
Widget build(BuildContext context) => buildWide(
context,
MediaQuery.of(context),
AppLocalizations.of(context)!,
);
}

5
example/lib/widgets/base/export.dart

@ -0,0 +1,5 @@
library base;
export 'package:flutter_example_packages/widgets/base/app_state.dart';
export 'package:flutter_example_packages/widgets/base/app_stateful_widget.dart';
export 'package:flutter_example_packages/widgets/base/app_stateless_widget.dart';

45
example/lib/widgets/layouts/block_layout.dart

@ -1,9 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/di/app_di.dart';
import 'package:flutter_example_packages/theme/colors.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/texts/export.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:scoped_model/scoped_model.dart';
class BlockLayout<T extends Model> extends StatelessWidget {
class BlockLayout<T extends Model> extends AppStatelessWidget {
const BlockLayout({
super.key,
this.title,
@ -14,21 +17,39 @@ class BlockLayout<T extends Model> extends StatelessWidget {
final Widget Function(BuildContext context, Widget? child, T model) builder;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return ScopedModel<T>(
model: getIt<T>(),
child: ScopedModelDescendant<T>(builder: (context, child, model) {
return Scaffold(
appBar: title == null ? null : AppBar(
backgroundColor: AppColors.primaryDark,
title: Text(
title!,
textAlign: TextAlign.left,
style: theme.textTheme.titleSmall?.copyWith(color: Colors.white),
),
),
appBar: title == null
? null
: AppBar(
leading: Padding(
padding: const EdgeInsets.all(8.0),
child: ClipOval(
child: Material(
color: Colors.blueGrey,
child: IconButton(
icon: const Icon(Icons.arrow_back),
tooltip: 'Back',
onPressed: () {
Navigator.of(context).pop();
},
),
),
),
),
backgroundColor: AppColors.primary,
title: TextTitleSmall(
title!,
color: Colors.white,
),
),
body: Padding(
padding: EdgeInsets.all(title == null ? 0 : 20),
child: builder.call(context, child, model),

11
example/lib/widgets/texts/export.dart

@ -0,0 +1,11 @@
library texts;
export 'package:flutter_example_packages/widgets/texts/text_body_large.dart';
export 'package:flutter_example_packages/widgets/texts/text_body_medium.dart';
export 'package:flutter_example_packages/widgets/texts/text_body_small.dart';
export 'package:flutter_example_packages/widgets/texts/text_headline_large.dart';
export 'package:flutter_example_packages/widgets/texts/text_headline_medium.dart';
export 'package:flutter_example_packages/widgets/texts/text_headline_small.dart';
export 'package:flutter_example_packages/widgets/texts/text_title_large.dart';
export 'package:flutter_example_packages/widgets/texts/text_title_medium.dart';
export 'package:flutter_example_packages/widgets/texts/text_title_small.dart';

27
example/lib/widgets/texts/text_base.dart

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
class TextBase extends StatelessWidget {
const TextBase(
this.data, {
super.key,
this.color,
this.textAlign,
});
final String data;
final Color? color;
final TextAlign? textAlign;
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.bodyMedium;
}
@override
Widget build(BuildContext context) {
return Text(
data,
style: getStyle(context)?.copyWith(color: color ?? Colors.black),
textAlign: textAlign,
);
}
}

15
example/lib/widgets/texts/text_body_large.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextBodyLarge extends TextBase {
const TextBodyLarge(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.bodyLarge;
}
}

15
example/lib/widgets/texts/text_body_medium.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextBodyMedium extends TextBase {
const TextBodyMedium(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.bodyMedium;
}
}

15
example/lib/widgets/texts/text_body_small.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextBodySmall extends TextBase {
const TextBodySmall(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.bodySmall;
}
}

15
example/lib/widgets/texts/text_headline_large.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextHeadlineLarge extends TextBase {
const TextHeadlineLarge(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.headlineLarge;
}
}

15
example/lib/widgets/texts/text_headline_medium.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextHeadlineMedium extends TextBase {
const TextHeadlineMedium(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.headlineMedium;
}
}

15
example/lib/widgets/texts/text_headline_small.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextHeadlineSmall extends TextBase {
const TextHeadlineSmall(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.headlineSmall;
}
}

15
example/lib/widgets/texts/text_title_large.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextTitleLarge extends TextBase {
const TextTitleLarge(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.titleLarge;
}
}

15
example/lib/widgets/texts/text_title_medium.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextTitleMedium extends TextBase {
const TextTitleMedium(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.titleMedium;
}
}

15
example/lib/widgets/texts/text_title_small.dart

@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/widgets/texts/text_base.dart';
class TextTitleSmall extends TextBase {
const TextTitleSmall(super.data, {
super.key,
super.color,
super.textAlign,
});
@override
TextStyle? getStyle(BuildContext context) {
return Theme.of(context).textTheme.titleSmall;
}
}

53
example/pubspec.lock

@ -106,13 +106,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
cli_util:
dependency: transitive
description:
name: cli_util
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
clock:
dependency: transitive
description:
@ -170,19 +163,12 @@ packages:
source: hosted
version: "1.3.1"
ffi:
dependency: "direct main"
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
ffigen:
dependency: "direct dev"
description:
name: ffigen
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.7"
file:
dependency: transitive
description:
@ -297,19 +283,12 @@ packages:
source: hosted
version: "0.6.5"
json_annotation:
dependency: "direct main"
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "4.8.0"
json_serializable:
dependency: "direct dev"
description:
name: json_serializable
url: "https://pub.dartlang.org"
source: hosted
version: "6.6.1"
lints:
dependency: transitive
description:
@ -450,13 +429,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.3"
quiver:
dependency: transitive
description:
name: quiver
url: "https://pub.dartlang.org"
source: hosted
version: "3.2.1"
scoped_model:
dependency: "direct main"
description:
@ -483,20 +455,6 @@ packages:
description: flutter
source: sdk
version: "0.0.99"
source_gen:
dependency: transitive
description:
name: source_gen
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.2"
source_helper:
dependency: transitive
description:
name: source_helper
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.3"
source_span:
dependency: transitive
description:
@ -609,13 +567,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
yaml_edit:
dependency: transitive
description:
name: yaml_edit
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
sdks:
dart: ">=2.18.6 <3.0.0"
flutter: ">=3.3.0"

8
example/pubspec.yaml

@ -13,12 +13,10 @@ dependencies:
sdk: flutter
flutter_localizations:
sdk: flutter
cupertino_icons: ^1.0.2
google_fonts: ^4.0.3
cupertino_icons: ^1.0.5
google_fonts: ^4.0.4
scoped_model: ^2.0.0
get_it: ^7.2.0
json_annotation: ^4.8.0
ffi: ^2.0.2
intl: ^0.17.0
universal_io: ^2.2.0
@ -28,8 +26,6 @@ dev_dependencies:
flutter
flutter_lints: ^2.0.0
build_runner: ^2.3.3
json_serializable: ^6.6.1
ffigen: ^7.2.7
flutter:
generate: true

Loading…
Cancel
Save