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