diff --git a/example/lib/app.dart b/example/lib/base/app/app.dart similarity index 57% rename from example/lib/app.dart rename to example/lib/base/app/app.dart index 7beb5e0..7b263fb 100644 --- a/example/lib/app.dart +++ b/example/lib/base/app/app.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/model.dart'; +import 'package:flutter_example_packages/base/app/model.dart'; +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/packages.dart'; import 'package:flutter_example_packages/pages/home/page.dart'; -import 'package:flutter_example_packages/pages/xdga_directories/page.dart'; import 'package:flutter_example_packages/theme/theme.dart'; -import 'package:scoped_model/scoped_model.dart'; +import 'package:flutter_example_packages/widgets/layouts/page_layout.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:scoped_model/scoped_model.dart'; + +import '../di/app_di.dart'; /// Main app class class MyApp extends StatelessWidget { @@ -13,6 +16,18 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + final routes = { + '/': (context) => const HomePage(), + }; + + for (var item in packages) { + if (item is PackagePage) { + routes['/${item.key}'] = (context) => PageLayout( + child: item.page.call(), + ); + } + } + return ScopedModel( model: getIt(), child: ScopedModelDescendant( @@ -22,10 +37,7 @@ class MyApp extends StatelessWidget { title: 'Flutter Aurora OS', theme: appTheme, initialRoute: '/', - routes: { - '/': (context) => const HomePage(), - '/xdga_directories': (context) => const XdgaDirectoriesPage(), - }, + routes: routes, ), ), ); diff --git a/example/lib/model.dart b/example/lib/base/app/model.dart similarity index 100% rename from example/lib/model.dart rename to example/lib/base/app/model.dart diff --git a/example/lib/base/di/app_di.dart b/example/lib/base/di/app_di.dart index 4abd06f..ea73992 100644 --- a/example/lib/base/di/app_di.dart +++ b/example/lib/base/di/app_di.dart @@ -1,15 +1,6 @@ import 'package:flutter_example_packages/base/build/build.config.dart'; -import 'package:flutter_example_packages/model.dart'; -import 'package:flutter_example_packages/pages/battery_plus/model.dart'; -import 'package:flutter_example_packages/pages/device_info_plus/model.dart'; -import 'package:flutter_example_packages/pages/flutter_local_notifications/model.dart'; -import 'package:flutter_example_packages/pages/flutter_secure_storage/model.dart'; +import 'package:flutter_example_packages/base/app/model.dart'; import 'package:flutter_example_packages/pages/home/model.dart'; -import 'package:flutter_example_packages/pages/package_info_plus/model.dart'; -import 'package:flutter_example_packages/pages/path_provider/model.dart'; -import 'package:flutter_example_packages/pages/shared_preferences/model.dart'; -import 'package:flutter_example_packages/pages/wakelock/model.dart'; -import 'package:flutter_example_packages/pages/xdga_directories/model.dart'; import 'package:get_it/get_it.dart'; final getIt = GetIt.instance; @@ -18,18 +9,9 @@ final getIt = GetIt.instance; void setupDI(BuildConfig config) { getIt // build info - ..registerSingleton(config) + ..registerSingleton(config) // pages models - ..registerFactory(() => HomeModel()) - ..registerFactory(() => BatteryPlusModel()) - ..registerFactory(() => DeviceInfoPlusModel()) - ..registerFactory(() => FlutterLocalNotificationsModel()) - ..registerFactory(() => FlutterSecureStorageModel()) - ..registerFactory(() => PackageInfoPlusModel()) - ..registerFactory(() => PathProviderModel()) - ..registerFactory(() => SharedPreferencesModel()) - ..registerFactory(() => WakelockModel()) - ..registerFactory(() => XdgaDirectoriesModel()) + ..registerFactory(() => HomeModel()) // other - ..registerSingleton(AppModel()); + ..registerSingleton(AppModel()); } \ No newline at end of file diff --git a/example/lib/base/package/package.dart b/example/lib/base/package/package.dart new file mode 100644 index 0000000..1878ab4 --- /dev/null +++ b/example/lib/base/package/package.dart @@ -0,0 +1,32 @@ +import 'package:universal_io/io.dart'; + +class Package { + Package({ + required this.key, + required this.descEN, + required this.descRU, + required this.version, + required this.isPlatformDependent, + }); + + /// Get brief description of the package + String get desc => (Platform.localeName == 'ru_RU' ? descRU : descEN) + .replaceAll("\n", " ") + .replaceAll(RegExp(' +'), ' ') + .trim(); + + /// Key package (https://pub.dev/packages/) + final String key; + + /// Brief description of the package (EN) + final String descEN; + + /// Brief description of the package (RU) + final String descRU; + + /// Version package check + final String version; + + /// Is the package platform dependent? + final bool isPlatformDependent; +} diff --git a/example/lib/base/package/package_dialog.dart b/example/lib/base/package/package_dialog.dart new file mode 100644 index 0000000..4b8e6fa --- /dev/null +++ b/example/lib/base/package/package_dialog.dart @@ -0,0 +1,26 @@ +import 'package:flutter_example_packages/base/package/package.dart'; +import 'package:universal_io/io.dart'; + +class PackageDialog extends Package { + PackageDialog({ + required super.key, + required super.descEN, + required super.descRU, + required super.version, + required super.isPlatformDependent, + required this.messageEN, + required this.messageRU, + }); + + /// Get brief description of the package + String get message => (Platform.localeName == 'ru_RU' ? messageRU : messageEN) + .replaceAll("\n", " ") + .replaceAll(RegExp(' +'), ' ') + .trim(); + + /// Message show in dialog (EN) + final String messageEN; + + /// Message show in dialog (RU) + final String messageRU; +} diff --git a/example/lib/base/package/package_page.dart b/example/lib/base/package/package_page.dart new file mode 100644 index 0000000..5436519 --- /dev/null +++ b/example/lib/base/package/package_page.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/package/package.dart'; +import 'package:universal_io/io.dart'; + +class PackagePage extends Package { + PackagePage({ + required super.key, + required super.descEN, + required super.descRU, + required super.version, + required super.isPlatformDependent, + required this.page, + required this.init, + }) { + init.call(); + } + + /// Package preview page + final Widget Function() page; + + /// Init callback + final void Function() init; +} \ No newline at end of file diff --git a/example/lib/l10n/app_en.arb b/example/lib/l10n/app_en.arb index 801c5ce..c94f232 100644 --- a/example/lib/l10n/app_en.arb +++ b/example/lib/l10n/app_en.arb @@ -1,3 +1,16 @@ { - "helloPageTitle": "Flutter Aurora OS" + "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.", + "homeListStateDependent": "platform dependent", + "homeListStateIndependent": "platform independent", + "homeListVersion": "Version: {version}", + "@homeListVersion": { + "placeholders": { + "version": { + "type": "String", + "example": "1.0.0" + } + } + } } \ No newline at end of file diff --git a/example/lib/l10n/app_ru.arb b/example/lib/l10n/app_ru.arb index ddfd0cd..40dd9cb 100644 --- a/example/lib/l10n/app_ru.arb +++ b/example/lib/l10n/app_ru.arb @@ -1,3 +1,16 @@ { - "helloPageTitle": "Flutter ОС Аврора" + "homePageTitle": "Flutter ОС Аврора", + "homeWelcomeTitle": "Приветствую!", + "homeWelcomeText": "В этом приложении вы можете найти 100500 плагинов Flutter, поддерживающих ОС Aurora. Если вдруг вам чего-то не хватает, вы можете написать нам или добавить самостоятельно.", + "homeListStateDependent": "платформо-зависимый", + "homeListStateIndependent": "платформонезависимый", + "homeListVersion": "Версия: {version}", + "@homeListVersion": { + "placeholders": { + "version": { + "type": "String", + "example": "1.0.0" + } + } + } } \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index 2712e00..6cbaf44 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/app.dart'; +import 'package:flutter_example_packages/base/app/app.dart'; import 'package:flutter_example_packages/base/build/build.release.dart'; import 'package:flutter_example_packages/base/di/app_di.dart'; diff --git a/example/lib/main.release.dart b/example/lib/main.release.dart index dfe04bc..76d12a5 100644 --- a/example/lib/main.release.dart +++ b/example/lib/main.release.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/app.dart'; +import 'package:flutter_example_packages/base/app/app.dart'; import 'package:flutter_example_packages/base/build/build.debug.dart'; import 'package:flutter_example_packages/base/di/app_di.dart'; diff --git a/example/lib/pages/battery_plus/model.dart b/example/lib/packages/battery_plus/model.dart similarity index 100% rename from example/lib/pages/battery_plus/model.dart rename to example/lib/packages/battery_plus/model.dart diff --git a/example/lib/packages/battery_plus/package.dart b/example/lib/packages/battery_plus/package.dart new file mode 100644 index 0000000..41a6d90 --- /dev/null +++ b/example/lib/packages/battery_plus/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/battery_plus/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageBatteryPlus = PackagePage( + key: 'battery_plus', + descEN: ''' + A Flutter plugin to access various information about the + battery of the device the app is running on. + ''', + descRU: ''' + Плагин Flutter для доступа к различной информации о + аккумулятор устройства, на котором запущено приложение. + ''', + version: '4.0.1', + isPlatformDependent: true, + page: () => BatteryPlusPage(), + init: () { + GetIt.instance.registerFactory(() => BatteryPlusModel()); + }, +); diff --git a/example/lib/packages/battery_plus/page.dart b/example/lib/packages/battery_plus/page.dart new file mode 100644 index 0000000..dd45d52 --- /dev/null +++ b/example/lib/packages/battery_plus/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class BatteryPlusPage extends StatefulWidget { + BatteryPlusPage({ + super.key, + }); + + final Package package = packageBatteryPlus; + + @override + State createState() => _BatteryPlusPageState(); +} + +class _BatteryPlusPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/packages/cached_network_image/model.dart b/example/lib/packages/cached_network_image/model.dart new file mode 100644 index 0000000..3fbe12c --- /dev/null +++ b/example/lib/packages/cached_network_image/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [CachedNetworkImagePage] +class CachedNetworkImageModel extends Model { + /// Get [ScopedModel] + static CachedNetworkImageModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/packages/cached_network_image/package.dart b/example/lib/packages/cached_network_image/package.dart new file mode 100644 index 0000000..6e702fa --- /dev/null +++ b/example/lib/packages/cached_network_image/package.dart @@ -0,0 +1,25 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/cached_network_image/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageCachedNetworkImage = PackagePage( + key: 'cached_network_image', + descEN: ''' + A flutter library to show images from the internet + and keep them in the cache directory. + ''', + descRU: ''' + Библиотека флаттера для отображения изображений из + Интернета и хранения их в каталоге кеша. + ''', + version: '3.2.3', + isPlatformDependent: true, + page: () => CachedNetworkImagePage(), + init: () { + GetIt.instance.registerFactory( + () => CachedNetworkImageModel()); + }, +); diff --git a/example/lib/packages/cached_network_image/page.dart b/example/lib/packages/cached_network_image/page.dart new file mode 100644 index 0000000..cbbf32f --- /dev/null +++ b/example/lib/packages/cached_network_image/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class CachedNetworkImagePage extends StatefulWidget { + CachedNetworkImagePage({ + super.key, + }); + + final Package package = packageCachedNetworkImage; + + @override + State createState() => _CachedNetworkImagePageState(); +} + +class _CachedNetworkImagePageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/device_info_plus/model.dart b/example/lib/packages/device_info_plus/model.dart similarity index 100% rename from example/lib/pages/device_info_plus/model.dart rename to example/lib/packages/device_info_plus/model.dart diff --git a/example/lib/packages/device_info_plus/package.dart b/example/lib/packages/device_info_plus/package.dart new file mode 100644 index 0000000..53cdf0b --- /dev/null +++ b/example/lib/packages/device_info_plus/package.dart @@ -0,0 +1,23 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/device_info_plus/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageDeviceInfoPlus = PackagePage( + key: 'device_info_plus', + descEN: ''' + Get current device information from within the Flutter application. + ''', + descRU: ''' + Получите текущую информацию об устройстве из приложения Flutter. + ''', + version: '9.0.2', + isPlatformDependent: true, + page: () => DeviceInfoPlusPage(), + init: () { + GetIt.instance + .registerFactory(() => DeviceInfoPlusModel()); + }, +); diff --git a/example/lib/packages/device_info_plus/page.dart b/example/lib/packages/device_info_plus/page.dart new file mode 100644 index 0000000..2d31fda --- /dev/null +++ b/example/lib/packages/device_info_plus/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class DeviceInfoPlusPage extends StatefulWidget { + DeviceInfoPlusPage({ + super.key, + }); + + final Package package = packageDeviceInfoPlus; + + @override + State createState() => _DeviceInfoPlusPageState(); +} + +class _DeviceInfoPlusPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/packages/flutter_cache_manager/model.dart b/example/lib/packages/flutter_cache_manager/model.dart new file mode 100644 index 0000000..2b393f0 --- /dev/null +++ b/example/lib/packages/flutter_cache_manager/model.dart @@ -0,0 +1,8 @@ +import 'package:flutter/widgets.dart'; +import 'package:scoped_model/scoped_model.dart'; + +/// Model for [FlutterCacheManagerPage] +class FlutterCacheManagerModel extends Model { + /// Get [ScopedModel] + static FlutterCacheManagerModel of(BuildContext context) => ScopedModel.of(context); +} \ No newline at end of file diff --git a/example/lib/packages/flutter_cache_manager/package.dart b/example/lib/packages/flutter_cache_manager/package.dart new file mode 100644 index 0000000..71452e8 --- /dev/null +++ b/example/lib/packages/flutter_cache_manager/package.dart @@ -0,0 +1,25 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/flutter_cache_manager/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageFlutterCacheManager = PackagePage( + key: 'flutter_cache_manager', + descEN: ''' + CacheManager v2 introduced some breaking changes when configuring + a custom CacheManager. + ''', + descRU: ''' + В CacheManager v2 были внесены некоторые критические изменения при + настройке пользовательского CacheManager. + ''', + version: '3.3.0', + isPlatformDependent: true, + page: () => FlutterCacheManagerPage(), + init: () { + GetIt.instance.registerFactory( + () => FlutterCacheManagerModel()); + }, +); diff --git a/example/lib/packages/flutter_cache_manager/page.dart b/example/lib/packages/flutter_cache_manager/page.dart new file mode 100644 index 0000000..be1249d --- /dev/null +++ b/example/lib/packages/flutter_cache_manager/page.dart @@ -0,0 +1,28 @@ +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/layouts/block_layout.dart'; + +class FlutterCacheManagerPage extends StatefulWidget { + FlutterCacheManagerPage({ + super.key, + }); + + final Package package = packageFlutterCacheManager; + + @override + State createState() => + _FlutterCacheManagerPageState(); +} + +class _FlutterCacheManagerPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/flutter_local_notifications/model.dart b/example/lib/packages/flutter_local_notifications/model.dart similarity index 100% rename from example/lib/pages/flutter_local_notifications/model.dart rename to example/lib/packages/flutter_local_notifications/model.dart diff --git a/example/lib/packages/flutter_local_notifications/package.dart b/example/lib/packages/flutter_local_notifications/package.dart new file mode 100644 index 0000000..ededa37 --- /dev/null +++ b/example/lib/packages/flutter_local_notifications/package.dart @@ -0,0 +1,23 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/flutter_local_notifications/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageFlutterLocalNotifications = PackagePage( + key: 'flutter_local_notifications', + descEN: ''' + A cross platform plugin for displaying local notifications. + ''', + descRU: ''' + Кроссплатформенный плагин для отображения локальных уведомлений. + ''', + version: '14.1.1', + isPlatformDependent: true, + page: () => FlutterLocalNotificationsPage(), + init: () { + GetIt.instance.registerFactory( + () => FlutterLocalNotificationsModel()); + }, +); diff --git a/example/lib/packages/flutter_local_notifications/page.dart b/example/lib/packages/flutter_local_notifications/page.dart new file mode 100644 index 0000000..f63fe9f --- /dev/null +++ b/example/lib/packages/flutter_local_notifications/page.dart @@ -0,0 +1,29 @@ +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/layouts/block_layout.dart'; + +class FlutterLocalNotificationsPage extends StatefulWidget { + FlutterLocalNotificationsPage({ + super.key, + }); + + final Package package = packageFlutterLocalNotifications; + + @override + State createState() => + _FlutterLocalNotificationsPageState(); +} + +class _FlutterLocalNotificationsPageState + extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/flutter_secure_storage/model.dart b/example/lib/packages/flutter_secure_storage/model.dart similarity index 100% rename from example/lib/pages/flutter_secure_storage/model.dart rename to example/lib/packages/flutter_secure_storage/model.dart diff --git a/example/lib/packages/flutter_secure_storage/package.dart b/example/lib/packages/flutter_secure_storage/package.dart new file mode 100644 index 0000000..7ed8ad0 --- /dev/null +++ b/example/lib/packages/flutter_secure_storage/package.dart @@ -0,0 +1,23 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/flutter_secure_storage/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageFlutterSecureStorage = PackagePage( + key: 'flutter_secure_storage', + descEN: ''' + Flutter Secure Storage provides API to store data in secure storage. + ''', + descRU: ''' + Flutter Secure Storage предоставляет API для хранения данных в безопасном хранилище. + ''', + version: '8.0.0', + isPlatformDependent: true, + page: () => FlutterSecureStoragePage(), + init: () { + GetIt.instance.registerFactory( + () => FlutterSecureStorageModel()); + }, +); diff --git a/example/lib/packages/flutter_secure_storage/page.dart b/example/lib/packages/flutter_secure_storage/page.dart new file mode 100644 index 0000000..c502819 --- /dev/null +++ b/example/lib/packages/flutter_secure_storage/page.dart @@ -0,0 +1,29 @@ +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/widgets/layouts/block_layout.dart'; + +import 'package.dart'; + +class FlutterSecureStoragePage extends StatefulWidget { + FlutterSecureStoragePage({ + super.key, + }); + + final Package package = packageFlutterSecureStorage; + + @override + State createState() => + _FlutterSecureStoragePageState(); +} + +class _FlutterSecureStoragePageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/packages/get_it/package.dart b/example/lib/packages/get_it/package.dart new file mode 100644 index 0000000..2bedc14 --- /dev/null +++ b/example/lib/packages/get_it/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +/// Package values +final packageGetIt = PackageDialog( + key: 'get_it', + descEN: ''' + This is a simple Service Locator for Dart and Flutter projects with some + additional goodies highly inspired by Splat. + ''', + descRU: ''' + Это простой сервис-локатор для проектов Dart и Flutter с некоторыми + дополнительные вкусности, вдохновленные Splat. + ''', + messageEN: ''' + This is a platform independent plugin used in this app, should work + for you too. + ''', + messageRU: ''' + Это плагин независимый от платформы, используется в этом приложении, + должен работать и у вас. + ''', + version: '7.6.0', + isPlatformDependent: false, +); diff --git a/example/lib/pages/package_info_plus/model.dart b/example/lib/packages/package_info_plus/model.dart similarity index 100% rename from example/lib/pages/package_info_plus/model.dart rename to example/lib/packages/package_info_plus/model.dart diff --git a/example/lib/packages/package_info_plus/package.dart b/example/lib/packages/package_info_plus/package.dart new file mode 100644 index 0000000..9c8c345 --- /dev/null +++ b/example/lib/packages/package_info_plus/package.dart @@ -0,0 +1,25 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/package_info_plus/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packagePackageInfoPlus = PackagePage( + key: 'package_info_plus', + descEN: ''' + This Flutter plugin provides an API for querying information about + an application package. + ''', + descRU: ''' + Этот плагин Flutter предоставляет API для запроса информации о + пакете приложения. + ''', + version: '3.2.3', + isPlatformDependent: true, + page: () => PackageInfoPlusPage(), + init: () { + GetIt.instance + .registerFactory(() => PackageInfoPlusModel()); + }, +); diff --git a/example/lib/packages/package_info_plus/page.dart b/example/lib/packages/package_info_plus/page.dart new file mode 100644 index 0000000..0a02708 --- /dev/null +++ b/example/lib/packages/package_info_plus/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class PackageInfoPlusPage extends StatefulWidget { + PackageInfoPlusPage({ + super.key, + }); + + final Package package = packagePackageInfoPlus; + + @override + State createState() => _PackageInfoPlusPageState(); +} + +class _PackageInfoPlusPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/packages/packages.dart b/example/lib/packages/packages.dart new file mode 100644 index 0000000..793886e --- /dev/null +++ b/example/lib/packages/packages.dart @@ -0,0 +1,30 @@ +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/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/package_info_plus/package.dart'; +import 'package:flutter_example_packages/packages/path_provider/package.dart'; +import 'package:flutter_example_packages/packages/shared_preferences/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, + packageDeviceInfoPlus, + packageFlutterCacheManager, + packageFlutterLocalNotifications, + packageFlutterSecureStorage, + packageGetIt, + packagePackageInfoPlus, + packagePathProvider, + packageSharedPreferences, + packageWakelock, + packageXdgaDirectories, +]; diff --git a/example/lib/pages/path_provider/model.dart b/example/lib/packages/path_provider/model.dart similarity index 100% rename from example/lib/pages/path_provider/model.dart rename to example/lib/packages/path_provider/model.dart diff --git a/example/lib/packages/path_provider/package.dart b/example/lib/packages/path_provider/package.dart new file mode 100644 index 0000000..e946d8f --- /dev/null +++ b/example/lib/packages/path_provider/package.dart @@ -0,0 +1,27 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/path_provider/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packagePathProvider = PackagePage( + key: 'path_provider', + descEN: ''' + A Flutter plugin for finding commonly used locations on the filesystem. + Supports Android, iOS, Linux, macOS, Windows and Aurora OS. + Not all methods are supported on all platforms. + ''', + descRU: ''' + Плагин Flutter для поиска часто используемых мест в файловой системе. + Поддерживает Android, iOS, Linux, macOS, Windows и ОС Aurora. + Не все методы поддерживаются на всех платформах. + ''', + version: '2.0.15', + isPlatformDependent: true, + page: () => PathProviderPage(), + init: () { + GetIt.instance + .registerFactory(() => PathProviderModel()); + }, +); diff --git a/example/lib/packages/path_provider/page.dart b/example/lib/packages/path_provider/page.dart new file mode 100644 index 0000000..b443716 --- /dev/null +++ b/example/lib/packages/path_provider/page.dart @@ -0,0 +1,25 @@ +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/layouts/block_layout.dart'; + +class PathProviderPage extends StatefulWidget { + PathProviderPage({super.key}); + + final Package package = packagePathProvider; + + @override + State createState() => _PathProviderPageState(); +} + +class _PathProviderPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/shared_preferences/model.dart b/example/lib/packages/shared_preferences/model.dart similarity index 100% rename from example/lib/pages/shared_preferences/model.dart rename to example/lib/packages/shared_preferences/model.dart diff --git a/example/lib/packages/shared_preferences/package.dart b/example/lib/packages/shared_preferences/package.dart new file mode 100644 index 0000000..9cb5e03 --- /dev/null +++ b/example/lib/packages/shared_preferences/package.dart @@ -0,0 +1,23 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/shared_preferences/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageSharedPreferences = PackagePage( + key: 'shared_preferences', + descEN: ''' + Wraps platform-specific persistent storage for simple data. + ''', + descRU: ''' + Обертывает постоянное хранилище для конкретных платформ для простых данных. + ''', + version: '2.1.2', + isPlatformDependent: true, + page: () => SharedPreferencesPage(), + init: () { + GetIt.instance.registerFactory( + () => SharedPreferencesModel()); + }, +); diff --git a/example/lib/packages/shared_preferences/page.dart b/example/lib/packages/shared_preferences/page.dart new file mode 100644 index 0000000..6954810 --- /dev/null +++ b/example/lib/packages/shared_preferences/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class SharedPreferencesPage extends StatefulWidget { + SharedPreferencesPage({ + super.key, + }); + + final Package package = packageSharedPreferences; + + @override + State createState() => _SharedPreferencesPageState(); +} + +class _SharedPreferencesPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/wakelock/model.dart b/example/lib/packages/wakelock/model.dart similarity index 100% rename from example/lib/pages/wakelock/model.dart rename to example/lib/packages/wakelock/model.dart diff --git a/example/lib/packages/wakelock/package.dart b/example/lib/packages/wakelock/package.dart new file mode 100644 index 0000000..418aad0 --- /dev/null +++ b/example/lib/packages/wakelock/package.dart @@ -0,0 +1,24 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/wakelock/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageWakelock = PackagePage( + key: 'wakelock', + descEN: ''' + Plugin that allows you to keep the device screen awake, i.e. + prevent the screen from sleeping. + ''', + descRU: ''' + Плагин, который позволяет держать экран устройства в активном состоянии, + т. е. предотвращать переход экрана в спящий режим. + ''', + version: '0.6.2', + isPlatformDependent: true, + page: () => WakelockPage(), + init: () { + GetIt.instance.registerFactory(() => WakelockModel()); + }, +); diff --git a/example/lib/packages/wakelock/page.dart b/example/lib/packages/wakelock/page.dart new file mode 100644 index 0000000..a3b69c4 --- /dev/null +++ b/example/lib/packages/wakelock/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class WakelockPage extends StatefulWidget { + WakelockPage({ + super.key, + }); + + final Package package = packageWakelock; + + @override + State createState() => _WakelockPageState(); +} + +class _WakelockPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/xdga_directories/model.dart b/example/lib/packages/xdga_directories/model.dart similarity index 100% rename from example/lib/pages/xdga_directories/model.dart rename to example/lib/packages/xdga_directories/model.dart diff --git a/example/lib/packages/xdga_directories/package.dart b/example/lib/packages/xdga_directories/package.dart new file mode 100644 index 0000000..e6ad2cd --- /dev/null +++ b/example/lib/packages/xdga_directories/package.dart @@ -0,0 +1,25 @@ +import 'package:flutter_example_packages/base/package/package_page.dart'; +import 'package:flutter_example_packages/packages/xdga_directories/page.dart'; +import 'package:get_it/get_it.dart'; + +import 'model.dart'; + +/// Package values +final packageXdgaDirectories = PackagePage( + key: 'xdga_directories', + descEN: ''' + A Dart package for reading XDG directory configuration information + on Aurora OS. + ''', + descRU: ''' + Пакет Dart для чтения информации о конфигурации каталога XDG + на ОС Аврора. + ''', + version: '0.0.1', + isPlatformDependent: true, + page: () => XdgaDirectoriesPage(), + init: () { + GetIt.instance + .registerFactory(() => XdgaDirectoriesModel()); + }, +); diff --git a/example/lib/packages/xdga_directories/page.dart b/example/lib/packages/xdga_directories/page.dart new file mode 100644 index 0000000..e0dd17b --- /dev/null +++ b/example/lib/packages/xdga_directories/page.dart @@ -0,0 +1,27 @@ +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/layouts/block_layout.dart'; + +class XdgaDirectoriesPage extends StatefulWidget { + XdgaDirectoriesPage({ + super.key, + }); + + final Package package = packageXdgaDirectories; + + @override + State createState() => _XdgaDirectoriesPageState(); +} + +class _XdgaDirectoriesPageState extends State { + @override + Widget build(BuildContext context) { + return BlockLayout( + title: widget.package.key, + builder: (context, child, model) { + return Text(widget.package.desc); + }); + } +} diff --git a/example/lib/pages/battery_plus/page.dart b/example/lib/pages/battery_plus/page.dart deleted file mode 100644 index 508e192..0000000 --- a/example/lib/pages/battery_plus/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/battery_plus/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class BatteryPlusPage extends StatefulWidget { - const BatteryPlusPage({ - super.key, - }); - - @override - State createState() => _BatteryPlusPageState(); -} - -class _BatteryPlusPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/device_info_plus/page.dart b/example/lib/pages/device_info_plus/page.dart deleted file mode 100644 index 1d93280..0000000 --- a/example/lib/pages/device_info_plus/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/device_info_plus/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class DeviceInfoPlusPage extends StatefulWidget { - const DeviceInfoPlusPage({ - super.key, - }); - - @override - State createState() => _DeviceInfoPlusPageState(); -} - -class _DeviceInfoPlusPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/flutter_local_notifications/page.dart b/example/lib/pages/flutter_local_notifications/page.dart deleted file mode 100644 index 627dbd1..0000000 --- a/example/lib/pages/flutter_local_notifications/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/flutter_local_notifications/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class FlutterLocalNotificationsPage extends StatefulWidget { - const FlutterLocalNotificationsPage({ - super.key, - }); - - @override - State createState() => _FlutterLocalNotificationsPageState(); -} - -class _FlutterLocalNotificationsPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/flutter_secure_storage/page.dart b/example/lib/pages/flutter_secure_storage/page.dart deleted file mode 100644 index 7074e2a..0000000 --- a/example/lib/pages/flutter_secure_storage/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/flutter_secure_storage/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class FlutterSecureStoragePage extends StatefulWidget { - const FlutterSecureStoragePage({ - super.key, - }); - - @override - State createState() => _FlutterSecureStoragePageState(); -} - -class _FlutterSecureStoragePageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/home/page.dart b/example/lib/pages/home/page.dart index 1aca288..70860f9 100644 --- a/example/lib/pages/home/page.dart +++ b/example/lib/pages/home/page.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.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/package_list_item.dart'; import 'package:flutter_example_packages/theme/colors.dart'; -import 'package:flutter_example_packages/theme/radius.dart'; -import 'package:flutter_example_packages/widgets/layouts/page_layout.dart'; +import 'package:flutter_example_packages/widgets/layouts/block_layout.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:scoped_model/scoped_model.dart'; class HomePage extends StatefulWidget { const HomePage({ @@ -36,6 +35,11 @@ class _HomePageState extends State { _hH = _header.getHeight() ?? 0; }); }); + Future.delayed(const Duration(milliseconds: 500), () { + setState(() { + _hH = _header.getHeight() ?? 0; + }); + }); })); } @@ -43,195 +47,78 @@ class _HomePageState extends State { Widget build(BuildContext context) { final theme = Theme.of(context); final localizations = AppLocalizations.of(context)!; - - return PageLayout( - child: ScopedModel( - model: getIt(), - child: ScopedModelDescendant( - builder: (context, child, model) { - return 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.only( - left: 20, right: 20, top: 0, bottom: 40), - child: Opacity( - opacity: 0.3, - child: Image.asset( - 'images/logo-head.png', - width: 250, - ), - ), + 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, ), ), ), ), - Container( - key: _header, - width: double.infinity, - padding: const EdgeInsets.only( - left: 20, right: 20, top: 30, bottom: 120), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Welcome!", - textAlign: TextAlign.left, - style: theme.textTheme.titleLarge?.copyWith( - color: const Color(0xFF3c67b5), - ), - ), - const SizedBox(height: 50), - Text( - "In this application you can find 100500 plugins supporting Aurors OS. If it happens that something is missing for you, you can write to us or add it yourself.", - textAlign: TextAlign.left, - style: theme.textTheme.bodyLarge?.copyWith( - color: const Color(0xFF3c67b5), - height: 1.5, - ), - ), - ], + ), + ), + Container( + key: _header, + width: double.infinity, + padding: const EdgeInsets.only( + left: 20, + right: 20, + top: 60, + bottom: 80, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + localizations.homeWelcomeTitle, + textAlign: TextAlign.left, + style: theme.textTheme.titleLarge?.copyWith( + color: AppColors.primaryDark, + ), ), - ), - ListView.builder( - padding: EdgeInsets.only(top: _hH > 0 ? _hH - 16 : 0), - itemCount: 20, - itemBuilder: (context, index) { - final i = index; - return Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: i == 0 - ? const BorderRadius.only( - topLeft: Radius.circular(20), - topRight: Radius.circular(20), - ) - : null, - ), - child: Padding( - padding: i == 0 - ? const EdgeInsets.only( - left: 20, right: 20, top: 20, bottom: 0) - : const EdgeInsets.symmetric(horizontal: 20), - child: Column( - children: [ - Stack( - children: [ - Padding( - padding: const EdgeInsets.only(top: 10), - child: Stack( - children: [ - SizedBox( - width: double.infinity, - child: Card( - child: Padding( - padding: const EdgeInsets.all(20), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'battery_plus', - textAlign: TextAlign.left, - style: theme - .textTheme.titleSmall, - ), - const SizedBox(height: 10), - Text( - 'A Flutter plugin to access various information about the battery of the device the app is running on.', - textAlign: TextAlign.left, - style: theme - .textTheme.bodyMedium - ?.copyWith( - color: Colors.black - .withOpacity( - 0.6)), - ), - const SizedBox(height: 12), - Divider( - height: 1, - color: - const Color(0xFF3c67b5) - .withOpacity(0.2)), - const SizedBox(height: 12), - Text( - 'Version: 4.0.1', - textAlign: TextAlign.left, - style: theme.textTheme.caption - ?.copyWith( - color: const Color( - 0xFF3c67b5) - .withOpacity( - 0.7)), - ), - ], - ), - ), - ), - ), - Positioned.fill( - child: Material( - color: Colors.transparent, - child: InkWell( - customBorder: - RoundedRectangleBorder( - borderRadius: AppRadius.small, - ), - hoverColor: Colors.transparent, - onTap: () => debugPrint("click"), - ), - ), - ), - ], - ), - ), - Align( - alignment: FractionalOffset.topRight, - child: Container( - margin: const EdgeInsets.only(right: 16), - decoration: BoxDecoration( - color: i % 2 == 0 - ? Colors.orange - : Colors.blueAccent, - borderRadius: AppRadius.small, - ), - child: Padding( - padding: const EdgeInsets.all(6), - child: Text( - i % 2 == 0 - ? 'platform dependent' - : 'platform independent', - textAlign: TextAlign.left, - style: - theme.textTheme.caption?.copyWith( - color: Colors.white, - fontWeight: FontWeight.w100, - ), - ), - ), - ), - ), - ], - ), - const SizedBox(height: 20), - ], - ), - ), - ); - }, - ), - ], - ); - }, + const SizedBox(height: 50), + Text( + localizations.homeWelcomeText, + textAlign: TextAlign.left, + style: theme.textTheme.bodyLarge?.copyWith( + color: AppColors.primaryDark, + height: 1.5, + ), + ), + ], + ), + ), + 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/package_info_dialog.dart b/example/lib/pages/home/widgets/package_info_dialog.dart new file mode 100644 index 0000000..73e269e --- /dev/null +++ b/example/lib/pages/home/widgets/package_info_dialog.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/package/package_dialog.dart'; + +class PackageInfoDialog extends StatelessWidget { + const PackageInfoDialog({ + super.key, + required this.package, + }); + + final PackageDialog package; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Dialog( + 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, + ), + const SizedBox(height: 15), + Text( + package.message, + textAlign: TextAlign.left, + style: theme.textTheme.bodyLarge?.copyWith( + height: 1.5, + ), + ), + const SizedBox(height: 20), + Row( + children: [ + const Spacer(), + OutlinedButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text("Close"), + ), + + ], + + ), + + ], + ), + ), + ); + } +} diff --git a/example/lib/pages/home/widgets/package_list_item.dart b/example/lib/pages/home/widgets/package_list_item.dart new file mode 100644 index 0000000..fab01b5 --- /dev/null +++ b/example/lib/pages/home/widgets/package_list_item.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_example_packages/base/package/package.dart'; +import 'package:flutter_example_packages/base/package/package_dialog.dart'; +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_gen/gen_l10n/app_localizations.dart'; + +class PackageListItemWidget extends StatelessWidget { + const PackageListItemWidget({ + super.key, + required this.index, + required this.item, + }); + + final int index; + final Package item; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + final localizations = AppLocalizations.of(context)!; + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: index == 0 + ? const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20), + ) + : null, + ), + child: Padding( + padding: index == 0 + ? const EdgeInsets.only(left: 20, right: 20, top: 20, bottom: 0) + : const EdgeInsets.symmetric(horizontal: 20), + child: Column( + children: [ + Stack( + children: [ + Padding( + padding: const EdgeInsets.only(top: 10), + child: Stack( + children: [ + SizedBox( + width: double.infinity, + child: Card( + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item.key, + textAlign: TextAlign.left, + style: theme.textTheme.titleSmall, + ), + const SizedBox(height: 10), + Text( + item.desc, + textAlign: TextAlign.left, + style: theme.textTheme.bodyMedium?.copyWith( + color: Colors.black.withOpacity(0.6)), + ), + const SizedBox(height: 12), + Divider( + height: 1, + color: + AppColors.primaryDark.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)), + ), + ], + ), + ), + ), + ), + Positioned.fill( + child: Material( + color: Colors.transparent, + child: InkWell( + customBorder: RoundedRectangleBorder( + borderRadius: AppRadius.small, + ), + hoverColor: Colors.transparent, + onTap: () { + if (item is PackagePage) { + Navigator.pushNamed(context, '/${item.key}'); + } else if (item is PackageDialog) { + showDialog( + context: context, + builder: (BuildContext context) { + return PackageInfoDialog( + package: item as PackageDialog, + ); + }); + } + }, + ), + ), + ), + ], + ), + ), + Align( + alignment: FractionalOffset.topRight, + child: Container( + margin: const EdgeInsets.only(right: 16), + decoration: BoxDecoration( + color: item.isPlatformDependent + ? Colors.orange + : Colors.blueAccent, + borderRadius: AppRadius.small, + ), + child: Padding( + padding: const EdgeInsets.only( + left: 6, + top: 3, + right: 6, + bottom: 6, + ), + child: Text( + item.isPlatformDependent + ? localizations.homeListStateDependent + : localizations.homeListStateIndependent, + textAlign: TextAlign.left, + style: theme.textTheme.caption?.copyWith( + color: Colors.white, + fontWeight: FontWeight.w100, + ), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 20), + ], + ), + ), + ); + } +} diff --git a/example/lib/pages/package_info_plus/page.dart b/example/lib/pages/package_info_plus/page.dart deleted file mode 100644 index 92f1f74..0000000 --- a/example/lib/pages/package_info_plus/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/package_info_plus/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class PackageInfoPlusPage extends StatefulWidget { - const PackageInfoPlusPage({ - super.key, - }); - - @override - State createState() => _PackageInfoPlusPageState(); -} - -class _PackageInfoPlusPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/path_provider/page.dart b/example/lib/pages/path_provider/page.dart deleted file mode 100644 index b46b211..0000000 --- a/example/lib/pages/path_provider/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/path_provider/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class PathProviderPage extends StatefulWidget { - const PathProviderPage({ - super.key, - }); - - @override - State createState() => _PathProviderPageState(); -} - -class _PathProviderPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/shared_preferences/page.dart b/example/lib/pages/shared_preferences/page.dart deleted file mode 100644 index edcfb68..0000000 --- a/example/lib/pages/shared_preferences/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/shared_preferences/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class SharedPreferencesPage extends StatefulWidget { - const SharedPreferencesPage({ - super.key, - }); - - @override - State createState() => _SharedPreferencesPageState(); -} - -class _SharedPreferencesPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/wakelock/page.dart b/example/lib/pages/wakelock/page.dart deleted file mode 100644 index 14e4d22..0000000 --- a/example/lib/pages/wakelock/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/wakelock/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class WakelockPage extends StatefulWidget { - const WakelockPage({ - super.key, - }); - - @override - State createState() => _WakelockPageState(); -} - -class _WakelockPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/pages/xdga_directories/page.dart b/example/lib/pages/xdga_directories/page.dart deleted file mode 100644 index 7994581..0000000 --- a/example/lib/pages/xdga_directories/page.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/base/di/app_di.dart'; -import 'package:flutter_example_packages/pages/xdga_directories/model.dart'; -import 'package:scoped_model/scoped_model.dart'; - -class XdgaDirectoriesPage extends StatefulWidget { - const XdgaDirectoriesPage({ - super.key, - }); - - @override - State createState() => _XdgaDirectoriesPageState(); -} - -class _XdgaDirectoriesPageState extends State { - @override - Widget build(BuildContext context) { - return ScopedModel( - model: getIt(), - child: ScopedModelDescendant(builder: (context, child, model) { - return Wrap( - spacing: 20, - runSpacing: 20, - children: const [ - Text("data"), - ], - ); - }), - ); - } -} \ No newline at end of file diff --git a/example/lib/theme/colors.dart b/example/lib/theme/colors.dart index aa7e37f..3048166 100644 --- a/example/lib/theme/colors.dart +++ b/example/lib/theme/colors.dart @@ -2,6 +2,7 @@ import 'dart:ui'; class AppColors { static const Color primary = Color(0xFFCBDCF8); + static const Color primaryDark = Color(0xFF3c67b5); static const Color secondary = Color(0xFF00b3ad); static const Color warning = Color(0xFFfb7d4a); } diff --git a/example/lib/theme/theme.dart b/example/lib/theme/theme.dart index e4a313f..39900cf 100644 --- a/example/lib/theme/theme.dart +++ b/example/lib/theme/theme.dart @@ -18,14 +18,38 @@ final appTheme = ThemeData( ), ), + /// [OutlinedButton] + outlinedButtonTheme: OutlinedButtonThemeData( + style: ButtonStyle( + foregroundColor: MaterialStateProperty.resolveWith( + (Set states) { + if (states.contains(MaterialState.disabled)) { + return AppColors.secondary.withOpacity(0.4); + } else { + return AppColors.secondary; + } + } + ), + side: MaterialStateProperty.resolveWith( + (Set states) { + if (states.contains(MaterialState.disabled)) { + return BorderSide(color: AppColors.secondary.withOpacity(0.4)); + } else { + return const BorderSide(color: AppColors.secondary); + } + } + ), + ), + ), + /// [Text] textTheme: TextTheme( headlineLarge: GoogleFonts.ubuntu( - fontSize: 60, + fontSize: 44, fontWeight: FontWeight.bold, ), headlineMedium: GoogleFonts.ubuntu( - fontSize: 40, + fontSize: 36, fontWeight: FontWeight.bold, ), headlineSmall: GoogleFonts.ubuntu( @@ -33,22 +57,25 @@ final appTheme = ThemeData( fontWeight: FontWeight.bold, ), titleLarge: GoogleFonts.ubuntu( - fontSize: 60, + fontSize: 44, ), titleMedium: GoogleFonts.ubuntu( - fontSize: 40, + fontSize: 36, ), titleSmall: GoogleFonts.ubuntu( fontSize: 24, ), bodyLarge: GoogleFonts.ubuntu( fontSize: 18, + height: 1.5, ), bodyMedium: GoogleFonts.ubuntu( fontSize: 16, + height: 1.5, ), bodySmall: GoogleFonts.ubuntu( fontSize: 12, + height: 1.5, ), ), ); diff --git a/example/lib/widgets/layouts/block_layout.dart b/example/lib/widgets/layouts/block_layout.dart new file mode 100644 index 0000000..6d8c137 --- /dev/null +++ b/example/lib/widgets/layouts/block_layout.dart @@ -0,0 +1,40 @@ +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:scoped_model/scoped_model.dart'; + +class BlockLayout extends StatelessWidget { + const BlockLayout({ + super.key, + this.title, + required this.builder, + }); + + final String? title; + final Widget Function(BuildContext context, Widget? child, T model) builder; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + 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), + ), + ), + body: Padding( + padding: EdgeInsets.all(title == null ? 0 : 20), + child: builder.call(context, child, model), + ), + ); + }), + ); + } +} diff --git a/example/lib/widgets/layouts/page_layout.dart b/example/lib/widgets/layouts/page_layout.dart index 8c4daa1..543bae3 100644 --- a/example/lib/widgets/layouts/page_layout.dart +++ b/example/lib/widgets/layouts/page_layout.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_example_packages/model.dart'; +import 'package:flutter_example_packages/base/app/model.dart'; import 'package:scoped_model/scoped_model.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class PageLayout extends StatefulWidget { const PageLayout({ @@ -18,18 +17,12 @@ class PageLayout extends StatefulWidget { class _PageLayoutState extends State { @override Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; return ScopedModelDescendant(builder: (context, child, model) { return Localizations.override( context: context, child: Builder( builder: (context) { - return Scaffold( - appBar: AppBar( - elevation: 0, - ), - body: widget.child, - ); + return widget.child; }, ), ); diff --git a/example/pubspec.lock b/example/pubspec.lock index 920d1cf..6a679dc 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -560,6 +560,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.2" + universal_io: + dependency: "direct main" + description: + name: universal_io + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" vector_math: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index dfa734e..88ab1f1 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -13,11 +13,6 @@ dependencies: sdk: flutter flutter_localizations: sdk: flutter - #################################### - ## Platform dependent plugins Aurora OS - - #################################### - ## Package verified cupertino_icons: ^1.0.2 google_fonts: ^4.0.3 scoped_model: ^2.0.0 @@ -25,13 +20,12 @@ dependencies: json_annotation: ^4.8.0 ffi: ^2.0.2 intl: ^0.17.0 + universal_io: ^2.2.0 dev_dependencies: flutter_test: sdk: flutter - #################################### - ## Package verified flutter_lints: ^2.0.0 build_runner: ^2.3.3 json_serializable: ^6.6.1 @@ -42,4 +36,4 @@ flutter: uses-material-design: true assets: - assets/ - - assets/images/ + - assets/images/ \ No newline at end of file diff --git a/example/run.sh b/example/run.sh index 0ff40b8..6addfd2 100755 --- a/example/run.sh +++ b/example/run.sh @@ -36,7 +36,7 @@ done $FLUTTER pub get ## Generate internationalizing -$FLUTTER gen-l10n +$FLUTTER pub run build_runner build ## Run ffigen # $FLUTTER pub run ffigen