first commit
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../platform/platform.dart';
|
||||
|
||||
extension ContextExtensionss on BuildContext {
|
||||
/// The same of [MediaQuery.of(context).size]
|
||||
Size get mediaQuerySize => MediaQuery.of(this).size;
|
||||
|
||||
/// The same of [MediaQuery.of(context).size.height]
|
||||
/// Note: updates when you rezise your screen (like on a browser or
|
||||
/// desktop window)
|
||||
double get height => mediaQuerySize.height;
|
||||
|
||||
/// The same of [MediaQuery.of(context).size.width]
|
||||
/// Note: updates when you rezise your screen (like on a browser or
|
||||
/// desktop window)
|
||||
double get width => mediaQuerySize.width;
|
||||
|
||||
/// Gives you the power to get a portion of the height.
|
||||
/// Useful for responsive applications.
|
||||
///
|
||||
/// [dividedBy] is for when you want to have a portion of the value you
|
||||
/// would get like for example: if you want a value that represents a third
|
||||
/// of the screen you can set it to 3, and you will get a third of the height
|
||||
///
|
||||
/// [reducedBy] is a percentage value of how much of the height you want
|
||||
/// if you for example want 46% of the height, then you reduce it by 56%.
|
||||
double heightTransformer({double dividedBy = 1, double reducedBy = 0.0}) {
|
||||
return (mediaQuerySize.height -
|
||||
((mediaQuerySize.height / 100) * reducedBy)) /
|
||||
dividedBy;
|
||||
}
|
||||
|
||||
/// Gives you the power to get a portion of the width.
|
||||
/// Useful for responsive applications.
|
||||
///
|
||||
/// [dividedBy] is for when you want to have a portion of the value you
|
||||
/// would get like for example: if you want a value that represents a third
|
||||
/// of the screen you can set it to 3, and you will get a third of the width
|
||||
///
|
||||
/// [reducedBy] is a percentage value of how much of the width you want
|
||||
/// if you for example want 46% of the width, then you reduce it by 56%.
|
||||
double widthTransformer({double dividedBy = 1, double reducedBy = 0.0}) {
|
||||
return (mediaQuerySize.width - ((mediaQuerySize.width / 100) * reducedBy)) /
|
||||
dividedBy;
|
||||
}
|
||||
|
||||
/// Divide the height proportionally by the given value
|
||||
double ratio({
|
||||
double dividedBy = 1,
|
||||
double reducedByW = 0.0,
|
||||
double reducedByH = 0.0,
|
||||
}) {
|
||||
return heightTransformer(dividedBy: dividedBy, reducedBy: reducedByH) /
|
||||
widthTransformer(dividedBy: dividedBy, reducedBy: reducedByW);
|
||||
}
|
||||
|
||||
/// similar to [MediaQuery.of(context).padding]
|
||||
ThemeData get theme => Theme.of(this);
|
||||
|
||||
/// Check if dark mode theme is enable
|
||||
bool get isDarkMode => (theme.brightness == Brightness.dark);
|
||||
|
||||
/// give access to Theme.of(context).iconTheme.color
|
||||
Color? get iconColor => theme.iconTheme.color;
|
||||
|
||||
/// similar to [MediaQuery.of(context).padding]
|
||||
TextTheme get textTheme => Theme.of(this).textTheme;
|
||||
|
||||
/// similar to [MediaQuery.of(context).padding]
|
||||
EdgeInsets get mediaQueryPadding => MediaQuery.of(this).padding;
|
||||
|
||||
/// similar to [MediaQuery.of(context).padding]
|
||||
MediaQueryData get mediaQuery => MediaQuery.of(this);
|
||||
|
||||
/// similar to [MediaQuery.of(context).viewPadding]
|
||||
EdgeInsets get mediaQueryViewPadding => MediaQuery.of(this).viewPadding;
|
||||
|
||||
/// similar to [MediaQuery.of(context).viewInsets]
|
||||
EdgeInsets get mediaQueryViewInsets => MediaQuery.of(this).viewInsets;
|
||||
|
||||
/// similar to [MediaQuery.of(context).orientation]
|
||||
Orientation get orientation => MediaQuery.of(this).orientation;
|
||||
|
||||
/// check if device is on landscape mode
|
||||
bool get isLandscape => orientation == Orientation.landscape;
|
||||
|
||||
/// check if device is on portrait mode
|
||||
bool get isPortrait => orientation == Orientation.portrait;
|
||||
|
||||
/// similar to [MediaQuery.of(this).devicePixelRatio]
|
||||
double get devicePixelRatio => MediaQuery.of(this).devicePixelRatio;
|
||||
|
||||
/// similar to [MediaQuery.of(this).textScaleFactor]
|
||||
double get textScaleFactor => MediaQuery.of(this).textScaleFactor;
|
||||
|
||||
/// get the shortestSide from screen
|
||||
double get mediaQueryShortestSide => mediaQuerySize.shortestSide;
|
||||
|
||||
/// True if width be larger than 800
|
||||
bool get showNavbar => (width > 800);
|
||||
|
||||
/// True if the shortestSide is smaller than 600p
|
||||
bool get isPhone => (mediaQueryShortestSide < 600);
|
||||
|
||||
/// True if the shortestSide is largest than 600p
|
||||
bool get isSmallTablet => (mediaQueryShortestSide >= 600);
|
||||
|
||||
/// True if the shortestSide is largest than 720p
|
||||
bool get isLargeTablet => (mediaQueryShortestSide >= 720);
|
||||
|
||||
/// True if the current device is Tablet
|
||||
bool get isTablet => isSmallTablet || isLargeTablet;
|
||||
|
||||
/// Returns a specific value according to the screen size
|
||||
/// if the device width is higher than or equal to 1200 return
|
||||
/// [desktop] value. if the device width is higher than or equal to 600
|
||||
/// and less than 1200 return [tablet] value.
|
||||
/// if the device width is less than 300 return [watch] value.
|
||||
/// in other cases return [mobile] value.
|
||||
T responsiveValue<T>({
|
||||
T? mobile,
|
||||
T? tablet,
|
||||
T? desktop,
|
||||
T? watch,
|
||||
}) {
|
||||
var deviceWidth = mediaQuerySize.shortestSide;
|
||||
if (GetPlatform.isDesktop) {
|
||||
deviceWidth = mediaQuerySize.width;
|
||||
}
|
||||
if (deviceWidth >= 1200 && desktop != null) {
|
||||
return desktop;
|
||||
} else if (deviceWidth >= 600 && tablet != null) {
|
||||
return tablet;
|
||||
} else if (deviceWidth < 300 && watch != null) {
|
||||
return watch;
|
||||
} else {
|
||||
return mobile!;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import 'dart:math';
|
||||
|
||||
extension Precision on double {
|
||||
double toPrecision(int fractionDigits) {
|
||||
var mod = pow(10, fractionDigits.toDouble()).toDouble();
|
||||
return ((this * mod).round().toDouble() / mod);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import 'dart:async';
|
||||
|
||||
/// Duration utilities.
|
||||
extension GetDurationUtils on Duration {
|
||||
/// Utility to delay some callback (or code execution).
|
||||
///
|
||||
/// Sample:
|
||||
/// ```
|
||||
/// void main() async {
|
||||
/// final _delay = 3.seconds;
|
||||
/// print('+ wait $_delay');
|
||||
/// await _delay.delay();
|
||||
/// print('- finish wait $_delay');
|
||||
/// print('+ callback in 700ms');
|
||||
/// await 0.7.seconds.delay(() {
|
||||
/// }
|
||||
///```
|
||||
Future delay([FutureOr Function()? callback]) async =>
|
||||
Future.delayed(this, callback);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import '../get_utils/get_utils.dart';
|
||||
|
||||
extension GetDynamicUtils on dynamic {
|
||||
@Deprecated('isNull is deprecated and cannot be used, use "==" operator')
|
||||
bool get isNull => GetUtils.isNull(this);
|
||||
|
||||
bool? get isBlank => GetUtils.isBlank(this);
|
||||
|
||||
@Deprecated(
|
||||
'isNullOrBlank is deprecated and cannot be used, use "isBlank" instead')
|
||||
bool? get isNullOrBlank => GetUtils.isNullOrBlank(this);
|
||||
|
||||
void printError(
|
||||
{String info = '', Function logFunction = GetUtils.printFunction}) =>
|
||||
// ignore: unnecessary_this
|
||||
logFunction('Error: ${this.runtimeType}', this, info, isError: true);
|
||||
|
||||
void printInfo(
|
||||
{String info = '',
|
||||
Function printFunction = GetUtils.printFunction}) =>
|
||||
// ignore: unnecessary_this
|
||||
printFunction('Info: ${this.runtimeType}', this, info);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../../../get_core/src/get_interface.dart';
|
||||
|
||||
extension LoopEventsExt on GetInterface {
|
||||
Future<T> toEnd<T>(FutureOr<T> Function() computation) async {
|
||||
await Future.delayed(Duration.zero);
|
||||
final val = computation();
|
||||
return val;
|
||||
}
|
||||
|
||||
FutureOr<T> asap<T>(T Function() computation,
|
||||
{bool Function()? condition}) async {
|
||||
T val;
|
||||
if (condition == null || !condition()) {
|
||||
await Future.delayed(Duration.zero);
|
||||
val = computation();
|
||||
} else {
|
||||
val = computation();
|
||||
}
|
||||
return val;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
export 'context_extensions.dart';
|
||||
export 'double_extensions.dart';
|
||||
export 'duration_extensions.dart';
|
||||
export 'dynamic_extensions.dart';
|
||||
export 'event_loop_extensions.dart';
|
||||
export 'internacionalization.dart';
|
||||
export 'iterable_extensions.dart';
|
||||
export 'num_extensions.dart';
|
||||
export 'string_extensions.dart';
|
||||
export 'widget_extensions.dart';
|
||||
@@ -0,0 +1,145 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import '../../../get_core/get_core.dart';
|
||||
|
||||
class _IntlHost {
|
||||
Locale? locale;
|
||||
|
||||
Locale? fallbackLocale;
|
||||
|
||||
Map<String, Map<String, String>> translations = {};
|
||||
}
|
||||
|
||||
extension FirstWhereExt<T> on List<T> {
|
||||
/// The first element satisfying [test], or `null` if there are none.
|
||||
T? firstWhereOrNull(bool Function(T element) test) {
|
||||
for (var element in this) {
|
||||
if (test(element)) return element;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
extension LocalesIntl on GetInterface {
|
||||
static final _intlHost = _IntlHost();
|
||||
|
||||
Locale? get locale => _intlHost.locale;
|
||||
|
||||
Locale? get fallbackLocale => _intlHost.fallbackLocale;
|
||||
|
||||
set locale(Locale? newLocale) => _intlHost.locale = newLocale;
|
||||
|
||||
set fallbackLocale(Locale? newLocale) => _intlHost.fallbackLocale = newLocale;
|
||||
|
||||
Map<String, Map<String, String>> get translations => _intlHost.translations;
|
||||
|
||||
void addTranslations(Map<String, Map<String, String>> tr) {
|
||||
translations.addAll(tr);
|
||||
}
|
||||
|
||||
void clearTranslations() {
|
||||
translations.clear();
|
||||
}
|
||||
|
||||
void appendTranslations(Map<String, Map<String, String>> tr) {
|
||||
tr.forEach((key, map) {
|
||||
if (translations.containsKey(key)) {
|
||||
translations[key]!.addAll(map);
|
||||
} else {
|
||||
translations[key] = map;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension Trans on String {
|
||||
// Checks whether the language code and country code are present, and
|
||||
// whether the key is also present.
|
||||
bool get _fullLocaleAndKey {
|
||||
return Get.translations.containsKey(
|
||||
"${Get.locale!.languageCode}_${Get.locale!.countryCode}") &&
|
||||
Get.translations[
|
||||
"${Get.locale!.languageCode}_${Get.locale!.countryCode}"]!
|
||||
.containsKey(this);
|
||||
}
|
||||
|
||||
// Checks if there is a callback language in the absence of the specific
|
||||
// country, and if it contains that key.
|
||||
Map<String, String>? get _getSimilarLanguageTranslation {
|
||||
final translationsWithNoCountry = Get.translations
|
||||
.map((key, value) => MapEntry(key.split("_").first, value));
|
||||
final containsKey = translationsWithNoCountry
|
||||
.containsKey(Get.locale!.languageCode.split("_").first);
|
||||
|
||||
if (!containsKey) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return translationsWithNoCountry[Get.locale!.languageCode.split("_").first];
|
||||
}
|
||||
|
||||
String get tr {
|
||||
// print('language');
|
||||
// print(Get.locale!.languageCode);
|
||||
// print('contains');
|
||||
// print(Get.translations.containsKey(Get.locale!.languageCode));
|
||||
// print(Get.translations.keys);
|
||||
// Returns the key if locale is null.
|
||||
if (Get.locale?.languageCode == null) return this;
|
||||
|
||||
if (_fullLocaleAndKey) {
|
||||
return Get.translations[
|
||||
"${Get.locale!.languageCode}_${Get.locale!.countryCode}"]![this]!;
|
||||
}
|
||||
final similarTranslation = _getSimilarLanguageTranslation;
|
||||
if (similarTranslation != null && similarTranslation.containsKey(this)) {
|
||||
return similarTranslation[this]!;
|
||||
// If there is no corresponding language or corresponding key, return
|
||||
// the key.
|
||||
} else if (Get.fallbackLocale != null) {
|
||||
final fallback = Get.fallbackLocale!;
|
||||
final key = "${fallback.languageCode}_${fallback.countryCode}";
|
||||
|
||||
if (Get.translations.containsKey(key) &&
|
||||
Get.translations[key]!.containsKey(this)) {
|
||||
return Get.translations[key]![this]!;
|
||||
}
|
||||
if (Get.translations.containsKey(fallback.languageCode) &&
|
||||
Get.translations[fallback.languageCode]!.containsKey(this)) {
|
||||
return Get.translations[fallback.languageCode]![this]!;
|
||||
}
|
||||
return this;
|
||||
} else {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
String trArgs([List<String> args = const []]) {
|
||||
var key = tr;
|
||||
if (args.isNotEmpty) {
|
||||
for (final arg in args) {
|
||||
key = key.replaceFirst(RegExp(r'%s'), arg.toString());
|
||||
}
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
String trPlural([String? pluralKey, int? i, List<String> args = const []]) {
|
||||
return i == 1 ? trArgs(args) : pluralKey!.trArgs(args);
|
||||
}
|
||||
|
||||
String trParams([Map<String, String> params = const {}]) {
|
||||
var trans = tr;
|
||||
if (params.isNotEmpty) {
|
||||
params.forEach((key, value) {
|
||||
trans = trans.replaceAll('@$key', value);
|
||||
});
|
||||
}
|
||||
return trans;
|
||||
}
|
||||
|
||||
String trPluralParams(
|
||||
[String? pluralKey, int? i, Map<String, String> params = const {}]) {
|
||||
return i == 1 ? trParams(params) : pluralKey!.trParams(params);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
extension IterableExtensions<T> on Iterable<T> {
|
||||
Iterable<TRes> mapMany<TRes>(
|
||||
Iterable<TRes>? Function(T item) selector) sync* {
|
||||
for (var item in this) {
|
||||
final res = selector(item);
|
||||
if (res != null) yield* res;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../get_utils/get_utils.dart';
|
||||
|
||||
extension GetNumUtils on num {
|
||||
bool isLowerThan(num b) => GetUtils.isLowerThan(this, b);
|
||||
|
||||
bool isGreaterThan(num b) => GetUtils.isGreaterThan(this, b);
|
||||
|
||||
bool isEqual(num b) => GetUtils.isEqual(this, b);
|
||||
|
||||
/// Utility to delay some callback (or code execution).
|
||||
/// TODO: Add a separated implementation of delay() with the ability
|
||||
/// to stop it.
|
||||
///
|
||||
/// Sample:
|
||||
/// ```
|
||||
/// void main() async {
|
||||
/// print('+ wait for 2 seconds');
|
||||
/// await 2.delay();
|
||||
/// print('- 2 seconds completed');
|
||||
/// print('+ callback in 1.2sec');
|
||||
/// 1.delay(() => print('- 1.2sec callback called'));
|
||||
/// print('currently running callback 1.2sec');
|
||||
/// }
|
||||
///```
|
||||
Future delay([FutureOr Function()? callback]) async => Future.delayed(
|
||||
Duration(milliseconds: (this * 1000).round()),
|
||||
callback,
|
||||
);
|
||||
|
||||
/// Easy way to make Durations from numbers.
|
||||
///
|
||||
/// Sample:
|
||||
/// ```
|
||||
/// print(1.seconds + 200.milliseconds);
|
||||
/// print(1.hours + 30.minutes);
|
||||
/// print(1.5.hours);
|
||||
///```
|
||||
Duration get milliseconds => Duration(microseconds: (this * 1000).round());
|
||||
|
||||
Duration get seconds => Duration(milliseconds: (this * 1000).round());
|
||||
|
||||
Duration get minutes =>
|
||||
Duration(seconds: (this * Duration.secondsPerMinute).round());
|
||||
|
||||
Duration get hours =>
|
||||
Duration(minutes: (this * Duration.minutesPerHour).round());
|
||||
|
||||
Duration get days => Duration(hours: (this * Duration.hoursPerDay).round());
|
||||
|
||||
//final _delayMaps = <Function, Future>{};
|
||||
// TODO: create a proper Future and control the Timer.
|
||||
// Future delay([double seconds = 0, VoidCallback callback]) async {
|
||||
// final ms = (seconds * 1000).round();
|
||||
// return Future.delayed(Duration(milliseconds: ms), callback);
|
||||
// return _delayMaps[callback];
|
||||
// }
|
||||
//killDelay(VoidCallback callback) {
|
||||
// if (_delayMaps.containsKey(callback)) {
|
||||
// _delayMaps[callback]?.timeout(Duration.zero, onTimeout: () {
|
||||
// print('callbacl eliminado!');
|
||||
// });
|
||||
// _delayMaps.remove(callback);
|
||||
// }
|
||||
//}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
import '../get_utils/get_utils.dart';
|
||||
|
||||
extension GetStringUtils on String {
|
||||
bool get isNum => GetUtils.isNum(this);
|
||||
|
||||
bool get isNumericOnly => GetUtils.isNumericOnly(this);
|
||||
|
||||
bool get isAlphabetOnly => GetUtils.isAlphabetOnly(this);
|
||||
|
||||
bool get isBool => GetUtils.isBool(this);
|
||||
|
||||
bool get isVectorFileName => GetUtils.isVector(this);
|
||||
|
||||
bool get isImageFileName => GetUtils.isImage(this);
|
||||
|
||||
bool get isAudioFileName => GetUtils.isAudio(this);
|
||||
|
||||
bool get isVideoFileName => GetUtils.isVideo(this);
|
||||
|
||||
bool get isTxtFileName => GetUtils.isTxt(this);
|
||||
|
||||
bool get isDocumentFileName => GetUtils.isWord(this);
|
||||
|
||||
bool get isExcelFileName => GetUtils.isExcel(this);
|
||||
|
||||
bool get isPPTFileName => GetUtils.isPPT(this);
|
||||
|
||||
bool get isAPKFileName => GetUtils.isAPK(this);
|
||||
|
||||
bool get isPDFFileName => GetUtils.isPDF(this);
|
||||
|
||||
bool get isHTMLFileName => GetUtils.isHTML(this);
|
||||
|
||||
bool get isURL => GetUtils.isURL(this);
|
||||
|
||||
bool get isEmail => GetUtils.isEmail(this);
|
||||
|
||||
bool get isPhoneNumber => GetUtils.isPhoneNumber(this);
|
||||
|
||||
bool get isDateTime => GetUtils.isDateTime(this);
|
||||
|
||||
bool get isMD5 => GetUtils.isMD5(this);
|
||||
|
||||
bool get isSHA1 => GetUtils.isSHA1(this);
|
||||
|
||||
bool get isSHA256 => GetUtils.isSHA256(this);
|
||||
|
||||
bool get isBinary => GetUtils.isBinary(this);
|
||||
|
||||
bool get isIPv4 => GetUtils.isIPv4(this);
|
||||
|
||||
bool get isIPv6 => GetUtils.isIPv6(this);
|
||||
|
||||
bool get isHexadecimal => GetUtils.isHexadecimal(this);
|
||||
|
||||
bool get isPalindrom => GetUtils.isPalindrom(this);
|
||||
|
||||
bool get isPassport => GetUtils.isPassport(this);
|
||||
|
||||
bool get isCurrency => GetUtils.isCurrency(this);
|
||||
|
||||
bool get isCpf => GetUtils.isCpf(this);
|
||||
|
||||
bool get isCnpj => GetUtils.isCnpj(this);
|
||||
|
||||
bool isCaseInsensitiveContains(String b) =>
|
||||
GetUtils.isCaseInsensitiveContains(this, b);
|
||||
|
||||
bool isCaseInsensitiveContainsAny(String b) =>
|
||||
GetUtils.isCaseInsensitiveContainsAny(this, b);
|
||||
|
||||
String? get capitalize => GetUtils.capitalize(this);
|
||||
|
||||
String? get capitalizeFirst => GetUtils.capitalizeFirst(this);
|
||||
|
||||
String get removeAllWhitespace => GetUtils.removeAllWhitespace(this);
|
||||
|
||||
String? get camelCase => GetUtils.camelCase(this);
|
||||
|
||||
String? get paramCase => GetUtils.paramCase(this);
|
||||
|
||||
String numericOnly({bool firstWordOnly = false}) =>
|
||||
GetUtils.numericOnly(this, firstWordOnly: firstWordOnly);
|
||||
|
||||
String createPath([Iterable? segments]) {
|
||||
final path = startsWith('/') ? this : '/$this';
|
||||
return GetUtils.createPath(path, segments);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
/// add Padding Property to widget
|
||||
extension WidgetPaddingX on Widget {
|
||||
Widget paddingAll(double padding) =>
|
||||
Padding(padding: EdgeInsets.all(padding), child: this);
|
||||
|
||||
Widget paddingSymmetric({double horizontal = 0.0, double vertical = 0.0}) =>
|
||||
Padding(
|
||||
padding:
|
||||
EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical),
|
||||
child: this);
|
||||
|
||||
Widget paddingOnly({
|
||||
double left = 0.0,
|
||||
double top = 0.0,
|
||||
double right = 0.0,
|
||||
double bottom = 0.0,
|
||||
}) =>
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: top, left: left, right: right, bottom: bottom),
|
||||
child: this);
|
||||
|
||||
Widget get paddingZero => Padding(padding: EdgeInsets.zero, child: this);
|
||||
}
|
||||
|
||||
/// Add margin property to widget
|
||||
extension WidgetMarginX on Widget {
|
||||
Widget marginAll(double margin) =>
|
||||
Container(margin: EdgeInsets.all(margin), child: this);
|
||||
|
||||
Widget marginSymmetric({double horizontal = 0.0, double vertical = 0.0}) =>
|
||||
Container(
|
||||
margin:
|
||||
EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical),
|
||||
child: this);
|
||||
|
||||
Widget marginOnly({
|
||||
double left = 0.0,
|
||||
double top = 0.0,
|
||||
double right = 0.0,
|
||||
double bottom = 0.0,
|
||||
}) =>
|
||||
Container(
|
||||
margin: EdgeInsets.only(
|
||||
top: top, left: left, right: right, bottom: bottom),
|
||||
child: this);
|
||||
|
||||
Widget get marginZero => Container(margin: EdgeInsets.zero, child: this);
|
||||
}
|
||||
|
||||
/// Allows you to insert widgets inside a CustomScrollView
|
||||
extension WidgetSliverBoxX on Widget {
|
||||
Widget get sliverBox => SliverToBoxAdapter(child: this);
|
||||
}
|
||||
Reference in New Issue
Block a user