64 changed files with 1137 additions and 523 deletions
@ -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; |
||||
} |
@ -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; |
||||
} |
@ -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; |
||||
} |
@ -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" |
||||
} |
||||
} |
||||
} |
||||
} |
@ -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" |
||||
} |
||||
} |
||||
} |
||||
} |
@ -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()); |
||||
}, |
||||
); |
@ -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); |
||||
}); |
||||
} |
||||
} |
@ -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); |
||||
} |
@ -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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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); |
||||
}); |
||||
} |
||||
} |
@ -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); |
||||
} |
@ -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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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); |
||||
}); |
||||
} |
||||
} |
@ -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,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()); |
||||
}, |
||||
); |
@ -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); |
||||
}); |
||||
} |
||||
} |
@ -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,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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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,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()); |
||||
}, |
||||
); |
@ -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); |
||||
}); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
), |
||||
|
||||
], |
||||
|
||||
), |
||||
|
||||
], |
||||
), |
||||
), |
||||
); |
||||
} |
||||
} |
@ -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), |
||||
], |
||||
), |
||||
), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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"), |
||||
], |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
@ -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), |
||||
), |
||||
); |
||||
}), |
||||
); |
||||
} |
||||
} |
Loading…
Reference in new issue