Browse Source

[flutter_example_packages] Add pages, dialog, refactoring

merge-requests/21/head
Vitaliy Zarubin 2 years ago
parent
commit
07864d77bc
  1. 28
      example/lib/base/app/app.dart
  2. 0
      example/lib/base/app/model.dart
  3. 26
      example/lib/base/di/app_di.dart
  4. 32
      example/lib/base/package/package.dart
  5. 26
      example/lib/base/package/package_dialog.dart
  6. 23
      example/lib/base/package/package_page.dart
  7. 15
      example/lib/l10n/app_en.arb
  8. 15
      example/lib/l10n/app_ru.arb
  9. 2
      example/lib/main.dart
  10. 2
      example/lib/main.release.dart
  11. 0
      example/lib/packages/battery_plus/model.dart
  12. 24
      example/lib/packages/battery_plus/package.dart
  13. 27
      example/lib/packages/battery_plus/page.dart
  14. 8
      example/lib/packages/cached_network_image/model.dart
  15. 25
      example/lib/packages/cached_network_image/package.dart
  16. 27
      example/lib/packages/cached_network_image/page.dart
  17. 0
      example/lib/packages/device_info_plus/model.dart
  18. 23
      example/lib/packages/device_info_plus/package.dart
  19. 27
      example/lib/packages/device_info_plus/page.dart
  20. 8
      example/lib/packages/flutter_cache_manager/model.dart
  21. 25
      example/lib/packages/flutter_cache_manager/package.dart
  22. 28
      example/lib/packages/flutter_cache_manager/page.dart
  23. 0
      example/lib/packages/flutter_local_notifications/model.dart
  24. 23
      example/lib/packages/flutter_local_notifications/package.dart
  25. 29
      example/lib/packages/flutter_local_notifications/page.dart
  26. 0
      example/lib/packages/flutter_secure_storage/model.dart
  27. 23
      example/lib/packages/flutter_secure_storage/package.dart
  28. 29
      example/lib/packages/flutter_secure_storage/page.dart
  29. 24
      example/lib/packages/get_it/package.dart
  30. 0
      example/lib/packages/package_info_plus/model.dart
  31. 25
      example/lib/packages/package_info_plus/package.dart
  32. 27
      example/lib/packages/package_info_plus/page.dart
  33. 30
      example/lib/packages/packages.dart
  34. 0
      example/lib/packages/path_provider/model.dart
  35. 27
      example/lib/packages/path_provider/package.dart
  36. 25
      example/lib/packages/path_provider/page.dart
  37. 0
      example/lib/packages/shared_preferences/model.dart
  38. 23
      example/lib/packages/shared_preferences/package.dart
  39. 27
      example/lib/packages/shared_preferences/page.dart
  40. 0
      example/lib/packages/wakelock/model.dart
  41. 24
      example/lib/packages/wakelock/package.dart
  42. 27
      example/lib/packages/wakelock/page.dart
  43. 0
      example/lib/packages/xdga_directories/model.dart
  44. 25
      example/lib/packages/xdga_directories/package.dart
  45. 27
      example/lib/packages/xdga_directories/page.dart
  46. 31
      example/lib/pages/battery_plus/page.dart
  47. 31
      example/lib/pages/device_info_plus/page.dart
  48. 31
      example/lib/pages/flutter_local_notifications/page.dart
  49. 31
      example/lib/pages/flutter_secure_storage/page.dart
  50. 173
      example/lib/pages/home/page.dart
  51. 56
      example/lib/pages/home/widgets/package_info_dialog.dart
  52. 150
      example/lib/pages/home/widgets/package_list_item.dart
  53. 31
      example/lib/pages/package_info_plus/page.dart
  54. 31
      example/lib/pages/path_provider/page.dart
  55. 31
      example/lib/pages/shared_preferences/page.dart
  56. 31
      example/lib/pages/wakelock/page.dart
  57. 31
      example/lib/pages/xdga_directories/page.dart
  58. 1
      example/lib/theme/colors.dart
  59. 35
      example/lib/theme/theme.dart
  60. 40
      example/lib/widgets/layouts/block_layout.dart
  61. 11
      example/lib/widgets/layouts/page_layout.dart
  62. 7
      example/pubspec.lock
  63. 8
      example/pubspec.yaml
  64. 2
      example/run.sh

28
example/lib/app.dart → 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 = <String, WidgetBuilder>{
'/': (context) => const HomePage(),
};
for (var item in packages) {
if (item is PackagePage) {
routes['/${item.key}'] = (context) => PageLayout(
child: item.page.call(),
);
}
}
return ScopedModel<AppModel>(
model: getIt<AppModel>(),
child: ScopedModelDescendant<AppModel>(
@ -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,
),
),
);

0
example/lib/model.dart → example/lib/base/app/model.dart

26
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<BuildConfig>(config)
..registerSingleton(config)
// pages models
..registerFactory<HomeModel>(() => HomeModel())
..registerFactory<BatteryPlusModel>(() => BatteryPlusModel())
..registerFactory<DeviceInfoPlusModel>(() => DeviceInfoPlusModel())
..registerFactory<FlutterLocalNotificationsModel>(() => FlutterLocalNotificationsModel())
..registerFactory<FlutterSecureStorageModel>(() => FlutterSecureStorageModel())
..registerFactory<PackageInfoPlusModel>(() => PackageInfoPlusModel())
..registerFactory<PathProviderModel>(() => PathProviderModel())
..registerFactory<SharedPreferencesModel>(() => SharedPreferencesModel())
..registerFactory<WakelockModel>(() => WakelockModel())
..registerFactory<XdgaDirectoriesModel>(() => XdgaDirectoriesModel())
..registerFactory(() => HomeModel())
// other
..registerSingleton<AppModel>(AppModel());
..registerSingleton(AppModel());
}

32
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/<KEY>)
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;
}

26
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;
}

23
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;
}

15
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"
}
}
}
}

15
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"
}
}
}
}

2
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';

2
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';

0
example/lib/pages/battery_plus/model.dart → example/lib/packages/battery_plus/model.dart

24
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>(() => BatteryPlusModel());
},
);

27
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<BatteryPlusPage> createState() => _BatteryPlusPageState();
}
class _BatteryPlusPageState extends State<BatteryPlusPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<BatteryPlusModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

8
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<CachedNetworkImageModel>(context);
}

25
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>(
() => CachedNetworkImageModel());
},
);

27
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<CachedNetworkImagePage> createState() => _CachedNetworkImagePageState();
}
class _CachedNetworkImagePageState extends State<CachedNetworkImagePage> {
@override
Widget build(BuildContext context) {
return BlockLayout<CachedNetworkImageModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/device_info_plus/model.dart → example/lib/packages/device_info_plus/model.dart

23
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>(() => DeviceInfoPlusModel());
},
);

27
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<DeviceInfoPlusPage> createState() => _DeviceInfoPlusPageState();
}
class _DeviceInfoPlusPageState extends State<DeviceInfoPlusPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<DeviceInfoPlusModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

8
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<FlutterCacheManagerModel>(context);
}

25
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>(
() => FlutterCacheManagerModel());
},
);

28
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<FlutterCacheManagerPage> createState() =>
_FlutterCacheManagerPageState();
}
class _FlutterCacheManagerPageState extends State<FlutterCacheManagerPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<FlutterCacheManagerModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/flutter_local_notifications/model.dart → example/lib/packages/flutter_local_notifications/model.dart

23
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>(
() => FlutterLocalNotificationsModel());
},
);

29
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<FlutterLocalNotificationsPage> createState() =>
_FlutterLocalNotificationsPageState();
}
class _FlutterLocalNotificationsPageState
extends State<FlutterLocalNotificationsPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<FlutterLocalNotificationsModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/flutter_secure_storage/model.dart → example/lib/packages/flutter_secure_storage/model.dart

23
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>(
() => FlutterSecureStorageModel());
},
);

29
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<FlutterSecureStoragePage> createState() =>
_FlutterSecureStoragePageState();
}
class _FlutterSecureStoragePageState extends State<FlutterSecureStoragePage> {
@override
Widget build(BuildContext context) {
return BlockLayout<FlutterSecureStorageModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

24
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,
);

0
example/lib/pages/package_info_plus/model.dart → example/lib/packages/package_info_plus/model.dart

25
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>(() => PackageInfoPlusModel());
},
);

27
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<PackageInfoPlusPage> createState() => _PackageInfoPlusPageState();
}
class _PackageInfoPlusPageState extends State<PackageInfoPlusPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<PackageInfoPlusModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

30
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 = <Package>[
// Check with preview
packageBatteryPlus,
packageCachedNetworkImage,
packageDeviceInfoPlus,
packageFlutterCacheManager,
packageFlutterLocalNotifications,
packageFlutterSecureStorage,
packageGetIt,
packagePackageInfoPlus,
packagePathProvider,
packageSharedPreferences,
packageWakelock,
packageXdgaDirectories,
];

0
example/lib/pages/path_provider/model.dart → example/lib/packages/path_provider/model.dart

27
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>(() => PathProviderModel());
},
);

25
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<PathProviderPage> createState() => _PathProviderPageState();
}
class _PathProviderPageState extends State<PathProviderPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<PathProviderModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/shared_preferences/model.dart → example/lib/packages/shared_preferences/model.dart

23
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>(
() => SharedPreferencesModel());
},
);

27
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<SharedPreferencesPage> createState() => _SharedPreferencesPageState();
}
class _SharedPreferencesPageState extends State<SharedPreferencesPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<SharedPreferencesModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/wakelock/model.dart → example/lib/packages/wakelock/model.dart

24
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>(() => WakelockModel());
},
);

27
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<WakelockPage> createState() => _WakelockPageState();
}
class _WakelockPageState extends State<WakelockPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<WakelockModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

0
example/lib/pages/xdga_directories/model.dart → example/lib/packages/xdga_directories/model.dart

25
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>(() => XdgaDirectoriesModel());
},
);

27
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<XdgaDirectoriesPage> createState() => _XdgaDirectoriesPageState();
}
class _XdgaDirectoriesPageState extends State<XdgaDirectoriesPage> {
@override
Widget build(BuildContext context) {
return BlockLayout<XdgaDirectoriesModel>(
title: widget.package.key,
builder: (context, child, model) {
return Text(widget.package.desc);
});
}
}

31
example/lib/pages/battery_plus/page.dart

@ -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<BatteryPlusPage> createState() => _BatteryPlusPageState();
}
class _BatteryPlusPageState extends State<BatteryPlusPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<BatteryPlusModel>(
model: getIt<BatteryPlusModel>(),
child: ScopedModelDescendant<BatteryPlusModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/device_info_plus/page.dart

@ -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<DeviceInfoPlusPage> createState() => _DeviceInfoPlusPageState();
}
class _DeviceInfoPlusPageState extends State<DeviceInfoPlusPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<DeviceInfoPlusModel>(
model: getIt<DeviceInfoPlusModel>(),
child: ScopedModelDescendant<DeviceInfoPlusModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/flutter_local_notifications/page.dart

@ -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<FlutterLocalNotificationsPage> createState() => _FlutterLocalNotificationsPageState();
}
class _FlutterLocalNotificationsPageState extends State<FlutterLocalNotificationsPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<FlutterLocalNotificationsModel>(
model: getIt<FlutterLocalNotificationsModel>(),
child: ScopedModelDescendant<FlutterLocalNotificationsModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/flutter_secure_storage/page.dart

@ -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<FlutterSecureStoragePage> createState() => _FlutterSecureStoragePageState();
}
class _FlutterSecureStoragePageState extends State<FlutterSecureStoragePage> {
@override
Widget build(BuildContext context) {
return ScopedModel<FlutterSecureStorageModel>(
model: getIt<FlutterSecureStorageModel>(),
child: ScopedModelDescendant<FlutterSecureStorageModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

173
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<HomePage> {
_hH = _header.getHeight() ?? 0;
});
});
Future.delayed(const Duration(milliseconds: 500), () {
setState(() {
_hH = _header.getHeight() ?? 0;
});
});
}));
}
@ -43,13 +47,9 @@ class _HomePageState extends State<HomePage> {
Widget build(BuildContext context) {
final theme = Theme.of(context);
final localizations = AppLocalizations.of(context)!;
return PageLayout(
child: ScopedModel<HomeModel>(
model: getIt<HomeModel>(),
child: ScopedModelDescendant<HomeModel>(
builder: (context, child, model) {
return Stack(
return BlockLayout<HomeModel>(builder: (context, child, model) {
return Scaffold(
body: Stack(
children: [
Container(
height: _hH > 0 ? _hH : 0,
@ -59,10 +59,12 @@ class _HomePageState extends State<HomePage> {
child: Align(
alignment: FractionalOffset.bottomRight,
child: Padding(
padding: const EdgeInsets.only(
left: 20, right: 20, top: 0, bottom: 40),
padding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 60,
),
child: Opacity(
opacity: 0.3,
opacity: 0.2,
child: Image.asset(
'images/logo-head.png',
width: 250,
@ -76,24 +78,28 @@ class _HomePageState extends State<HomePage> {
key: _header,
width: double.infinity,
padding: const EdgeInsets.only(
left: 20, right: 20, top: 30, bottom: 120),
left: 20,
right: 20,
top: 60,
bottom: 80,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Welcome!",
localizations.homeWelcomeTitle,
textAlign: TextAlign.left,
style: theme.textTheme.titleLarge?.copyWith(
color: const Color(0xFF3c67b5),
color: AppColors.primaryDark,
),
),
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.",
localizations.homeWelcomeText,
textAlign: TextAlign.left,
style: theme.textTheme.bodyLarge?.copyWith(
color: const Color(0xFF3c67b5),
color: AppColors.primaryDark,
height: 1.5,
),
),
@ -102,136 +108,17 @@ class _HomePageState extends State<HomePage> {
),
ListView.builder(
padding: EdgeInsets.only(top: _hH > 0 ? _hH - 16 : 0),
itemCount: 20,
itemCount: packages.length,
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),
],
),
),
return PackageListItemWidget(
index: index,
item: packages[index],
);
},
),
],
);
},
),
),
);
});
}
}

56
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"),
),
],
),
],
),
),
);
}
}

150
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),
],
),
),
);
}
}

31
example/lib/pages/package_info_plus/page.dart

@ -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<PackageInfoPlusPage> createState() => _PackageInfoPlusPageState();
}
class _PackageInfoPlusPageState extends State<PackageInfoPlusPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<PackageInfoPlusModel>(
model: getIt<PackageInfoPlusModel>(),
child: ScopedModelDescendant<PackageInfoPlusModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/path_provider/page.dart

@ -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<PathProviderPage> createState() => _PathProviderPageState();
}
class _PathProviderPageState extends State<PathProviderPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<PathProviderModel>(
model: getIt<PathProviderModel>(),
child: ScopedModelDescendant<PathProviderModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/shared_preferences/page.dart

@ -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<SharedPreferencesPage> createState() => _SharedPreferencesPageState();
}
class _SharedPreferencesPageState extends State<SharedPreferencesPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<SharedPreferencesModel>(
model: getIt<SharedPreferencesModel>(),
child: ScopedModelDescendant<SharedPreferencesModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/wakelock/page.dart

@ -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<WakelockPage> createState() => _WakelockPageState();
}
class _WakelockPageState extends State<WakelockPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<WakelockModel>(
model: getIt<WakelockModel>(),
child: ScopedModelDescendant<WakelockModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

31
example/lib/pages/xdga_directories/page.dart

@ -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<XdgaDirectoriesPage> createState() => _XdgaDirectoriesPageState();
}
class _XdgaDirectoriesPageState extends State<XdgaDirectoriesPage> {
@override
Widget build(BuildContext context) {
return ScopedModel<XdgaDirectoriesModel>(
model: getIt<XdgaDirectoriesModel>(),
child: ScopedModelDescendant<XdgaDirectoriesModel>(builder: (context, child, model) {
return Wrap(
spacing: 20,
runSpacing: 20,
children: const [
Text("data"),
],
);
}),
);
}
}

1
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);
}

35
example/lib/theme/theme.dart

@ -18,14 +18,38 @@ final appTheme = ThemeData(
),
),
/// [OutlinedButton]
outlinedButtonTheme: OutlinedButtonThemeData(
style: ButtonStyle(
foregroundColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
if (states.contains(MaterialState.disabled)) {
return AppColors.secondary.withOpacity(0.4);
} else {
return AppColors.secondary;
}
}
),
side: MaterialStateProperty.resolveWith<BorderSide>(
(Set<MaterialState> 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,
),
),
);

40
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<T extends Model> 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<T>(
model: getIt<T>(),
child: ScopedModelDescendant<T>(builder: (context, child, model) {
return Scaffold(
appBar: title == null ? null : AppBar(
backgroundColor: AppColors.primaryDark,
title: Text(
title!,
textAlign: TextAlign.left,
style: theme.textTheme.titleSmall?.copyWith(color: Colors.white),
),
),
body: Padding(
padding: EdgeInsets.all(title == null ? 0 : 20),
child: builder.call(context, child, model),
),
);
}),
);
}
}

11
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<PageLayout> {
@override
Widget build(BuildContext context) {
final localizations = AppLocalizations.of(context)!;
return ScopedModelDescendant<AppModel>(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;
},
),
);

7
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:

8
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

2
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

Loading…
Cancel
Save