@@ -13,108 +13,83 @@ import 'package:flutter/material.dart';
13
13
/// Extra large represents large computer screens.
14
14
///
15
15
/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints
16
- enum AdaptiveWindowType {
17
- xsmall,
18
- small,
19
- medium,
20
- large,
21
- xlarge,
22
- }
16
+ class AdaptiveWindowType {
17
+ const AdaptiveWindowType ._({
18
+ required this .name,
19
+ required this .relativeSize,
20
+ required this .widthRangeValues,
21
+ required this .heightLandscapeRangeValues,
22
+ required this .heightPortraitRangeValues,
23
+ });
23
24
24
- /// Used to set custom comparison operators for the [AdaptiveWindowType] enum.
25
- final Map <AdaptiveWindowType , int > _operatorMap = {
26
- AdaptiveWindowType .xsmall: 0 ,
27
- AdaptiveWindowType .small: 1 ,
28
- AdaptiveWindowType .medium: 2 ,
29
- AdaptiveWindowType .large: 3 ,
30
- AdaptiveWindowType .xlarge: 4 ,
31
- };
25
+ /// Name based on the [AdaptiveWindowType] .
26
+ ///
27
+ /// Can be: xsmall, small, medium, large or xlarge
28
+ final String name;
32
29
33
- int _relativeSize (AdaptiveWindowType adaptiveWindowType) {
34
- return _operatorMap[adaptiveWindowType]! ;
35
- }
30
+ /// Used to set custom comparison operators for the [AdaptiveWindowType] enum.
31
+ final int relativeSize;
36
32
37
- /// This extension lets you access variables associated with each window type.
38
- extension AdaptiveWindowTypeExtension on AdaptiveWindowType {
39
- String get name {
40
- switch (this ) {
41
- case AdaptiveWindowType .xsmall:
42
- return 'xsmall' ;
43
- case AdaptiveWindowType .small:
44
- return 'small' ;
45
- case AdaptiveWindowType .medium:
46
- return 'medium' ;
47
- case AdaptiveWindowType .large:
48
- return 'large' ;
49
- case AdaptiveWindowType .xlarge:
50
- return 'xlarge' ;
51
- default :
52
- throw AssertionError ('Unsupported AdaptiveWindowType' );
53
- }
54
- }
33
+ /// Valid range of width for this window type.
34
+ final RangeValues widthRangeValues;
55
35
56
- RangeValues get widthRangeValues {
57
- switch (this ) {
58
- case AdaptiveWindowType .xsmall:
59
- return const RangeValues (0 , 599 );
60
- case AdaptiveWindowType .small:
61
- return const RangeValues (600 , 1023 );
62
- case AdaptiveWindowType .medium:
63
- return const RangeValues (1024 , 1439 );
64
- case AdaptiveWindowType .large:
65
- return const RangeValues (1440 , 1919 );
66
- case AdaptiveWindowType .xlarge:
67
- return const RangeValues (1920 , double .infinity);
68
- default :
69
- throw AssertionError ('Unsupported AdaptiveWindowType' );
70
- }
71
- }
36
+ /// Valid range of height for this window type on landscape mode.
37
+ final RangeValues heightLandscapeRangeValues;
72
38
73
- RangeValues get heightLandscapeRangeValues {
74
- switch (this ) {
75
- case AdaptiveWindowType .xsmall:
76
- return const RangeValues (0 , 359 );
77
- case AdaptiveWindowType .small:
78
- return const RangeValues (360 , 719 );
79
- case AdaptiveWindowType .medium:
80
- return const RangeValues (720 , 959 );
81
- case AdaptiveWindowType .large:
82
- return const RangeValues (960 , 1279 );
83
- case AdaptiveWindowType .xlarge:
84
- return const RangeValues (1280 , double .infinity);
85
- default :
86
- throw AssertionError ('Unsupported AdaptiveWindowType' );
87
- }
88
- }
39
+ /// Valid range of height for this window type on portrait mode.
40
+ final RangeValues heightPortraitRangeValues;
89
41
90
- RangeValues get heightPortraitRangeValues {
91
- switch (this ) {
92
- case AdaptiveWindowType .xsmall:
93
- return const RangeValues (0 , 959 );
94
- case AdaptiveWindowType .small:
95
- return const RangeValues (360 , 1599 );
96
- case AdaptiveWindowType .medium:
97
- return const RangeValues (720 , 1919 );
98
- case AdaptiveWindowType .large:
99
- return const RangeValues (1920 , double .infinity);
100
- case AdaptiveWindowType .xlarge:
101
- return const RangeValues (1920 , double .infinity);
102
- default :
103
- throw AssertionError ('Unsupported AdaptiveWindowType' );
104
- }
105
- }
42
+ static const AdaptiveWindowType xsmall = AdaptiveWindowType ._(
43
+ name: 'xsmall' ,
44
+ relativeSize: 0 ,
45
+ widthRangeValues: RangeValues (0 , 599 ),
46
+ heightLandscapeRangeValues: RangeValues (0 , 359 ),
47
+ heightPortraitRangeValues: RangeValues (0 , 959 ),
48
+ );
49
+
50
+ static const AdaptiveWindowType small = AdaptiveWindowType ._(
51
+ name: 'small' ,
52
+ relativeSize: 1 ,
53
+ widthRangeValues: RangeValues (600 , 1023 ),
54
+ heightLandscapeRangeValues: RangeValues (360 , 719 ),
55
+ heightPortraitRangeValues: RangeValues (360 , 1599 ),
56
+ );
57
+
58
+ static const AdaptiveWindowType medium = AdaptiveWindowType ._(
59
+ name: 'medium' ,
60
+ relativeSize: 2 ,
61
+ widthRangeValues: RangeValues (1024 , 1439 ),
62
+ heightLandscapeRangeValues: RangeValues (720 , 959 ),
63
+ heightPortraitRangeValues: RangeValues (720 , 1919 ),
64
+ );
65
+
66
+ static const AdaptiveWindowType large = AdaptiveWindowType ._(
67
+ name: 'large' ,
68
+ relativeSize: 3 ,
69
+ widthRangeValues: RangeValues (1440 , 1919 ),
70
+ heightLandscapeRangeValues: RangeValues (960 , 1279 ),
71
+ heightPortraitRangeValues: RangeValues (1920 , double .infinity),
72
+ );
73
+
74
+ static const AdaptiveWindowType xlarge = AdaptiveWindowType ._(
75
+ name: 'xlarge' ,
76
+ relativeSize: 4 ,
77
+ widthRangeValues: RangeValues (1920 , double .infinity),
78
+ heightLandscapeRangeValues: RangeValues (1280 , double .infinity),
79
+ heightPortraitRangeValues: RangeValues (1920 , double .infinity),
80
+ );
106
81
107
82
bool operator <= (AdaptiveWindowType other) =>
108
- _relativeSize ( this ) <= _relativeSize ( other) ;
83
+ relativeSize <= other.relativeSize ;
109
84
110
85
bool operator < (AdaptiveWindowType other) =>
111
- _relativeSize ( this ) < _relativeSize ( other) ;
86
+ relativeSize < other.relativeSize ;
112
87
113
88
bool operator >= (AdaptiveWindowType other) =>
114
- _relativeSize ( this ) >= _relativeSize ( other) ;
89
+ relativeSize >= other.relativeSize ;
115
90
116
91
bool operator > (AdaptiveWindowType other) =>
117
- _relativeSize ( this ) > _relativeSize ( other) ;
92
+ relativeSize > other.relativeSize ;
118
93
}
119
94
120
95
/// This class represents the Material breakpoint system entry.
@@ -171,32 +146,32 @@ class BreakpointSystemEntry {
171
146
/// https://material.io/design/layout/responsive-layout-grid.html#breakpoints
172
147
///
173
148
/// This list is in sequential order.
174
- List <BreakpointSystemEntry > breakpointSystem = [
175
- const BreakpointSystemEntry (
149
+ const List <BreakpointSystemEntry > breakpointSystem = [
150
+ BreakpointSystemEntry (
176
151
range: RangeValues (0 , 359 ),
177
152
portrait: 'small handset' ,
178
153
adaptiveWindowType: AdaptiveWindowType .xsmall,
179
154
columns: 4 ,
180
155
margin: 16.0 ,
181
156
gutter: 16.0 ,
182
157
),
183
- const BreakpointSystemEntry (
158
+ BreakpointSystemEntry (
184
159
range: RangeValues (360 , 399 ),
185
160
portrait: 'medium handset' ,
186
161
adaptiveWindowType: AdaptiveWindowType .xsmall,
187
162
columns: 4 ,
188
163
margin: 16.0 ,
189
164
gutter: 16.0 ,
190
165
),
191
- const BreakpointSystemEntry (
166
+ BreakpointSystemEntry (
192
167
range: RangeValues (400 , 479 ),
193
168
portrait: 'large handset' ,
194
169
adaptiveWindowType: AdaptiveWindowType .xsmall,
195
170
columns: 4 ,
196
171
margin: 16.0 ,
197
172
gutter: 16.0 ,
198
173
),
199
- const BreakpointSystemEntry (
174
+ BreakpointSystemEntry (
200
175
range: RangeValues (480 , 599 ),
201
176
portrait: 'large handset' ,
202
177
landscape: 'small handset' ,
@@ -205,7 +180,7 @@ List<BreakpointSystemEntry> breakpointSystem = [
205
180
margin: 16.0 ,
206
181
gutter: 16.0 ,
207
182
),
208
- const BreakpointSystemEntry (
183
+ BreakpointSystemEntry (
209
184
range: RangeValues (600 , 719 ),
210
185
portrait: 'small tablet' ,
211
186
landscape: 'medium handset' ,
@@ -214,7 +189,7 @@ List<BreakpointSystemEntry> breakpointSystem = [
214
189
margin: 16.0 ,
215
190
gutter: 16.0 ,
216
191
),
217
- const BreakpointSystemEntry (
192
+ BreakpointSystemEntry (
218
193
range: RangeValues (720 , 839 ),
219
194
portrait: 'large tablet' ,
220
195
landscape: 'large handset' ,
@@ -223,7 +198,7 @@ List<BreakpointSystemEntry> breakpointSystem = [
223
198
margin: 24.0 ,
224
199
gutter: 24.0 ,
225
200
),
226
- const BreakpointSystemEntry (
201
+ BreakpointSystemEntry (
227
202
range: RangeValues (840 , 959 ),
228
203
portrait: 'large tablet' ,
229
204
landscape: 'large handset' ,
@@ -232,47 +207,47 @@ List<BreakpointSystemEntry> breakpointSystem = [
232
207
margin: 24.0 ,
233
208
gutter: 24.0 ,
234
209
),
235
- const BreakpointSystemEntry (
210
+ BreakpointSystemEntry (
236
211
range: RangeValues (960 , 1023 ),
237
212
landscape: 'small tablet' ,
238
213
adaptiveWindowType: AdaptiveWindowType .small,
239
214
columns: 12 ,
240
215
margin: 24.0 ,
241
216
gutter: 24.0 ,
242
217
),
243
- const BreakpointSystemEntry (
218
+ BreakpointSystemEntry (
244
219
range: RangeValues (1024 , 1279 ),
245
220
landscape: 'large tablet' ,
246
221
adaptiveWindowType: AdaptiveWindowType .medium,
247
222
columns: 12 ,
248
223
margin: 24.0 ,
249
224
gutter: 24.0 ,
250
225
),
251
- const BreakpointSystemEntry (
226
+ BreakpointSystemEntry (
252
227
range: RangeValues (1280 , 1439 ),
253
228
landscape: 'large tablet' ,
254
229
adaptiveWindowType: AdaptiveWindowType .medium,
255
230
columns: 12 ,
256
231
margin: 24.0 ,
257
232
gutter: 24.0 ,
258
233
),
259
- const BreakpointSystemEntry (
234
+ BreakpointSystemEntry (
260
235
range: RangeValues (1440 , 1599 ),
261
236
portrait: 'small handset' ,
262
237
adaptiveWindowType: AdaptiveWindowType .large,
263
238
columns: 12 ,
264
239
margin: 24.0 ,
265
240
gutter: 24.0 ,
266
241
),
267
- const BreakpointSystemEntry (
242
+ BreakpointSystemEntry (
268
243
range: RangeValues (1600 , 1919 ),
269
244
portrait: 'small handset' ,
270
245
adaptiveWindowType: AdaptiveWindowType .large,
271
246
columns: 12 ,
272
247
margin: 24.0 ,
273
248
gutter: 24.0 ,
274
249
),
275
- const BreakpointSystemEntry (
250
+ BreakpointSystemEntry (
276
251
range: RangeValues (1920 , double .infinity),
277
252
portrait: 'small handset' ,
278
253
adaptiveWindowType: AdaptiveWindowType .xlarge,
0 commit comments