Line data Source code
1 : import 'package:flutter/widgets.dart';
2 :
3 : ///
4 : ///
5 : ///
6 : mixin Responsive on Widget {
7 : ///
8 : ///
9 : ///
10 : int? get sizeExtraSmall;
11 :
12 : ///
13 : ///
14 : ///
15 0 : int get safeSizeExtraSmall => sizeExtraSmall ?? safeSizeSmall;
16 :
17 : ///
18 : ///
19 : ///
20 : int? get sizeSmall;
21 :
22 : ///
23 : ///
24 : ///
25 0 : int get safeSizeSmall => sizeSmall ?? safeSizeMedium;
26 :
27 : ///
28 : ///
29 : ///
30 : int? get sizeMedium;
31 :
32 : ///
33 : ///
34 : ///
35 0 : int get safeSizeMedium => sizeMedium ?? 12;
36 :
37 : ///
38 : ///
39 : ///
40 : int? get sizeLarge;
41 :
42 : ///
43 : ///
44 : ///
45 0 : int get safeSizeLarge => sizeLarge ?? safeSizeMedium;
46 :
47 : ///
48 : ///
49 : ///
50 : int? get sizeExtraLarge;
51 :
52 : ///
53 : ///
54 : ///
55 0 : int get safeSizeExtraLarge => sizeExtraLarge ?? safeSizeLarge;
56 :
57 : ///
58 : ///
59 : ///
60 : double? get minHeight;
61 :
62 : ///
63 : ///
64 : ///
65 0 : double get safeMinHeight => minHeight ?? -1;
66 :
67 : ///
68 : ///
69 : ///
70 0 : int responsiveSize(ResponsiveSize size) {
71 : switch (size) {
72 0 : case ResponsiveSize.extraSmall:
73 0 : return safeSizeExtraSmall;
74 0 : case ResponsiveSize.small:
75 0 : return safeSizeSmall;
76 0 : case ResponsiveSize.medium:
77 0 : return safeSizeMedium;
78 0 : case ResponsiveSize.large:
79 0 : return safeSizeLarge;
80 0 : case ResponsiveSize.extraLarge:
81 0 : return safeSizeExtraLarge;
82 : }
83 : }
84 : }
85 :
86 : ///
87 : ///
88 : ///
89 : enum ResponsiveSize {
90 : extraSmall,
91 : small,
92 : medium,
93 : large,
94 : extraLarge,
95 : }
96 :
97 : ///
98 : ///
99 : ///
100 : extension ResponsiveSizeExtension on ResponsiveSize {
101 : ///
102 : ///
103 : ///
104 0 : int get value {
105 : switch (this) {
106 0 : case ResponsiveSize.extraSmall:
107 : return 1;
108 0 : case ResponsiveSize.small:
109 : return 2;
110 0 : case ResponsiveSize.medium:
111 : return 3;
112 0 : case ResponsiveSize.large:
113 : return 4;
114 0 : case ResponsiveSize.extraLarge:
115 : return 5;
116 : }
117 : }
118 :
119 : ///
120 : ///
121 : ///
122 0 : bool operator >(ResponsiveSize other) => value > other.value;
123 :
124 : ///
125 : ///
126 : ///
127 0 : bool operator >=(ResponsiveSize other) => value >= other.value;
128 :
129 : ///
130 : ///
131 : ///
132 0 : bool operator <(ResponsiveSize other) => value < other.value;
133 :
134 : ///
135 : ///
136 : ///
137 0 : bool operator <=(ResponsiveSize other) => value <= other.value;
138 :
139 : ///
140 : ///
141 : ///
142 0 : bool equals(ResponsiveSize other) => value == other.value;
143 : }
144 :
145 : ///
146 : ///
147 : ///
148 : abstract class ResponsiveStateless extends StatelessWidget with Responsive {
149 : @override
150 : final int? sizeExtraSmall;
151 :
152 : @override
153 : final int? sizeSmall;
154 :
155 : @override
156 : final int? sizeMedium;
157 :
158 : @override
159 : final int? sizeLarge;
160 :
161 : @override
162 : final int? sizeExtraLarge;
163 :
164 : @override
165 : final double? minHeight;
166 :
167 : ///
168 : ///
169 : ///
170 0 : const ResponsiveStateless({
171 : this.sizeExtraSmall,
172 : this.sizeSmall,
173 : this.sizeMedium,
174 : this.sizeLarge,
175 : this.sizeExtraLarge,
176 : this.minHeight,
177 : super.key,
178 : }) : assert(
179 0 : sizeExtraSmall == null || sizeExtraSmall > 0,
180 : 'sizeExtraSmall must be greater than zero.',
181 : ),
182 : assert(
183 0 : sizeSmall == null || sizeSmall > 0,
184 : 'sizeSmall must be greater than zero.',
185 : ),
186 : assert(
187 0 : sizeMedium == null || sizeMedium > 0,
188 : 'sizeMedium must be greater than zero.',
189 : ),
190 : assert(
191 0 : sizeLarge == null || sizeLarge > 0,
192 : 'sizeLarge must be greater than zero.',
193 : ),
194 : assert(
195 0 : sizeExtraLarge == null || sizeExtraLarge > 0,
196 : 'sizeExtraLarge must be greater than zero.',
197 : ),
198 : assert(
199 0 : minHeight == null || minHeight >= 0,
200 : 'minHeight must be equal or greater than zero.',
201 : );
202 : }
203 :
204 : ///
205 : ///
206 : ///
207 : abstract class ResponsiveStateful extends StatefulWidget with Responsive {
208 : @override
209 : final int? sizeExtraSmall;
210 :
211 : @override
212 : final int? sizeSmall;
213 :
214 : @override
215 : final int? sizeMedium;
216 :
217 : @override
218 : final int? sizeLarge;
219 :
220 : @override
221 : final int? sizeExtraLarge;
222 :
223 : @override
224 : final double? minHeight;
225 :
226 : ///
227 : ///
228 : ///
229 0 : const ResponsiveStateful({
230 : this.sizeExtraSmall,
231 : this.sizeSmall,
232 : this.sizeMedium,
233 : this.sizeLarge,
234 : this.sizeExtraLarge,
235 : this.minHeight,
236 : super.key,
237 : }) : assert(
238 0 : sizeExtraSmall == null || sizeExtraSmall > 0,
239 : 'sizeExtraSmall must be greater than zero.',
240 : ),
241 : assert(
242 0 : sizeSmall == null || sizeSmall > 0,
243 : 'sizeSmall must be greater than zero.',
244 : ),
245 : assert(
246 0 : sizeMedium == null || sizeMedium > 0,
247 : 'sizeMedium must be greater than zero.',
248 : ),
249 : assert(
250 0 : sizeLarge == null || sizeLarge > 0,
251 : 'sizeLarge must be greater than zero.',
252 : ),
253 : assert(
254 0 : sizeExtraLarge == null || sizeExtraLarge > 0,
255 : 'sizeExtraLarge must be greater than zero.',
256 : ),
257 : assert(
258 0 : minHeight == null || minHeight >= 0,
259 : 'minHeight must be equal or greater than zero.',
260 : );
261 : }
|