MT
Committed by GitHub

scale by height (#437)

@@ -94,6 +94,7 @@ class ScreenUtil { @@ -94,6 +94,7 @@ class ScreenUtil {
94 Size designSize = defaultSize, 94 Size designSize = defaultSize,
95 bool splitScreenMode = false, 95 bool splitScreenMode = false,
96 bool minTextAdapt = false, 96 bool minTextAdapt = false,
  97 + bool scaleByHeight = false
97 }) async { 98 }) async {
98 final navigatorContext = Navigator.maybeOf(context)?.context as Element?; 99 final navigatorContext = Navigator.maybeOf(context)?.context as Element?;
99 final mediaQueryContext = 100 final mediaQueryContext =
@@ -115,12 +116,13 @@ class ScreenUtil { @@ -115,12 +116,13 @@ class ScreenUtil {
115 : Orientation.portrait); 116 : Orientation.portrait);
116 117
117 _instance 118 _instance
118 - .._context = context 119 + .._context = scaleByHeight ? null : context
119 .._uiSize = designSize 120 .._uiSize = designSize
120 .._splitScreenMode = splitScreenMode 121 .._splitScreenMode = splitScreenMode
121 .._minTextAdapt = minTextAdapt 122 .._minTextAdapt = minTextAdapt
122 .._orientation = orientation 123 .._orientation = orientation
123 - .._screenWidth = deviceSize.width 124 + .._screenWidth = scaleByHeight ? (deviceSize.height * designSize.width) /
  125 + designSize.height : deviceSize.width
124 .._screenHeight = deviceSize.height; 126 .._screenHeight = deviceSize.height;
125 127
126 _instance._elementsToRebuild?.forEach((el) => el.markNeedsBuild()); 128 _instance._elementsToRebuild?.forEach((el) => el.markNeedsBuild());
1 import 'package:flutter/widgets.dart'; 1 import 'package:flutter/widgets.dart';
2 2
3 import 'screen_util.dart'; 3 import 'screen_util.dart';
  4 +import 'dart:ui' show FlutterWindow;
4 5
5 typedef RebuildFactor = bool Function(MediaQueryData old, MediaQueryData data); 6 typedef RebuildFactor = bool Function(MediaQueryData old, MediaQueryData data);
6 7
@@ -40,6 +41,7 @@ class ScreenUtilInit extends StatefulWidget { @@ -40,6 +41,7 @@ class ScreenUtilInit extends StatefulWidget {
40 this.splitScreenMode = false, 41 this.splitScreenMode = false,
41 this.minTextAdapt = false, 42 this.minTextAdapt = false,
42 this.useInheritedMediaQuery = false, 43 this.useInheritedMediaQuery = false,
  44 + this.scaleByHeight = false
43 }) : super(key: key); 45 }) : super(key: key);
44 46
45 final ScreenUtilInitBuilder builder; 47 final ScreenUtilInitBuilder builder;
@@ -47,6 +49,7 @@ class ScreenUtilInit extends StatefulWidget { @@ -47,6 +49,7 @@ class ScreenUtilInit extends StatefulWidget {
47 final bool splitScreenMode; 49 final bool splitScreenMode;
48 final bool minTextAdapt; 50 final bool minTextAdapt;
49 final bool useInheritedMediaQuery; 51 final bool useInheritedMediaQuery;
  52 + final bool scaleByHeight;
50 final RebuildFactor rebuildFactor; 53 final RebuildFactor rebuildFactor;
51 54
52 /// The [Size] of the device in the design draft, in dp 55 /// The [Size] of the device in the design draft, in dp
@@ -100,7 +103,7 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> @@ -100,7 +103,7 @@ class _ScreenUtilInitState extends State<ScreenUtilInit>
100 final old = _mediaQueryData!; 103 final old = _mediaQueryData!;
101 final data = newData; 104 final data = newData;
102 105
103 - if (widget.rebuildFactor(old, data)) { 106 + if (widget.scaleByHeight || widget.rebuildFactor(old, data)) {
104 _mediaQueryData = data; 107 _mediaQueryData = data;
105 _updateTree(context as Element); 108 _updateTree(context as Element);
106 } 109 }
@@ -128,13 +131,31 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> @@ -128,13 +131,31 @@ class _ScreenUtilInitState extends State<ScreenUtilInit>
128 data: mediaQueryData, 131 data: mediaQueryData,
129 child: Builder( 132 child: Builder(
130 builder: (__context) { 133 builder: (__context) {
  134 + final deviceData = MediaQuery.maybeOf(__context);
  135 + final deviceSize = deviceData?.size ?? widget.designSize;
131 ScreenUtil.init( 136 ScreenUtil.init(
132 __context, 137 __context,
133 designSize: widget.designSize, 138 designSize: widget.designSize,
134 splitScreenMode: widget.splitScreenMode, 139 splitScreenMode: widget.splitScreenMode,
135 minTextAdapt: widget.minTextAdapt, 140 minTextAdapt: widget.minTextAdapt,
  141 + scaleByHeight: widget.scaleByHeight
  142 + );
  143 + return Container(
  144 + width: deviceSize.width,
  145 + height: deviceSize.height,
  146 + child: FittedBox(
  147 + fit: BoxFit.none,
  148 + alignment: Alignment.center,
  149 + child: Container(
  150 + width: widget.scaleByHeight
  151 + ? (deviceSize.height * widget.designSize.width) /
  152 + widget.designSize.height
  153 + : deviceSize.width,
  154 + height: deviceSize.height,
  155 + child: child,
  156 + ),
  157 + )
136 ); 158 );
137 - return child;  
138 }, 159 },
139 ), 160 ),
140 ); 161 );
@@ -145,8 +166,25 @@ class _ScreenUtilInitState extends State<ScreenUtilInit> @@ -145,8 +166,25 @@ class _ScreenUtilInitState extends State<ScreenUtilInit>
145 designSize: widget.designSize, 166 designSize: widget.designSize,
146 splitScreenMode: widget.splitScreenMode, 167 splitScreenMode: widget.splitScreenMode,
147 minTextAdapt: widget.minTextAdapt, 168 minTextAdapt: widget.minTextAdapt,
  169 + scaleByHeight: widget.scaleByHeight
  170 + );
  171 + final deviceData = MediaQuery.maybeOf(_context);
  172 +
  173 + final deviceSize = deviceData?.size ?? widget.designSize;
  174 + return Container(
  175 + width: deviceSize.width,
  176 + height: deviceSize.height,
  177 + child: FittedBox(
  178 + fit: BoxFit.none,
  179 + alignment: Alignment.center,
  180 + child: Container(
  181 + width: widget.scaleByHeight ? (deviceSize.height *
  182 + widget.designSize.width) / widget.designSize.height : deviceSize
  183 + .width,
  184 + height: deviceSize.height,
  185 + child: child,
  186 + ),
  187 + )
148 ); 188 );
149 -  
150 - return child;  
151 } 189 }
152 } 190 }