diff --git a/example/assets/images/leading.png b/example/assets/images/leading.png new file mode 100644 index 0000000..654a57a Binary files /dev/null and b/example/assets/images/leading.png differ diff --git a/example/aurora/icons/108x108.png b/example/aurora/icons/108x108.png index f7af7fc..a0b871d 100644 Binary files a/example/aurora/icons/108x108.png and b/example/aurora/icons/108x108.png differ diff --git a/example/aurora/icons/128x128.png b/example/aurora/icons/128x128.png index 1b8ffce..5a4abc7 100644 Binary files a/example/aurora/icons/128x128.png and b/example/aurora/icons/128x128.png differ diff --git a/example/aurora/icons/172x172.png b/example/aurora/icons/172x172.png index 6da2b55..2979270 100644 Binary files a/example/aurora/icons/172x172.png and b/example/aurora/icons/172x172.png differ diff --git a/example/aurora/icons/86x86.png b/example/aurora/icons/86x86.png index 8bf935b..b4e9f1f 100644 Binary files a/example/aurora/icons/86x86.png and b/example/aurora/icons/86x86.png differ diff --git a/example/data/raw/icon.png b/example/data/raw/icon.png index 8ab60ab..cefa8bf 100644 Binary files a/example/data/raw/icon.png and b/example/data/raw/icon.png differ diff --git a/example/data/raw/icon.xcf b/example/data/raw/icon.xcf new file mode 100644 index 0000000..4151ebe Binary files /dev/null and b/example/data/raw/icon.xcf differ diff --git a/example/data/raw/icon2.png b/example/data/raw/icon2.png new file mode 100644 index 0000000..0282c35 Binary files /dev/null and b/example/data/raw/icon2.png differ diff --git a/example/lib/base/app/app.dart b/example/lib/base/app/app.dart index 7b263fb..da43724 100644 --- a/example/lib/base/app/app.dart +++ b/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, diff --git a/example/lib/l10n/app_en.arb b/example/lib/l10n/app_en.arb index c94f232..fb75208 100644 --- a/example/lib/l10n/app_en.arb +++ b/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" } \ No newline at end of file diff --git a/example/lib/l10n/app_ru.arb b/example/lib/l10n/app_ru.arb index 40dd9cb..e410b5e 100644 --- a/example/lib/l10n/app_ru.arb +++ b/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": "Закрыть" } \ No newline at end of file diff --git a/example/lib/packages/battery_plus/page.dart b/example/lib/packages/battery_plus/page.dart index dd45d52..eb358aa 100644 --- a/example/lib/packages/battery_plus/page.dart +++ b/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 createState() => _BatteryPlusPageState(); } -class _BatteryPlusPageState extends State { +class _BatteryPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/cached_network_image/page.dart b/example/lib/packages/cached_network_image/page.dart index cbbf32f..919471a 100644 --- a/example/lib/packages/cached_network_image/page.dart +++ b/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 createState() => _CachedNetworkImagePageState(); } -class _CachedNetworkImagePageState extends State { +class _CachedNetworkImagePageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/cupertino_icons/package.dart b/example/lib/packages/cupertino_icons/package.dart new file mode 100644 index 0000000..ead2d69 --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/device_info_plus/page.dart b/example/lib/packages/device_info_plus/page.dart index 2d31fda..ee5b816 100644 --- a/example/lib/packages/device_info_plus/page.dart +++ b/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 createState() => _DeviceInfoPlusPageState(); } -class _DeviceInfoPlusPageState extends State { +class _DeviceInfoPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_cache_manager/page.dart b/example/lib/packages/flutter_cache_manager/page.dart index be1249d..63d0a0c 100644 --- a/example/lib/packages/flutter_cache_manager/page.dart +++ b/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 { +class _FlutterCacheManagerPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_local_notifications/page.dart b/example/lib/packages/flutter_local_notifications/page.dart index f63fe9f..7c89cd5 100644 --- a/example/lib/packages/flutter_local_notifications/page.dart +++ b/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 { + extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/flutter_secure_storage/page.dart b/example/lib/packages/flutter_secure_storage/page.dart index c502819..79d1eb9 100644 --- a/example/lib/packages/flutter_secure_storage/page.dart +++ b/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 { +class _FlutterSecureStoragePageState + extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/google_fonts/package.dart b/example/lib/packages/google_fonts/package.dart new file mode 100644 index 0000000..9adab97 --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/intl/package.dart b/example/lib/packages/intl/package.dart new file mode 100644 index 0000000..5d004a5 --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/package_info_plus/page.dart b/example/lib/packages/package_info_plus/page.dart index 0a02708..d2e2457 100644 --- a/example/lib/packages/package_info_plus/page.dart +++ b/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 createState() => _PackageInfoPlusPageState(); } -class _PackageInfoPlusPageState extends State { +class _PackageInfoPlusPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/packages.dart b/example/lib/packages/packages.dart index 793886e..299810c 100644 --- a/example/lib/packages/packages.dart +++ b/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 = [ - // Check with preview packageBatteryPlus, packageCachedNetworkImage, + packageCupertinoIcons, packageDeviceInfoPlus, packageFlutterCacheManager, packageFlutterLocalNotifications, packageFlutterSecureStorage, packageGetIt, + packageGoogleFonts, + packageIntl, packagePackageInfoPlus, packagePathProvider, + packageScopedModel, packageSharedPreferences, + packageSqflite, + packageUniversalIO, packageWakelock, packageXdgaDirectories, ]; diff --git a/example/lib/packages/path_provider/page.dart b/example/lib/packages/path_provider/page.dart index b443716..003bfea 100644 --- a/example/lib/packages/path_provider/page.dart +++ b/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 createState() => _PathProviderPageState(); } -class _PathProviderPageState extends State { +class _PathProviderPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/scoped_model/package.dart b/example/lib/packages/scoped_model/package.dart new file mode 100644 index 0000000..c928823 --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/shared_preferences/page.dart b/example/lib/packages/shared_preferences/page.dart index 6954810..617b53b 100644 --- a/example/lib/packages/shared_preferences/page.dart +++ b/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 createState() => _SharedPreferencesPageState(); } -class _SharedPreferencesPageState extends State { +class _SharedPreferencesPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/sqflite/package.dart b/example/lib/packages/sqflite/package.dart new file mode 100644 index 0000000..48b374e --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/universal_io/package.dart b/example/lib/packages/universal_io/package.dart new file mode 100644 index 0000000..ca3687e --- /dev/null +++ b/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, +); diff --git a/example/lib/packages/wakelock/page.dart b/example/lib/packages/wakelock/page.dart index a3b69c4..9e5688d 100644 --- a/example/lib/packages/wakelock/page.dart +++ b/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 createState() => _WakelockPageState(); } -class _WakelockPageState extends State { +class _WakelockPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/packages/xdga_directories/page.dart b/example/lib/packages/xdga_directories/page.dart index e0dd17b..39b7f95 100644 --- a/example/lib/packages/xdga_directories/page.dart +++ b/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 createState() => _XdgaDirectoriesPageState(); } -class _XdgaDirectoriesPageState extends State { +class _XdgaDirectoriesPageState extends AppState { @override - Widget build(BuildContext context) { + Widget buildWide( + BuildContext context, + MediaQueryData media, + AppLocalizations l10n, + ) { return BlockLayout( title: widget.package.key, builder: (context, child, model) { diff --git a/example/lib/pages/home/page.dart b/example/lib/pages/home/page.dart index 70860f9..a6a566e 100644 --- a/example/lib/pages/home/page.dart +++ b/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 createState() => _HomePageState(); } -class _HomePageState extends State { - double _hH = 0; +class _HomePageState extends AppState { 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 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(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], - ); - }, - ), - ], + ), + ], + ), ), ); }); diff --git a/example/lib/pages/home/widgets/home_app_bar.dart b/example/lib/pages/home/widgets/home_app_bar.dart new file mode 100644 index 0000000..d3819bb --- /dev/null +++ b/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 createState() => _HomeAppBarState(); + + @override + Size get preferredSize => const Size.fromHeight(56.0); +} + +class _HomeAppBarState extends AppState { + 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; + } + }); + }, + ), + ), + ), + ), + ], + ); + } +} diff --git a/example/lib/pages/home/widgets/package_info_dialog.dart b/example/lib/pages/home/widgets/package_info_dialog.dart index 73e269e..27babda 100644 --- a/example/lib/pages/home/widgets/package_info_dialog.dart +++ b/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), + ), + ], ), - - ], - - ), - ], ), ), diff --git a/example/lib/pages/home/widgets/package_list_item.dart b/example/lib/pages/home/widgets/package_list_item.dart index fab01b5..2d7a60e 100644 --- a/example/lib/pages/home/widgets/package_list_item.dart +++ b/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, ), ), ), diff --git a/example/lib/theme/colors.dart b/example/lib/theme/colors.dart index 3048166..a5c47a7 100644 --- a/example/lib/theme/colors.dart +++ b/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); } diff --git a/example/lib/theme/theme.dart b/example/lib/theme/theme.dart index 39900cf..ed714a4 100644 --- a/example/lib/theme/theme.dart +++ b/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, ), diff --git a/example/lib/widgets/base/app_state.dart b/example/lib/widgets/base/app_state.dart new file mode 100644 index 0000000..99d0804 --- /dev/null +++ b/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 extends State + 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)!, + ); +} diff --git a/example/lib/widgets/base/app_stateful_widget.dart b/example/lib/widgets/base/app_stateful_widget.dart new file mode 100644 index 0000000..cd58702 --- /dev/null +++ b/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}); +} diff --git a/example/lib/widgets/base/app_stateless_widget.dart b/example/lib/widgets/base/app_stateless_widget.dart new file mode 100644 index 0000000..66f5e64 --- /dev/null +++ b/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)!, + ); +} diff --git a/example/lib/widgets/base/export.dart b/example/lib/widgets/base/export.dart new file mode 100644 index 0000000..bcf7e29 --- /dev/null +++ b/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'; diff --git a/example/lib/widgets/layouts/block_layout.dart b/example/lib/widgets/layouts/block_layout.dart index 6d8c137..1b459bf 100644 --- a/example/lib/widgets/layouts/block_layout.dart +++ b/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 extends StatelessWidget { +class BlockLayout extends AppStatelessWidget { const BlockLayout({ super.key, this.title, @@ -14,21 +17,39 @@ class BlockLayout 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( model: getIt(), child: ScopedModelDescendant(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), diff --git a/example/lib/widgets/texts/export.dart b/example/lib/widgets/texts/export.dart new file mode 100644 index 0000000..9c6ea5a --- /dev/null +++ b/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'; \ No newline at end of file diff --git a/example/lib/widgets/texts/text_base.dart b/example/lib/widgets/texts/text_base.dart new file mode 100644 index 0000000..76caf65 --- /dev/null +++ b/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, + ); + } +} diff --git a/example/lib/widgets/texts/text_body_large.dart b/example/lib/widgets/texts/text_body_large.dart new file mode 100644 index 0000000..33f2abb --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_body_medium.dart b/example/lib/widgets/texts/text_body_medium.dart new file mode 100644 index 0000000..bffef81 --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_body_small.dart b/example/lib/widgets/texts/text_body_small.dart new file mode 100644 index 0000000..c6db243 --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_large.dart b/example/lib/widgets/texts/text_headline_large.dart new file mode 100644 index 0000000..f8b4935 --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_medium.dart b/example/lib/widgets/texts/text_headline_medium.dart new file mode 100644 index 0000000..25aa2d8 --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_headline_small.dart b/example/lib/widgets/texts/text_headline_small.dart new file mode 100644 index 0000000..bc5a8bd --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_large.dart b/example/lib/widgets/texts/text_title_large.dart new file mode 100644 index 0000000..c719464 --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_medium.dart b/example/lib/widgets/texts/text_title_medium.dart new file mode 100644 index 0000000..3ad7f5b --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/lib/widgets/texts/text_title_small.dart b/example/lib/widgets/texts/text_title_small.dart new file mode 100644 index 0000000..19316fb --- /dev/null +++ b/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; + } +} \ No newline at end of file diff --git a/example/pubspec.lock b/example/pubspec.lock index 6a679dc..c4b46e8 100644 --- a/example/pubspec.lock +++ b/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" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 88ab1f1..a71b4d2 100644 --- a/example/pubspec.yaml +++ b/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