David PHAM-VAN

Replace Theme with ThemeData

@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 - Add TableRow decoration 8 - Add TableRow decoration
9 - Add Chart Widget [Marco Papula] 9 - Add Chart Widget [Marco Papula]
10 - Add Divider Widget 10 - Add Divider Widget
  11 +- Replace Theme with ThemeData
11 12
12 ## 1.6.2 13 ## 1.6.2
13 14
@@ -55,7 +55,7 @@ class Document { @@ -55,7 +55,7 @@ class Document {
55 55
56 final PdfDocument document; 56 final PdfDocument document;
57 57
58 - final Theme theme; 58 + final ThemeData theme;
59 59
60 final List<Page> _pages = <Page>[]; 60 final List<Page> _pages = <Page>[];
61 61
@@ -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,
@@ -40,7 +40,7 @@ class PageTheme { @@ -40,7 +40,7 @@ class PageTheme {
40 40
41 final BuildCallback buildForeground; 41 final BuildCallback buildForeground;
42 42
43 - final Theme theme; 43 + final ThemeData theme;
44 44
45 final bool clip; 45 final bool clip;
46 46
@@ -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) {