1+ import 'dart:math' ;
2+
13import 'package:flutter/widgets.dart' ;
24
35import 'utils/responsive_utils.dart' ;
@@ -280,6 +282,94 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
280282 activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
281283 }
282284
285+ /// Simulated view inset calculations.
286+ ///
287+ /// The [viewInset] is dependent upon the
288+ /// [scaledWidth] and [scaledHeight] respectively.
289+ /// If the screen is scaled, the view insets should
290+ /// be scaled to preserve the aspect ratio.
291+ /// The [scaledViewInsets] are computed with the
292+ /// following algorithm:
293+ /// 1. Find the percentage of screen height the original view insets are
294+ /// 2. Calculate the number of pixels the same percentage of the scaled height is.
295+ /// 4. Return calculated proportional insets
296+ EdgeInsets scaledViewInsets;
297+ EdgeInsets getScaledViewInsets () {
298+ double leftInsetFactor;
299+ double topInsetFactor;
300+ double rightInsetFactor;
301+ double bottomInsetFactor;
302+ double scaledLeftInset;
303+ double scaledTopInset;
304+ double scaledRightInset;
305+ double scaledBottomInset;
306+
307+ if (widget.mediaQueryData != null ) {
308+ leftInsetFactor = widget.mediaQueryData.viewInsets.left / screenWidth;
309+ topInsetFactor = widget.mediaQueryData.viewInsets.top / screenHeight;
310+ rightInsetFactor = widget.mediaQueryData.viewInsets.right / screenWidth;
311+ bottomInsetFactor = widget.mediaQueryData.viewInsets.bottom / screenHeight;
312+ } else {
313+ leftInsetFactor = MediaQuery .of (context).viewInsets.left / screenWidth;
314+ topInsetFactor = MediaQuery .of (context).viewInsets.top / screenHeight;
315+ rightInsetFactor = MediaQuery .of (context).viewInsets.right / screenWidth;
316+ bottomInsetFactor = MediaQuery .of (context).viewInsets.bottom / screenHeight;
317+ }
318+
319+ scaledLeftInset = leftInsetFactor * scaledWidth;
320+ scaledTopInset = topInsetFactor * scaledHeight;
321+ scaledRightInset = rightInsetFactor * scaledWidth;
322+ scaledBottomInset = bottomInsetFactor * scaledHeight;
323+
324+ return EdgeInsets .fromLTRB (scaledLeftInset, scaledTopInset, scaledRightInset, scaledBottomInset);
325+ }
326+
327+ EdgeInsets scaledViewPadding;
328+ EdgeInsets getScaledViewPadding () {
329+ double leftPaddingFactor;
330+ double topPaddingFactor;
331+ double rightPaddingFactor;
332+ double bottomPaddingFactor;
333+ double scaledLeftPadding;
334+ double scaledTopPadding;
335+ double scaledRightPadding;
336+ double scaledBottomPadding;
337+
338+ if (widget.mediaQueryData != null ) {
339+ leftPaddingFactor = widget.mediaQueryData.viewPadding.left / screenWidth;
340+ topPaddingFactor = widget.mediaQueryData.viewPadding.top / screenHeight;
341+ rightPaddingFactor = widget.mediaQueryData.viewPadding.right / screenWidth;
342+ bottomPaddingFactor = widget.mediaQueryData.viewPadding.bottom / screenHeight;
343+ } else {
344+ leftPaddingFactor = MediaQuery .of (context).viewPadding.left / screenWidth;
345+ topPaddingFactor = MediaQuery .of (context).viewPadding.top / screenHeight;
346+ rightPaddingFactor = MediaQuery .of (context).viewPadding.right / screenWidth;
347+ bottomPaddingFactor = MediaQuery .of (context).viewPadding.bottom / screenHeight;
348+ }
349+
350+ scaledLeftPadding = leftPaddingFactor * scaledWidth;
351+ scaledTopPadding = topPaddingFactor * scaledHeight;
352+ scaledRightPadding = rightPaddingFactor * scaledWidth;
353+ scaledBottomPadding = bottomPaddingFactor * scaledHeight;
354+
355+ return EdgeInsets .fromLTRB (scaledLeftPadding, scaledTopPadding, scaledRightPadding, scaledBottomPadding);
356+ }
357+
358+ EdgeInsets scaledPadding;
359+ EdgeInsets getScaledPadding () {
360+ double scaledLeftPadding;
361+ double scaledTopPadding;
362+ double scaledRightPadding;
363+ double scaledBottomPadding;
364+
365+ scaledLeftPadding = max (0.0 , getScaledViewPadding ().left - getScaledViewInsets ().left);
366+ scaledTopPadding = max (0.0 , getScaledViewPadding ().top - getScaledViewInsets ().top);
367+ scaledRightPadding = max (0.0 , getScaledViewPadding ().right - getScaledViewInsets ().right);
368+ scaledBottomPadding = max (0.0 , getScaledViewPadding ().bottom - getScaledViewInsets ().bottom);
369+
370+ return EdgeInsets .fromLTRB (scaledLeftPadding, scaledTopPadding, scaledRightPadding, scaledBottomPadding);
371+ }
372+
283373 double get activeScaleFactor =>
284374 activeBreakpointSegment.responsiveBreakpoint.scaleFactor;
285375
@@ -296,6 +386,9 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
296386 screenHeight = getScreenHeight ();
297387 scaledWidth = getScaledWidth ();
298388 scaledHeight = getScaledHeight ();
389+ scaledViewInsets = getScaledViewInsets ();
390+ scaledViewPadding = getScaledViewPadding ();
391+ scaledPadding = getScaledPadding ();
299392 }
300393
301394 /// Set [activeBreakpointSegment] .
@@ -410,12 +503,20 @@ class _ResponsiveWrapperState extends State<ResponsiveWrapper>
410503 if (widget.mediaQueryData != null ) {
411504 return widget.mediaQueryData.copyWith (
412505 size: Size (scaledWidth, scaledHeight),
413- devicePixelRatio: devicePixelRatio * activeScaleFactor);
506+ devicePixelRatio: devicePixelRatio * activeScaleFactor,
507+ viewInsets: scaledViewInsets,
508+ viewPadding: scaledViewPadding,
509+ padding: scaledPadding
510+ );
414511 }
415512
416513 return MediaQuery .of (context).copyWith (
417514 size: Size (scaledWidth, scaledHeight),
418- devicePixelRatio: devicePixelRatio * activeScaleFactor);
515+ devicePixelRatio: devicePixelRatio * activeScaleFactor,
516+ viewInsets: scaledViewInsets,
517+ viewPadding: scaledViewPadding,
518+ padding: scaledPadding
519+ );
419520 }
420521}
421522
0 commit comments