After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,24 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageCupertinoIcons = PackageDialog( |
||||
key: 'cupertino_icons', |
||||
descEN: ''' |
||||
This is an asset repo containing the default set of icon assets |
||||
used by Flutter's Cupertino widgets. |
||||
''', |
||||
descRU: ''' |
||||
Это репозиторий ресурсов, содержащий набор ресурсов значков по умолчанию |
||||
используется виджетами Flutter Cupertino. |
||||
''', |
||||
messageEN: ''' |
||||
This is a platform independent plugin used in this app, should work |
||||
for you too. |
||||
''', |
||||
messageRU: ''' |
||||
Это плагин независимый от платформы, используется в этом приложении, |
||||
должен работать и у вас. |
||||
''', |
||||
version: '1.0.5', |
||||
isPlatformDependent: false, |
||||
); |
@ -0,0 +1,22 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageGoogleFonts = PackageDialog( |
||||
key: 'google_fonts', |
||||
descEN: ''' |
||||
A Flutter package to use fonts from fonts.google.com. |
||||
''', |
||||
descRU: ''' |
||||
Пакет Flutter для использования шрифтов с fonts.google.com. |
||||
''', |
||||
messageEN: ''' |
||||
This is a platform independent plugin used in this app, should work |
||||
for you too. |
||||
''', |
||||
messageRU: ''' |
||||
Это плагин независимый от платформы, используется в этом приложении, |
||||
должен работать и у вас. |
||||
''', |
||||
version: '4.0.4', |
||||
isPlatformDependent: false, |
||||
); |
@ -0,0 +1,26 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageIntl = PackageDialog( |
||||
key: 'intl', |
||||
descEN: ''' |
||||
Provides internationalization and localization facilities, |
||||
including message translation, plurals and genders, |
||||
date/number formatting and parsing, and bidirectional text. |
||||
''', |
||||
descRU: ''' |
||||
Предоставляет средства интернационализации и локализации, |
||||
включая перевод сообщений, множественное число и пол, |
||||
форматирование и разбор даты/числа, а также двунаправленный текст. |
||||
''', |
||||
messageEN: ''' |
||||
This is a platform independent plugin used in this app, should work |
||||
for you too. |
||||
''', |
||||
messageRU: ''' |
||||
Это плагин независимый от платформы, используется в этом приложении, |
||||
должен работать и у вас. |
||||
''', |
||||
version: '0.17.0', |
||||
isPlatformDependent: false, |
||||
); |
@ -1,30 +1,41 @@
|
||||
import 'package:flutter_example_packages/base/package/package.dart'; |
||||
import 'package:flutter_example_packages/packages/battery_plus/package.dart'; |
||||
import 'package:flutter_example_packages/packages/cached_network_image/package.dart'; |
||||
import 'package:flutter_example_packages/packages/cupertino_icons/package.dart'; |
||||
import 'package:flutter_example_packages/packages/device_info_plus/package.dart'; |
||||
import 'package:flutter_example_packages/packages/flutter_cache_manager/package.dart'; |
||||
import 'package:flutter_example_packages/packages/flutter_local_notifications/package.dart'; |
||||
import 'package:flutter_example_packages/packages/flutter_secure_storage/package.dart'; |
||||
import 'package:flutter_example_packages/packages/get_it/package.dart'; |
||||
import 'package:flutter_example_packages/packages/google_fonts/package.dart'; |
||||
import 'package:flutter_example_packages/packages/intl/package.dart'; |
||||
import 'package:flutter_example_packages/packages/package_info_plus/package.dart'; |
||||
import 'package:flutter_example_packages/packages/path_provider/package.dart'; |
||||
import 'package:flutter_example_packages/packages/scoped_model/package.dart'; |
||||
import 'package:flutter_example_packages/packages/shared_preferences/package.dart'; |
||||
import 'package:flutter_example_packages/packages/sqflite/package.dart'; |
||||
import 'package:flutter_example_packages/packages/universal_io/package.dart'; |
||||
import 'package:flutter_example_packages/packages/wakelock/package.dart'; |
||||
import 'package:flutter_example_packages/packages/xdga_directories/package.dart'; |
||||
|
||||
/// List app packages |
||||
final packages = <Package>[ |
||||
// Check with preview |
||||
packageBatteryPlus, |
||||
packageCachedNetworkImage, |
||||
packageCupertinoIcons, |
||||
packageDeviceInfoPlus, |
||||
packageFlutterCacheManager, |
||||
packageFlutterLocalNotifications, |
||||
packageFlutterSecureStorage, |
||||
packageGetIt, |
||||
packageGoogleFonts, |
||||
packageIntl, |
||||
packagePackageInfoPlus, |
||||
packagePathProvider, |
||||
packageScopedModel, |
||||
packageSharedPreferences, |
||||
packageSqflite, |
||||
packageUniversalIO, |
||||
packageWakelock, |
||||
packageXdgaDirectories, |
||||
]; |
||||
|
@ -0,0 +1,24 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageScopedModel = PackageDialog( |
||||
key: 'scoped_model', |
||||
descEN: ''' |
||||
A set of utilities that allow you to easily pass a data Model |
||||
from a parent Widget down to its descendants. |
||||
''', |
||||
descRU: ''' |
||||
Набор утилит, позволяющих легко передать Модель данных |
||||
от родительского виджета до его потомков. |
||||
''', |
||||
messageEN: ''' |
||||
This is a platform independent plugin used in this app, should work |
||||
for you too. |
||||
''', |
||||
messageRU: ''' |
||||
Это плагин независимый от платформы, используется в этом приложении, |
||||
должен работать и у вас. |
||||
''', |
||||
version: '2.0.0', |
||||
isPlatformDependent: false, |
||||
); |
@ -0,0 +1,20 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageSqflite = PackageDialog( |
||||
key: 'sqflite', |
||||
descEN: ''' |
||||
SQLite plugin for Flutter. Supports iOS, Android, MacOS and Aurora OS. |
||||
''', |
||||
descRU: ''' |
||||
Плагин SQLite для Flutter. Поддерживает iOS, Android, MacOS и ОС Aurora. |
||||
''', |
||||
messageEN: ''' |
||||
Platform dependent plugin. Preview of work in development. |
||||
''', |
||||
messageRU: ''' |
||||
Платформо-зависимый плагин. Превью работы в разработке. |
||||
''', |
||||
version: '2.2.6', |
||||
isPlatformDependent: true, |
||||
); |
@ -0,0 +1,24 @@
|
||||
import 'package:flutter_example_packages/base/package/package_dialog.dart'; |
||||
|
||||
/// Package values |
||||
final packageUniversalIO = PackageDialog( |
||||
key: 'universal_io', |
||||
descEN: ''' |
||||
A cross-platform dart:io that works on all platforms, |
||||
including browsers. |
||||
''', |
||||
descRU: ''' |
||||
Кроссплатформенный dart:io, который работает на всех платформах, |
||||
включая браузеры. |
||||
''', |
||||
messageEN: ''' |
||||
This is a platform independent plugin used in this app, should work |
||||
for you too. |
||||
''', |
||||
messageRU: ''' |
||||
Это плагин независимый от платформы, используется в этом приложении, |
||||
должен работать и у вас. |
||||
''', |
||||
version: '2.2.0', |
||||
isPlatformDependent: false, |
||||
); |
@ -0,0 +1,153 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/base/export.dart'; |
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; |
||||
|
||||
enum PlatformFilter { |
||||
disable, |
||||
dependent, |
||||
independent, |
||||
} |
||||
|
||||
class HomeAppBar extends AppStatefulWidget implements PreferredSizeWidget { |
||||
const HomeAppBar({ |
||||
super.key, |
||||
required this.onChangeSearch, |
||||
required this.onChangeFilter, |
||||
}); |
||||
|
||||
final void Function(String) onChangeSearch; |
||||
final void Function(PlatformFilter) onChangeFilter; |
||||
|
||||
@override |
||||
State<HomeAppBar> createState() => _HomeAppBarState(); |
||||
|
||||
@override |
||||
Size get preferredSize => const Size.fromHeight(56.0); |
||||
} |
||||
|
||||
class _HomeAppBarState extends AppState<HomeAppBar> { |
||||
bool _enableSearch = false; |
||||
PlatformFilter _filter = PlatformFilter.disable; |
||||
final TextEditingController _searchController = TextEditingController(); |
||||
final FocusNode _searchFocus = FocusNode(); |
||||
|
||||
@override |
||||
Widget buildWide( |
||||
BuildContext context, |
||||
MediaQueryData media, |
||||
AppLocalizations l10n, |
||||
) { |
||||
final theme = Theme.of(context); |
||||
return AppBar( |
||||
centerTitle: true, |
||||
shape: const Border(bottom: BorderSide(width: 0)), |
||||
leading: _enableSearch |
||||
? Padding( |
||||
padding: const EdgeInsets.all(8.0), |
||||
child: ClipOval( |
||||
child: Material( |
||||
color: Colors.blueGrey, |
||||
child: IconButton( |
||||
icon: const Icon(Icons.close), |
||||
tooltip: l10n.homeSearch, |
||||
onPressed: () { |
||||
setState(() { |
||||
widget.onChangeSearch.call(""); |
||||
_searchController.clear(); |
||||
_enableSearch = false; |
||||
}); |
||||
}, |
||||
), |
||||
), |
||||
), |
||||
) |
||||
: null, |
||||
title: _enableSearch |
||||
? TextField( |
||||
focusNode: _searchFocus, |
||||
controller: _searchController, |
||||
style: theme.textTheme.titleSmall?.copyWith(color: Colors.white), |
||||
cursorColor: Colors.white, |
||||
decoration: InputDecoration( |
||||
hintText: l10n.homeSearchTitle, |
||||
hintStyle: |
||||
theme.textTheme.titleSmall?.copyWith(color: Colors.white54), |
||||
border: InputBorder.none, |
||||
), |
||||
onChanged: (value) { |
||||
widget.onChangeSearch.call(value); |
||||
}, |
||||
) |
||||
: null, |
||||
actions: [ |
||||
if (!_enableSearch) |
||||
Padding( |
||||
padding: const EdgeInsets.all(8.0), |
||||
child: ClipOval( |
||||
child: Material( |
||||
color: Colors.blueGrey, |
||||
child: IconButton( |
||||
icon: const Icon(Icons.search), |
||||
tooltip: l10n.homeSearch, |
||||
onPressed: () { |
||||
setState(() { |
||||
_enableSearch = true; |
||||
_searchFocus.requestFocus(); |
||||
}); |
||||
}, |
||||
), |
||||
), |
||||
), |
||||
), |
||||
Padding( |
||||
padding: const EdgeInsets.all(8.0), |
||||
child: ClipOval( |
||||
child: Material( |
||||
color: () { |
||||
switch (_filter) { |
||||
case PlatformFilter.disable: |
||||
return Colors.blueGrey; |
||||
case PlatformFilter.dependent: |
||||
return Colors.deepOrangeAccent; |
||||
case PlatformFilter.independent: |
||||
return Colors.blueAccent; |
||||
} |
||||
}.call(), |
||||
child: IconButton( |
||||
icon: () { |
||||
switch (_filter) { |
||||
case PlatformFilter.disable: |
||||
return const Icon(Icons.filter_list_off); |
||||
case PlatformFilter.dependent: |
||||
return const Icon(Icons.filter_list); |
||||
case PlatformFilter.independent: |
||||
return const Icon(Icons.filter_list); |
||||
} |
||||
}.call(), |
||||
tooltip: l10n.homeFilter, |
||||
onPressed: () { |
||||
setState(() { |
||||
switch (_filter) { |
||||
case PlatformFilter.disable: |
||||
_filter = PlatformFilter.dependent; |
||||
widget.onChangeFilter.call(_filter); |
||||
break; |
||||
case PlatformFilter.dependent: |
||||
_filter = PlatformFilter.independent; |
||||
widget.onChangeFilter.call(_filter); |
||||
break; |
||||
case PlatformFilter.independent: |
||||
_filter = PlatformFilter.disable; |
||||
widget.onChangeFilter.call(_filter); |
||||
break; |
||||
} |
||||
}); |
||||
}, |
||||
), |
||||
), |
||||
), |
||||
), |
||||
], |
||||
); |
||||
} |
||||
} |
@ -1,8 +1,7 @@
|
||||
import 'dart:ui'; |
||||
import 'package:flutter/material.dart'; |
||||
|
||||
class AppColors { |
||||
static const Color primary = Color(0xFFCBDCF8); |
||||
static const Color primaryDark = Color(0xFF3c67b5); |
||||
static const Color secondary = Color(0xFF00b3ad); |
||||
static const Color primary = Color(0xFF080614); |
||||
static const Color secondary = Colors.blueGrey; |
||||
static const Color warning = Color(0xFFfb7d4a); |
||||
} |
||||
|
@ -0,0 +1,44 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; |
||||
|
||||
abstract class AppState<T extends StatefulWidget> extends State<T> |
||||
with WidgetsBindingObserver { |
||||
Widget buildWide( |
||||
BuildContext context, |
||||
MediaQueryData media, |
||||
AppLocalizations l10n, |
||||
); |
||||
|
||||
void onPostFrameCallback() {} |
||||
|
||||
@override |
||||
void initState() { |
||||
super.initState(); |
||||
WidgetsBinding.instance.addObserver(this); |
||||
WidgetsBinding.instance.addPostFrameCallback((_) { |
||||
didChangeMetrics(); |
||||
Future.delayed(const Duration(milliseconds: 100), () { |
||||
didChangeMetrics(); |
||||
}); |
||||
Future.delayed(const Duration(milliseconds: 200), () { |
||||
didChangeMetrics(); |
||||
}); |
||||
Future.delayed(const Duration(milliseconds: 500), () { |
||||
didChangeMetrics(); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
@override |
||||
void dispose() { |
||||
WidgetsBinding.instance.removeObserver(this); |
||||
super.dispose(); |
||||
} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) => buildWide( |
||||
context, |
||||
MediaQuery.of(context), |
||||
AppLocalizations.of(context)!, |
||||
); |
||||
} |
@ -0,0 +1,5 @@
|
||||
import 'package:flutter/material.dart'; |
||||
|
||||
abstract class AppStatefulWidget extends StatefulWidget { |
||||
const AppStatefulWidget({super.key}); |
||||
} |
@ -0,0 +1,21 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; |
||||
|
||||
abstract class AppStatelessWidget extends StatelessWidget { |
||||
const AppStatelessWidget({super.key}); |
||||
|
||||
Widget buildWide( |
||||
BuildContext context, |
||||
MediaQueryData media, |
||||
AppLocalizations l10n, |
||||
); |
||||
|
||||
void onPostFrameCallback() {} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) => buildWide( |
||||
context, |
||||
MediaQuery.of(context), |
||||
AppLocalizations.of(context)!, |
||||
); |
||||
} |
@ -0,0 +1,5 @@
|
||||
library base; |
||||
|
||||
export 'package:flutter_example_packages/widgets/base/app_state.dart'; |
||||
export 'package:flutter_example_packages/widgets/base/app_stateful_widget.dart'; |
||||
export 'package:flutter_example_packages/widgets/base/app_stateless_widget.dart'; |
@ -0,0 +1,11 @@
|
||||
library texts; |
||||
|
||||
export 'package:flutter_example_packages/widgets/texts/text_body_large.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_body_medium.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_body_small.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_headline_large.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_headline_medium.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_headline_small.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_title_large.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_title_medium.dart'; |
||||
export 'package:flutter_example_packages/widgets/texts/text_title_small.dart'; |
@ -0,0 +1,27 @@
|
||||
import 'package:flutter/material.dart'; |
||||
|
||||
class TextBase extends StatelessWidget { |
||||
const TextBase( |
||||
this.data, { |
||||
super.key, |
||||
this.color, |
||||
this.textAlign, |
||||
}); |
||||
|
||||
final String data; |
||||
final Color? color; |
||||
final TextAlign? textAlign; |
||||
|
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.bodyMedium; |
||||
} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return Text( |
||||
data, |
||||
style: getStyle(context)?.copyWith(color: color ?? Colors.black), |
||||
textAlign: textAlign, |
||||
); |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextBodyLarge extends TextBase { |
||||
const TextBodyLarge(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.bodyLarge; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextBodyMedium extends TextBase { |
||||
const TextBodyMedium(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.bodyMedium; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextBodySmall extends TextBase { |
||||
const TextBodySmall(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.bodySmall; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextHeadlineLarge extends TextBase { |
||||
const TextHeadlineLarge(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.headlineLarge; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextHeadlineMedium extends TextBase { |
||||
const TextHeadlineMedium(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.headlineMedium; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextHeadlineSmall extends TextBase { |
||||
const TextHeadlineSmall(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.headlineSmall; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextTitleLarge extends TextBase { |
||||
const TextTitleLarge(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.titleLarge; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextTitleMedium extends TextBase { |
||||
const TextTitleMedium(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.titleMedium; |
||||
} |
||||
} |
@ -0,0 +1,15 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:flutter_example_packages/widgets/texts/text_base.dart'; |
||||
|
||||
class TextTitleSmall extends TextBase { |
||||
const TextTitleSmall(super.data, { |
||||
super.key, |
||||
super.color, |
||||
super.textAlign, |
||||
}); |
||||
|
||||
@override |
||||
TextStyle? getStyle(BuildContext context) { |
||||
return Theme.of(context).textTheme.titleSmall; |
||||
} |
||||
} |