Showing
9 changed files
with
165 additions
and
38 deletions
| @@ -87,7 +87,7 @@ class MultiPage extends Page { | @@ -87,7 +87,7 @@ class MultiPage extends Page { | ||
| 87 | this.crossAxisAlignment = CrossAxisAlignment.start, | 87 | this.crossAxisAlignment = CrossAxisAlignment.start, |
| 88 | this.header, | 88 | this.header, |
| 89 | this.footer, | 89 | this.footer, |
| 90 | - Theme theme, | 90 | + ThemeData theme, |
| 91 | this.maxPages = 20, | 91 | this.maxPages = 20, |
| 92 | PageOrientation orientation, | 92 | PageOrientation orientation, |
| 93 | EdgeInsets margin}) | 93 | EdgeInsets margin}) |
| @@ -159,7 +159,8 @@ class MultiPage extends Page { | @@ -159,7 +159,8 @@ class MultiPage extends Page { | ||
| 159 | : BoxConstraints( | 159 | : BoxConstraints( |
| 160 | maxWidth: pageFormat.width - _margin.horizontal, | 160 | maxWidth: pageFormat.width - _margin.horizontal, |
| 161 | maxHeight: pageFormat.height - _margin.vertical); | 161 | maxHeight: pageFormat.height - _margin.vertical); |
| 162 | - final Theme calculatedTheme = theme ?? document.theme ?? Theme.base(); | 162 | + final ThemeData calculatedTheme = |
| 163 | + theme ?? document.theme ?? ThemeData.base(); | ||
| 163 | Context context; | 164 | Context context; |
| 164 | double offsetEnd; | 165 | double offsetEnd; |
| 165 | double offsetStart; | 166 | double offsetStart; |
| @@ -28,7 +28,7 @@ class Page { | @@ -28,7 +28,7 @@ class Page { | ||
| 28 | {PageTheme pageTheme, | 28 | {PageTheme pageTheme, |
| 29 | PdfPageFormat pageFormat, | 29 | PdfPageFormat pageFormat, |
| 30 | BuildCallback build, | 30 | BuildCallback build, |
| 31 | - Theme theme, | 31 | + ThemeData theme, |
| 32 | PageOrientation orientation, | 32 | PageOrientation orientation, |
| 33 | EdgeInsets margin, | 33 | EdgeInsets margin, |
| 34 | bool clip = false}) | 34 | bool clip = false}) |
| @@ -58,7 +58,7 @@ class Page { | @@ -58,7 +58,7 @@ class Page { | ||
| 58 | 58 | ||
| 59 | final BuildCallback _build; | 59 | final BuildCallback _build; |
| 60 | 60 | ||
| 61 | - Theme get theme => pageTheme.theme; | 61 | + ThemeData get theme => pageTheme.theme; |
| 62 | 62 | ||
| 63 | bool get mustRotate => pageTheme.mustRotate; | 63 | bool get mustRotate => pageTheme.mustRotate; |
| 64 | 64 | ||
| @@ -100,7 +100,8 @@ class Page { | @@ -100,7 +100,8 @@ class Page { | ||
| 100 | maxWidth: pageFormat.width - _margin.horizontal, | 100 | maxWidth: pageFormat.width - _margin.horizontal, |
| 101 | maxHeight: pageFormat.height - _margin.vertical); | 101 | maxHeight: pageFormat.height - _margin.vertical); |
| 102 | 102 | ||
| 103 | - final Theme calculatedTheme = theme ?? document.theme ?? Theme.base(); | 103 | + final ThemeData calculatedTheme = |
| 104 | + theme ?? document.theme ?? ThemeData.base(); | ||
| 104 | final Context context = Context( | 105 | final Context context = Context( |
| 105 | document: document.document, | 106 | document: document.document, |
| 106 | page: _pdfPage, | 107 | page: _pdfPage, |
| @@ -441,26 +441,32 @@ class TextSpan extends InlineSpan { | @@ -441,26 +441,32 @@ class TextSpan extends InlineSpan { | ||
| 441 | class RichText extends Widget { | 441 | class RichText extends Widget { |
| 442 | RichText( | 442 | RichText( |
| 443 | {@required this.text, | 443 | {@required this.text, |
| 444 | - this.textAlign = TextAlign.left, | ||
| 445 | - this.softWrap = true, | 444 | + TextAlign textAlign, |
| 445 | + bool softWrap, | ||
| 446 | this.tightBounds = false, | 446 | this.tightBounds = false, |
| 447 | this.textScaleFactor = 1.0, | 447 | this.textScaleFactor = 1.0, |
| 448 | - this.maxLines}) | ||
| 449 | - : assert(text != null); | 448 | + int maxLines}) |
| 449 | + : assert(text != null), | ||
| 450 | + _textAlign = textAlign, | ||
| 451 | + _softWrap = softWrap, | ||
| 452 | + _maxLines = maxLines; | ||
| 450 | 453 | ||
| 451 | static bool debug = false; | 454 | static bool debug = false; |
| 452 | 455 | ||
| 453 | final InlineSpan text; | 456 | final InlineSpan text; |
| 454 | 457 | ||
| 455 | - final TextAlign textAlign; | 458 | + TextAlign get textAlign => _textAlign; |
| 459 | + TextAlign _textAlign; | ||
| 456 | 460 | ||
| 457 | final double textScaleFactor; | 461 | final double textScaleFactor; |
| 458 | 462 | ||
| 459 | - final bool softWrap; | 463 | + bool get softWrap => _softWrap; |
| 464 | + bool _softWrap; | ||
| 460 | 465 | ||
| 461 | final bool tightBounds; | 466 | final bool tightBounds; |
| 462 | 467 | ||
| 463 | - final int maxLines; | 468 | + int get maxLines => _maxLines; |
| 469 | + int _maxLines; | ||
| 464 | 470 | ||
| 465 | final List<_Span> _spans = <_Span>[]; | 471 | final List<_Span> _spans = <_Span>[]; |
| 466 | 472 | ||
| @@ -524,7 +530,11 @@ class RichText extends Widget { | @@ -524,7 +530,11 @@ class RichText extends Widget { | ||
| 524 | _spans.clear(); | 530 | _spans.clear(); |
| 525 | _decorations.clear(); | 531 | _decorations.clear(); |
| 526 | 532 | ||
| 527 | - final TextStyle defaultstyle = Theme.of(context).defaultTextStyle; | 533 | + final ThemeData theme = Theme.of(context); |
| 534 | + final TextStyle defaultstyle = theme.defaultTextStyle; | ||
| 535 | + _softWrap ??= theme.softWrap; | ||
| 536 | + _maxLines ??= theme.maxLines; | ||
| 537 | + _textAlign ??= theme.textAlign; | ||
| 528 | 538 | ||
| 529 | final double constraintWidth = constraints.hasBoundedWidth | 539 | final double constraintWidth = constraints.hasBoundedWidth |
| 530 | ? constraints.maxWidth | 540 | ? constraints.maxWidth |
| @@ -821,8 +831,8 @@ class Text extends RichText { | @@ -821,8 +831,8 @@ class Text extends RichText { | ||
| 821 | Text( | 831 | Text( |
| 822 | String text, { | 832 | String text, { |
| 823 | TextStyle style, | 833 | TextStyle style, |
| 824 | - TextAlign textAlign = TextAlign.left, | ||
| 825 | - bool softWrap = true, | 834 | + TextAlign textAlign, |
| 835 | + bool softWrap, | ||
| 826 | bool tightBounds = false, | 836 | bool tightBounds = false, |
| 827 | double textScaleFactor = 1.0, | 837 | double textScaleFactor = 1.0, |
| 828 | int maxLines, | 838 | int maxLines, |
| @@ -19,8 +19,8 @@ | @@ -19,8 +19,8 @@ | ||
| 19 | part of widget; | 19 | part of widget; |
| 20 | 20 | ||
| 21 | @immutable | 21 | @immutable |
| 22 | -class Theme extends Inherited { | ||
| 23 | - factory Theme({ | 22 | +class ThemeData extends Inherited { |
| 23 | + factory ThemeData({ | ||
| 24 | TextStyle defaultTextStyle, | 24 | TextStyle defaultTextStyle, |
| 25 | TextStyle paragraphStyle, | 25 | TextStyle paragraphStyle, |
| 26 | TextStyle header0, | 26 | TextStyle header0, |
| @@ -32,8 +32,11 @@ class Theme extends Inherited { | @@ -32,8 +32,11 @@ class Theme extends Inherited { | ||
| 32 | TextStyle bulletStyle, | 32 | TextStyle bulletStyle, |
| 33 | TextStyle tableHeader, | 33 | TextStyle tableHeader, |
| 34 | TextStyle tableCell, | 34 | TextStyle tableCell, |
| 35 | + bool softWrap, | ||
| 36 | + TextAlign textAlign, | ||
| 37 | + int maxLines, | ||
| 35 | }) { | 38 | }) { |
| 36 | - final Theme base = Theme.base(); | 39 | + final ThemeData base = ThemeData.base(); |
| 37 | return base.copyWith( | 40 | return base.copyWith( |
| 38 | defaultTextStyle: defaultTextStyle, | 41 | defaultTextStyle: defaultTextStyle, |
| 39 | paragraphStyle: paragraphStyle, | 42 | paragraphStyle: paragraphStyle, |
| @@ -46,10 +49,13 @@ class Theme extends Inherited { | @@ -46,10 +49,13 @@ class Theme extends Inherited { | ||
| 46 | header5: header5, | 49 | header5: header5, |
| 47 | tableHeader: tableHeader, | 50 | tableHeader: tableHeader, |
| 48 | tableCell: tableCell, | 51 | tableCell: tableCell, |
| 52 | + softWrap: softWrap, | ||
| 53 | + textAlign: textAlign, | ||
| 54 | + maxLines: maxLines, | ||
| 49 | ); | 55 | ); |
| 50 | } | 56 | } |
| 51 | 57 | ||
| 52 | - Theme._({ | 58 | + ThemeData._({ |
| 53 | @required this.defaultTextStyle, | 59 | @required this.defaultTextStyle, |
| 54 | @required this.paragraphStyle, | 60 | @required this.paragraphStyle, |
| 55 | @required this.header0, | 61 | @required this.header0, |
| @@ -61,6 +67,9 @@ class Theme extends Inherited { | @@ -61,6 +67,9 @@ class Theme extends Inherited { | ||
| 61 | @required this.bulletStyle, | 67 | @required this.bulletStyle, |
| 62 | @required this.tableHeader, | 68 | @required this.tableHeader, |
| 63 | @required this.tableCell, | 69 | @required this.tableCell, |
| 70 | + @required this.softWrap, | ||
| 71 | + @required this.textAlign, | ||
| 72 | + this.maxLines, | ||
| 64 | }) : assert(defaultTextStyle.inherit == false), | 73 | }) : assert(defaultTextStyle.inherit == false), |
| 65 | assert(paragraphStyle.inherit == false), | 74 | assert(paragraphStyle.inherit == false), |
| 66 | assert(header0.inherit == false), | 75 | assert(header0.inherit == false), |
| @@ -71,9 +80,12 @@ class Theme extends Inherited { | @@ -71,9 +80,12 @@ class Theme extends Inherited { | ||
| 71 | assert(header5.inherit == false), | 80 | assert(header5.inherit == false), |
| 72 | assert(bulletStyle.inherit == false), | 81 | assert(bulletStyle.inherit == false), |
| 73 | assert(tableHeader.inherit == false), | 82 | assert(tableHeader.inherit == false), |
| 74 | - assert(tableCell.inherit == false); | 83 | + assert(tableCell.inherit == false), |
| 84 | + assert(softWrap != null), | ||
| 85 | + assert(maxLines == null || maxLines > 0); | ||
| 75 | 86 | ||
| 76 | - factory Theme.withFont({Font base, Font bold, Font italic, Font boldItalic}) { | 87 | + factory ThemeData.withFont( |
| 88 | + {Font base, Font bold, Font italic, Font boldItalic}) { | ||
| 77 | final TextStyle defaultStyle = TextStyle.defaultStyle().copyWith( | 89 | final TextStyle defaultStyle = TextStyle.defaultStyle().copyWith( |
| 78 | font: base, | 90 | font: base, |
| 79 | fontNormal: base, | 91 | fontNormal: base, |
| @@ -82,7 +94,7 @@ class Theme extends Inherited { | @@ -82,7 +94,7 @@ class Theme extends Inherited { | ||
| 82 | fontBoldItalic: boldItalic); | 94 | fontBoldItalic: boldItalic); |
| 83 | final double fontSize = defaultStyle.fontSize; | 95 | final double fontSize = defaultStyle.fontSize; |
| 84 | 96 | ||
| 85 | - return Theme._( | 97 | + return ThemeData._( |
| 86 | defaultTextStyle: defaultStyle, | 98 | defaultTextStyle: defaultStyle, |
| 87 | paragraphStyle: defaultStyle.copyWith(lineSpacing: 5), | 99 | paragraphStyle: defaultStyle.copyWith(lineSpacing: 5), |
| 88 | bulletStyle: defaultStyle.copyWith(lineSpacing: 5), | 100 | bulletStyle: defaultStyle.copyWith(lineSpacing: 5), |
| @@ -95,12 +107,14 @@ class Theme extends Inherited { | @@ -95,12 +107,14 @@ class Theme extends Inherited { | ||
| 95 | tableHeader: defaultStyle.copyWith( | 107 | tableHeader: defaultStyle.copyWith( |
| 96 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), | 108 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), |
| 97 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), | 109 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), |
| 110 | + softWrap: true, | ||
| 111 | + textAlign: TextAlign.left, | ||
| 98 | ); | 112 | ); |
| 99 | } | 113 | } |
| 100 | 114 | ||
| 101 | - factory Theme.base() => Theme.withFont(); | 115 | + factory ThemeData.base() => ThemeData.withFont(); |
| 102 | 116 | ||
| 103 | - Theme copyWith({ | 117 | + ThemeData copyWith({ |
| 104 | TextStyle defaultTextStyle, | 118 | TextStyle defaultTextStyle, |
| 105 | TextStyle paragraphStyle, | 119 | TextStyle paragraphStyle, |
| 106 | TextStyle header0, | 120 | TextStyle header0, |
| @@ -112,8 +126,11 @@ class Theme extends Inherited { | @@ -112,8 +126,11 @@ class Theme extends Inherited { | ||
| 112 | TextStyle bulletStyle, | 126 | TextStyle bulletStyle, |
| 113 | TextStyle tableHeader, | 127 | TextStyle tableHeader, |
| 114 | TextStyle tableCell, | 128 | TextStyle tableCell, |
| 129 | + bool softWrap, | ||
| 130 | + TextAlign textAlign, | ||
| 131 | + int maxLines, | ||
| 115 | }) => | 132 | }) => |
| 116 | - Theme._( | 133 | + ThemeData._( |
| 117 | defaultTextStyle: this.defaultTextStyle.merge(defaultTextStyle), | 134 | defaultTextStyle: this.defaultTextStyle.merge(defaultTextStyle), |
| 118 | paragraphStyle: this.paragraphStyle.merge(paragraphStyle), | 135 | paragraphStyle: this.paragraphStyle.merge(paragraphStyle), |
| 119 | bulletStyle: this.bulletStyle.merge(bulletStyle), | 136 | bulletStyle: this.bulletStyle.merge(bulletStyle), |
| @@ -125,12 +142,11 @@ class Theme extends Inherited { | @@ -125,12 +142,11 @@ class Theme extends Inherited { | ||
| 125 | header5: this.header5.merge(header5), | 142 | header5: this.header5.merge(header5), |
| 126 | tableHeader: this.tableHeader.merge(tableHeader), | 143 | tableHeader: this.tableHeader.merge(tableHeader), |
| 127 | tableCell: this.tableCell.merge(tableCell), | 144 | tableCell: this.tableCell.merge(tableCell), |
| 145 | + softWrap: softWrap ?? this.softWrap, | ||
| 146 | + textAlign: textAlign ?? this.textAlign, | ||
| 147 | + maxLines: maxLines ?? this.maxLines, | ||
| 128 | ); | 148 | ); |
| 129 | 149 | ||
| 130 | - static Theme of(Context context) { | ||
| 131 | - return context.inherited[Theme]; | ||
| 132 | - } | ||
| 133 | - | ||
| 134 | final TextStyle defaultTextStyle; | 150 | final TextStyle defaultTextStyle; |
| 135 | 151 | ||
| 136 | final TextStyle paragraphStyle; | 152 | final TextStyle paragraphStyle; |
| @@ -147,4 +163,102 @@ class Theme extends Inherited { | @@ -147,4 +163,102 @@ class Theme extends Inherited { | ||
| 147 | final TextStyle tableHeader; | 163 | final TextStyle tableHeader; |
| 148 | 164 | ||
| 149 | final TextStyle tableCell; | 165 | final TextStyle tableCell; |
| 166 | + | ||
| 167 | + final TextAlign textAlign; | ||
| 168 | + final bool softWrap; | ||
| 169 | + final int maxLines; | ||
| 170 | +} | ||
| 171 | + | ||
| 172 | +class Theme extends StatelessWidget { | ||
| 173 | + Theme({ | ||
| 174 | + @required this.data, | ||
| 175 | + @required this.child, | ||
| 176 | + }) : assert(data != null), | ||
| 177 | + assert(child != null); | ||
| 178 | + | ||
| 179 | + final ThemeData data; | ||
| 180 | + | ||
| 181 | + final Widget child; | ||
| 182 | + | ||
| 183 | + static ThemeData of(Context context) { | ||
| 184 | + return context.inherited[ThemeData]; | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + @Deprecated('Use ThemeData.base()') | ||
| 188 | + static ThemeData base() => ThemeData.base(); | ||
| 189 | + | ||
| 190 | + @Deprecated('Use ThemeData.withFont()') | ||
| 191 | + static ThemeData withFont( | ||
| 192 | + {Font base, Font bold, Font italic, Font boldItalic}) => | ||
| 193 | + ThemeData.withFont( | ||
| 194 | + base: base, bold: bold, italic: italic, boldItalic: boldItalic); | ||
| 195 | + | ||
| 196 | + @override | ||
| 197 | + Widget build(Context context) { | ||
| 198 | + return InheritedWidget( | ||
| 199 | + inherited: data, | ||
| 200 | + build: (Context context) => child, | ||
| 201 | + ); | ||
| 202 | + } | ||
| 203 | +} | ||
| 204 | + | ||
| 205 | +class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
| 206 | + DefaultTextStyle({ | ||
| 207 | + @required this.style, | ||
| 208 | + @required this.child, | ||
| 209 | + this.textAlign, | ||
| 210 | + this.softWrap = true, | ||
| 211 | + this.maxLines, | ||
| 212 | + }) : assert(style != null), | ||
| 213 | + assert(child != null), | ||
| 214 | + assert(softWrap != null), | ||
| 215 | + assert(maxLines == null || maxLines > 0); | ||
| 216 | + | ||
| 217 | + static Widget merge({ | ||
| 218 | + TextStyle style, | ||
| 219 | + TextAlign textAlign, | ||
| 220 | + bool softWrap, | ||
| 221 | + int maxLines, | ||
| 222 | + @required Widget child, | ||
| 223 | + }) { | ||
| 224 | + assert(child != null); | ||
| 225 | + return Builder( | ||
| 226 | + builder: (Context context) { | ||
| 227 | + final ThemeData parent = Theme.of(context); | ||
| 228 | + | ||
| 229 | + return DefaultTextStyle( | ||
| 230 | + style: parent.defaultTextStyle.merge(style), | ||
| 231 | + textAlign: textAlign ?? parent.textAlign, | ||
| 232 | + softWrap: softWrap ?? parent.softWrap, | ||
| 233 | + maxLines: maxLines ?? parent.maxLines, | ||
| 234 | + child: child, | ||
| 235 | + ); | ||
| 236 | + }, | ||
| 237 | + ); | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + final TextStyle style; | ||
| 241 | + | ||
| 242 | + final Widget child; | ||
| 243 | + | ||
| 244 | + final TextAlign textAlign; | ||
| 245 | + | ||
| 246 | + final bool softWrap; | ||
| 247 | + | ||
| 248 | + final int maxLines; | ||
| 249 | + | ||
| 250 | + @override | ||
| 251 | + Widget build(Context context) { | ||
| 252 | + final ThemeData theme = Theme.of(context).copyWith( | ||
| 253 | + defaultTextStyle: style, | ||
| 254 | + textAlign: textAlign, | ||
| 255 | + softWrap: softWrap, | ||
| 256 | + maxLines: maxLines, | ||
| 257 | + ); | ||
| 258 | + | ||
| 259 | + return InheritedWidget( | ||
| 260 | + inherited: theme, | ||
| 261 | + build: (Context context) => child, | ||
| 262 | + ); | ||
| 263 | + } | ||
| 150 | } | 264 | } |
| @@ -38,7 +38,7 @@ void main() { | @@ -38,7 +38,7 @@ void main() { | ||
| 38 | 38 | ||
| 39 | pdf = Document( | 39 | pdf = Document( |
| 40 | title: 'Widgets Test', | 40 | title: 'Widgets Test', |
| 41 | - theme: Theme.withFont( | 41 | + theme: ThemeData.withFont( |
| 42 | base: Font.ttf(defaultFont.buffer.asByteData()), | 42 | base: Font.ttf(defaultFont.buffer.asByteData()), |
| 43 | bold: Font.ttf(defaultFontBold.buffer.asByteData()), | 43 | bold: Font.ttf(defaultFontBold.buffer.asByteData()), |
| 44 | )); | 44 | )); |
| @@ -73,7 +73,7 @@ void main() { | @@ -73,7 +73,7 @@ void main() { | ||
| 73 | }); | 73 | }); |
| 74 | 74 | ||
| 75 | test('Theme Page 1', () { | 75 | test('Theme Page 1', () { |
| 76 | - final Theme theme = Theme.withFont(base: roboto); | 76 | + final ThemeData theme = ThemeData.withFont(base: roboto); |
| 77 | 77 | ||
| 78 | pdf.addPage(Page( | 78 | pdf.addPage(Page( |
| 79 | theme: theme, | 79 | theme: theme, |
| @@ -84,7 +84,7 @@ void main() { | @@ -84,7 +84,7 @@ void main() { | ||
| 84 | }); | 84 | }); |
| 85 | 85 | ||
| 86 | test('Theme Page 2', () { | 86 | test('Theme Page 2', () { |
| 87 | - final Theme theme = Theme.base().copyWith( | 87 | + final ThemeData theme = ThemeData.base().copyWith( |
| 88 | tableHeader: TextStyle(font: openSansBold), | 88 | tableHeader: TextStyle(font: openSansBold), |
| 89 | tableCell: TextStyle(font: roboto), | 89 | tableCell: TextStyle(font: roboto), |
| 90 | ); | 90 | ); |
| @@ -107,11 +107,11 @@ void main() { | @@ -107,11 +107,11 @@ void main() { | ||
| 107 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, | 107 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
| 108 | children: <Widget>[ | 108 | children: <Widget>[ |
| 109 | Text('Hello default'), | 109 | Text('Hello default'), |
| 110 | - InheritedWidget( | ||
| 111 | - inherited: Theme.withFont( | 110 | + Theme( |
| 111 | + data: ThemeData.withFont( | ||
| 112 | base: roboto, | 112 | base: roboto, |
| 113 | ), | 113 | ), |
| 114 | - build: (Context context) => Text('Hello themed'), | 114 | + child: Text('Hello themed'), |
| 115 | ), | 115 | ), |
| 116 | ], | 116 | ], |
| 117 | ), | 117 | ), |
| @@ -124,7 +124,7 @@ void main() { | @@ -124,7 +124,7 @@ void main() { | ||
| 124 | pageFormat: PdfPageFormat.a4, | 124 | pageFormat: PdfPageFormat.a4, |
| 125 | orientation: PageOrientation.portrait, | 125 | orientation: PageOrientation.portrait, |
| 126 | margin: const EdgeInsets.all(8.0), | 126 | margin: const EdgeInsets.all(8.0), |
| 127 | - theme: Theme( | 127 | + theme: ThemeData( |
| 128 | defaultTextStyle: TextStyle(font: Font.courier(), fontSize: 10.0), | 128 | defaultTextStyle: TextStyle(font: Font.courier(), fontSize: 10.0), |
| 129 | ), | 129 | ), |
| 130 | build: (Context context) { | 130 | build: (Context context) { |
-
Please register or login to post a comment