import 'dart:math' as math; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class CommonSafeArea extends StatelessWidget { const CommonSafeArea({ super.key, this.left = true, this.top = true, this.right = true, this.bottom = true, this.minimum = EdgeInsets.zero, this.maintainBottomViewPadding = false, required this.child, }); final bool left; final bool top; final bool right; final bool bottom; final EdgeInsets minimum; final bool maintainBottomViewPadding; final Widget child; @override Widget build(BuildContext context) { assert(debugCheckHasMediaQuery(context)); EdgeInsets padding = MediaQuery.paddingOf(context); final height = MediaQuery.of(context).size.height; if (maintainBottomViewPadding) { padding = padding.copyWith( bottom: MediaQuery.viewPaddingOf(context).bottom, ); } final double realPaddingTop = padding.top > height * 0.5 ? 0 : padding.top; return Padding( padding: EdgeInsets.only( left: math.max(left ? padding.left : 0.0, minimum.left), top: math.max(top ? realPaddingTop : 0.0, minimum.top), right: math.max(right ? padding.right : 0.0, minimum.right), bottom: math.max(bottom ? padding.bottom : 0.0, minimum.bottom), ), child: MediaQuery.removePadding( context: context, removeLeft: left, removeTop: top, removeRight: right, removeBottom: bottom, child: child, ), ); } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties .add(FlagProperty('left', value: left, ifTrue: 'avoid left padding')); properties .add(FlagProperty('top', value: top, ifTrue: 'avoid top padding')); properties.add( FlagProperty('right', value: right, ifTrue: 'avoid right padding')); properties.add( FlagProperty('bottom', value: bottom, ifTrue: 'avoid bottom padding')); } }