Showing
9 changed files
with
71 additions
and
26 deletions
| @@ -59,12 +59,14 @@ class Calendar extends StatelessWidget { | @@ -59,12 +59,14 @@ class Calendar extends StatelessWidget { | ||
| 59 | ) { | 59 | ) { |
| 60 | return Container( | 60 | return Container( |
| 61 | color: PdfColors.blue200, | 61 | color: PdfColors.blue200, |
| 62 | - padding: const EdgeInsets.all(8.0), | 62 | + padding: const EdgeInsets.only(top: 8, left: 8, bottom: 8), |
| 63 | child: Text( | 63 | child: Text( |
| 64 | DateFormat.EEEE().format(date), | 64 | DateFormat.EEEE().format(date), |
| 65 | style: const TextStyle( | 65 | style: const TextStyle( |
| 66 | fontSize: 15, | 66 | fontSize: 15, |
| 67 | ), | 67 | ), |
| 68 | + maxLines: 1, | ||
| 69 | + overflow: TextOverflow.clip, | ||
| 68 | ), | 70 | ), |
| 69 | ); | 71 | ); |
| 70 | } | 72 | } |
| @@ -101,6 +101,7 @@ Future<Uint8List> generateCertificate( | @@ -101,6 +101,7 @@ Future<Uint8List> generateCertificate( | ||
| 101 | ), | 101 | ), |
| 102 | pw.Text( | 102 | pw.Text( |
| 103 | data.name, | 103 | data.name, |
| 104 | + textAlign: pw.TextAlign.center, | ||
| 104 | style: pw.TextStyle( | 105 | style: pw.TextStyle( |
| 105 | fontWeight: pw.FontWeight.bold, | 106 | fontWeight: pw.FontWeight.bold, |
| 106 | fontSize: 20, | 107 | fontSize: 20, |
| @@ -16,6 +16,7 @@ | @@ -16,6 +16,7 @@ | ||
| 16 | 16 | ||
| 17 | import 'dart:typed_data'; | 17 | import 'dart:typed_data'; |
| 18 | 18 | ||
| 19 | +import 'package:flutter/services.dart'; | ||
| 19 | import 'package:pdf/pdf.dart'; | 20 | import 'package:pdf/pdf.dart'; |
| 20 | import 'package:pdf/widgets.dart' as pw; | 21 | import 'package:pdf/widgets.dart' as pw; |
| 21 | 22 | ||
| @@ -25,7 +26,14 @@ Future<Uint8List> generateDocument( | @@ -25,7 +26,14 @@ Future<Uint8List> generateDocument( | ||
| 25 | PdfPageFormat format, CustomData data) async { | 26 | PdfPageFormat format, CustomData data) async { |
| 26 | final doc = pw.Document(pageMode: PdfPageMode.outlines); | 27 | final doc = pw.Document(pageMode: PdfPageMode.outlines); |
| 27 | 28 | ||
| 29 | + final font1 = await rootBundle.load('assets/open-sans.ttf'); | ||
| 30 | + final font2 = await rootBundle.load('assets/open-sans-bold.ttf'); | ||
| 31 | + | ||
| 28 | doc.addPage(pw.MultiPage( | 32 | doc.addPage(pw.MultiPage( |
| 33 | + theme: pw.ThemeData.withFont( | ||
| 34 | + base: pw.Font.ttf(font1), | ||
| 35 | + bold: pw.Font.ttf(font2), | ||
| 36 | + ), | ||
| 29 | pageFormat: format.copyWith(marginBottom: 1.5 * PdfPageFormat.cm), | 37 | pageFormat: format.copyWith(marginBottom: 1.5 * PdfPageFormat.cm), |
| 30 | orientation: pw.PageOrientation.portrait, | 38 | orientation: pw.PageOrientation.portrait, |
| 31 | crossAxisAlignment: pw.CrossAxisAlignment.start, | 39 | crossAxisAlignment: pw.CrossAxisAlignment.start, |
| @@ -222,6 +222,7 @@ class Invoice { | @@ -222,6 +222,7 @@ class Invoice { | ||
| 222 | child: pw.BarcodeWidget( | 222 | child: pw.BarcodeWidget( |
| 223 | barcode: pw.Barcode.pdf417(), | 223 | barcode: pw.Barcode.pdf417(), |
| 224 | data: 'Invoice# $invoiceNumber', | 224 | data: 'Invoice# $invoiceNumber', |
| 225 | + drawText: false, | ||
| 225 | ), | 226 | ), |
| 226 | ), | 227 | ), |
| 227 | pw.Text( | 228 | pw.Text( |
| @@ -55,12 +55,6 @@ Future<Uint8List> generateReport( | @@ -55,12 +55,6 @@ Future<Uint8List> generateReport( | ||
| 55 | bold: pw.Font.ttf(await rootBundle.load('assets/open-sans-bold.ttf')), | 55 | bold: pw.Font.ttf(await rootBundle.load('assets/open-sans-bold.ttf')), |
| 56 | ); | 56 | ); |
| 57 | 57 | ||
| 58 | - // Add page to the PDF | ||
| 59 | - document.addPage( | ||
| 60 | - pw.Page( | ||
| 61 | - pageFormat: pageFormat, | ||
| 62 | - theme: theme, | ||
| 63 | - build: (context) { | ||
| 64 | // Top bar chart | 58 | // Top bar chart |
| 65 | final chart1 = pw.Chart( | 59 | final chart1 = pw.Chart( |
| 66 | left: pw.Container( | 60 | left: pw.Container( |
| @@ -129,6 +123,7 @@ Future<Uint8List> generateReport( | @@ -129,6 +123,7 @@ Future<Uint8List> generateReport( | ||
| 129 | 123 | ||
| 130 | // Left curved line chart | 124 | // Left curved line chart |
| 131 | final chart2 = pw.Chart( | 125 | final chart2 = pw.Chart( |
| 126 | + right: pw.ChartLegend(), | ||
| 132 | grid: pw.CartesianGrid( | 127 | grid: pw.CartesianGrid( |
| 133 | xAxis: pw.FixedAxis([0, 1, 2, 3, 4, 5, 6]), | 128 | xAxis: pw.FixedAxis([0, 1, 2, 3, 4, 5, 6]), |
| 134 | yAxis: pw.FixedAxis( | 129 | yAxis: pw.FixedAxis( |
| @@ -138,6 +133,7 @@ Future<Uint8List> generateReport( | @@ -138,6 +133,7 @@ Future<Uint8List> generateReport( | ||
| 138 | ), | 133 | ), |
| 139 | datasets: [ | 134 | datasets: [ |
| 140 | pw.LineDataSet( | 135 | pw.LineDataSet( |
| 136 | + legend: 'Expense', | ||
| 141 | drawSurface: true, | 137 | drawSurface: true, |
| 142 | isCurved: true, | 138 | isCurved: true, |
| 143 | drawPoints: false, | 139 | drawPoints: false, |
| @@ -185,6 +181,12 @@ Future<Uint8List> generateReport( | @@ -185,6 +181,12 @@ Future<Uint8List> generateReport( | ||
| 185 | cellAlignments: {0: pw.Alignment.centerLeft}, | 181 | cellAlignments: {0: pw.Alignment.centerLeft}, |
| 186 | ); | 182 | ); |
| 187 | 183 | ||
| 184 | + // Add page to the PDF | ||
| 185 | + document.addPage( | ||
| 186 | + pw.Page( | ||
| 187 | + pageFormat: pageFormat, | ||
| 188 | + theme: theme, | ||
| 189 | + build: (context) { | ||
| 188 | // Page layout | 190 | // Page layout |
| 189 | return pw.Column( | 191 | return pw.Column( |
| 190 | children: [ | 192 | children: [ |
| @@ -196,17 +198,7 @@ Future<Uint8List> generateReport( | @@ -196,17 +198,7 @@ Future<Uint8List> generateReport( | ||
| 196 | pw.Divider(thickness: 4), | 198 | pw.Divider(thickness: 4), |
| 197 | pw.Expanded(flex: 3, child: chart1), | 199 | pw.Expanded(flex: 3, child: chart1), |
| 198 | pw.Divider(), | 200 | pw.Divider(), |
| 199 | - pw.Expanded( | ||
| 200 | - flex: 2, | ||
| 201 | - child: pw.Row( | ||
| 202 | - crossAxisAlignment: pw.CrossAxisAlignment.start, | ||
| 203 | - children: [ | ||
| 204 | - pw.Expanded(child: chart2), | ||
| 205 | - pw.SizedBox(width: 10), | ||
| 206 | - pw.Expanded(child: table), | ||
| 207 | - ], | ||
| 208 | - ), | ||
| 209 | - ), | 201 | + pw.Expanded(flex: 2, child: chart2), |
| 210 | pw.SizedBox(height: 10), | 202 | pw.SizedBox(height: 10), |
| 211 | pw.Row( | 203 | pw.Row( |
| 212 | crossAxisAlignment: pw.CrossAxisAlignment.start, | 204 | crossAxisAlignment: pw.CrossAxisAlignment.start, |
| @@ -275,8 +267,9 @@ Future<Uint8List> generateReport( | @@ -275,8 +267,9 @@ Future<Uint8List> generateReport( | ||
| 275 | PdfColors.lime300, | 267 | PdfColors.lime300, |
| 276 | ]; | 268 | ]; |
| 277 | 269 | ||
| 278 | - return pw.SizedBox( | ||
| 279 | - height: 400, | 270 | + return pw.Column( |
| 271 | + children: [ | ||
| 272 | + pw.Flexible( | ||
| 280 | child: pw.Chart( | 273 | child: pw.Chart( |
| 281 | title: pw.Text( | 274 | title: pw.Text( |
| 282 | 'Expense breakdown', | 275 | 'Expense breakdown', |
| @@ -303,6 +296,9 @@ Future<Uint8List> generateReport( | @@ -303,6 +296,9 @@ Future<Uint8List> generateReport( | ||
| 303 | ); | 296 | ); |
| 304 | }), | 297 | }), |
| 305 | ), | 298 | ), |
| 299 | + ), | ||
| 300 | + table, | ||
| 301 | + ], | ||
| 306 | ); | 302 | ); |
| 307 | }, | 303 | }, |
| 308 | ), | 304 | ), |
| @@ -141,6 +141,7 @@ Future<Uint8List> generateResume(PdfPageFormat format, CustomData data) async { | @@ -141,6 +141,7 @@ Future<Uint8List> generateResume(PdfPageFormat format, CustomData data) async { | ||
| 141 | width: 60, | 141 | width: 60, |
| 142 | height: 60, | 142 | height: 60, |
| 143 | barcode: pw.Barcode.qrCode(), | 143 | barcode: pw.Barcode.qrCode(), |
| 144 | + drawText: false, | ||
| 144 | ), | 145 | ), |
| 145 | ], | 146 | ], |
| 146 | ), | 147 | ), |
| @@ -11,6 +11,7 @@ | @@ -11,6 +11,7 @@ | ||
| 11 | - Fix textScalingFactor with lineSpacing | 11 | - Fix textScalingFactor with lineSpacing |
| 12 | - Implement SpanningWidget on RichText | 12 | - Implement SpanningWidget on RichText |
| 13 | - Passthrough SpanningWidget on SingleChildWidget and StatelessWidget | 13 | - Passthrough SpanningWidget on SingleChildWidget and StatelessWidget |
| 14 | +- Improve TextOverflow support | ||
| 14 | 15 | ||
| 15 | ## 3.2.0 | 16 | ## 3.2.0 |
| 16 | 17 |
| @@ -33,11 +33,14 @@ enum TextDirection { ltr, rtl } | @@ -33,11 +33,14 @@ enum TextDirection { ltr, rtl } | ||
| 33 | 33 | ||
| 34 | /// How overflowing text should be handled. | 34 | /// How overflowing text should be handled. |
| 35 | enum TextOverflow { | 35 | enum TextOverflow { |
| 36 | - /// Span to the next page when possible. | ||
| 37 | - span, | 36 | + /// Clip the overflowing text to fix its container. |
| 37 | + clip, | ||
| 38 | 38 | ||
| 39 | /// Render overflowing text outside of its container. | 39 | /// Render overflowing text outside of its container. |
| 40 | visible, | 40 | visible, |
| 41 | + | ||
| 42 | + /// Span to the next page when possible. | ||
| 43 | + span, | ||
| 41 | } | 44 | } |
| 42 | 45 | ||
| 43 | abstract class _Span { | 46 | abstract class _Span { |
| @@ -611,7 +614,9 @@ class RichText extends Widget with SpanningWidget { | @@ -611,7 +614,9 @@ class RichText extends Widget with SpanningWidget { | ||
| 611 | 614 | ||
| 612 | final _context = _RichTextContext(); | 615 | final _context = _RichTextContext(); |
| 613 | 616 | ||
| 614 | - final TextOverflow overflow; | 617 | + final TextOverflow? overflow; |
| 618 | + | ||
| 619 | + var _mustClip = false; | ||
| 615 | 620 | ||
| 616 | void _appendDecoration(bool append, _TextDecoration td) { | 621 | void _appendDecoration(bool append, _TextDecoration td) { |
| 617 | if (append && _decorations.isNotEmpty) { | 622 | if (append && _decorations.isNotEmpty) { |
| @@ -638,6 +643,7 @@ class RichText extends Widget with SpanningWidget { | @@ -638,6 +643,7 @@ class RichText extends Widget with SpanningWidget { | ||
| 638 | final _maxLines = maxLines ?? theme.maxLines; | 643 | final _maxLines = maxLines ?? theme.maxLines; |
| 639 | _textAlign = textAlign ?? theme.textAlign; | 644 | _textAlign = textAlign ?? theme.textAlign; |
| 640 | final _textDirection = textDirection ?? Directionality.of(context); | 645 | final _textDirection = textDirection ?? Directionality.of(context); |
| 646 | + final _overflow = this.overflow ?? theme.overflow; | ||
| 641 | 647 | ||
| 642 | final constraintWidth = constraints.hasBoundedWidth | 648 | final constraintWidth = constraints.hasBoundedWidth |
| 643 | ? constraints.maxWidth | 649 | ? constraints.maxWidth |
| @@ -728,6 +734,7 @@ class RichText extends Widget with SpanningWidget { | @@ -728,6 +734,7 @@ class RichText extends Widget with SpanningWidget { | ||
| 728 | // One word Overflow, try to split it. | 734 | // One word Overflow, try to split it. |
| 729 | final pos = _splitWord(word, font, style, constraintWidth); | 735 | final pos = _splitWord(word, font, style, constraintWidth); |
| 730 | 736 | ||
| 737 | + if (pos < word.length) { | ||
| 731 | words[index] = word.substring(0, pos); | 738 | words[index] = word.substring(0, pos); |
| 732 | words.insert(index + 1, word.substring(pos)); | 739 | words.insert(index + 1, word.substring(pos)); |
| 733 | 740 | ||
| @@ -736,6 +743,7 @@ class RichText extends Widget with SpanningWidget { | @@ -736,6 +743,7 @@ class RichText extends Widget with SpanningWidget { | ||
| 736 | continue; | 743 | continue; |
| 737 | } | 744 | } |
| 738 | } | 745 | } |
| 746 | + } | ||
| 739 | 747 | ||
| 740 | final baseline = span.baseline! * textScaleFactor; | 748 | final baseline = span.baseline! * textScaleFactor; |
| 741 | final mt = tightBounds ? metrics.top : metrics.descent; | 749 | final mt = tightBounds ? metrics.top : metrics.descent; |
| @@ -910,7 +918,10 @@ class RichText extends Widget with SpanningWidget { | @@ -910,7 +918,10 @@ class RichText extends Widget with SpanningWidget { | ||
| 910 | ..endOffset = offsetY - _context.startOffset | 918 | ..endOffset = offsetY - _context.startOffset |
| 911 | ..spanEnd = _spans.length; | 919 | ..spanEnd = _spans.length; |
| 912 | 920 | ||
| 913 | - if (this.overflow != TextOverflow.span) { | 921 | + if (_overflow != TextOverflow.span) { |
| 922 | + if (_overflow != TextOverflow.visible) { | ||
| 923 | + _mustClip = true; | ||
| 924 | + } | ||
| 914 | return; | 925 | return; |
| 915 | } | 926 | } |
| 916 | 927 | ||
| @@ -949,6 +960,13 @@ class RichText extends Widget with SpanningWidget { | @@ -949,6 +960,13 @@ class RichText extends Widget with SpanningWidget { | ||
| 949 | TextStyle? currentStyle; | 960 | TextStyle? currentStyle; |
| 950 | PdfColor? currentColor; | 961 | PdfColor? currentColor; |
| 951 | 962 | ||
| 963 | + if (_mustClip) { | ||
| 964 | + context.canvas | ||
| 965 | + ..saveContext() | ||
| 966 | + ..drawBox(box!) | ||
| 967 | + ..clipPath(); | ||
| 968 | + } | ||
| 969 | + | ||
| 952 | for (var decoration in _decorations) { | 970 | for (var decoration in _decorations) { |
| 953 | assert(() { | 971 | assert(() { |
| 954 | if (Document.debug && RichText.debug) { | 972 | if (Document.debug && RichText.debug) { |
| @@ -997,6 +1015,10 @@ class RichText extends Widget with SpanningWidget { | @@ -997,6 +1015,10 @@ class RichText extends Widget with SpanningWidget { | ||
| 997 | _spans, | 1015 | _spans, |
| 998 | ); | 1016 | ); |
| 999 | } | 1017 | } |
| 1018 | + | ||
| 1019 | + if (_mustClip) { | ||
| 1020 | + context.canvas.restoreContext(); | ||
| 1021 | + } | ||
| 1000 | } | 1022 | } |
| 1001 | 1023 | ||
| 1002 | int _splitWord(String word, PdfFont font, TextStyle style, double maxWidth) { | 1024 | int _splitWord(String word, PdfFont font, TextStyle style, double maxWidth) { |
| @@ -1019,7 +1041,7 @@ class RichText extends Widget with SpanningWidget { | @@ -1019,7 +1041,7 @@ class RichText extends Widget with SpanningWidget { | ||
| 1019 | pos = (low + high) ~/ 2; | 1041 | pos = (low + high) ~/ 2; |
| 1020 | } | 1042 | } |
| 1021 | 1043 | ||
| 1022 | - return pos; | 1044 | + return math.max(1, pos); |
| 1023 | } | 1045 | } |
| 1024 | 1046 | ||
| 1025 | @override | 1047 | @override |
| @@ -1050,7 +1072,7 @@ class Text extends RichText { | @@ -1050,7 +1072,7 @@ class Text extends RichText { | ||
| 1050 | bool tightBounds = false, | 1072 | bool tightBounds = false, |
| 1051 | double textScaleFactor = 1.0, | 1073 | double textScaleFactor = 1.0, |
| 1052 | int? maxLines, | 1074 | int? maxLines, |
| 1053 | - TextOverflow overflow = TextOverflow.visible, | 1075 | + TextOverflow? overflow, |
| 1054 | }) : super( | 1076 | }) : super( |
| 1055 | text: TextSpan(text: text, style: style), | 1077 | text: TextSpan(text: text, style: style), |
| 1056 | textAlign: textAlign, | 1078 | textAlign: textAlign, |
| @@ -39,6 +39,7 @@ class ThemeData extends Inherited { | @@ -39,6 +39,7 @@ class ThemeData extends Inherited { | ||
| 39 | TextStyle? tableCell, | 39 | TextStyle? tableCell, |
| 40 | bool? softWrap, | 40 | bool? softWrap, |
| 41 | TextAlign? textAlign, | 41 | TextAlign? textAlign, |
| 42 | + TextOverflow? overflow, | ||
| 42 | int? maxLines, | 43 | int? maxLines, |
| 43 | IconThemeData? iconTheme, | 44 | IconThemeData? iconTheme, |
| 44 | }) { | 45 | }) { |
| @@ -56,6 +57,7 @@ class ThemeData extends Inherited { | @@ -56,6 +57,7 @@ class ThemeData extends Inherited { | ||
| 56 | tableHeader: tableHeader, | 57 | tableHeader: tableHeader, |
| 57 | tableCell: tableCell, | 58 | tableCell: tableCell, |
| 58 | softWrap: softWrap, | 59 | softWrap: softWrap, |
| 60 | + overflow: overflow, | ||
| 59 | textAlign: textAlign, | 61 | textAlign: textAlign, |
| 60 | maxLines: maxLines, | 62 | maxLines: maxLines, |
| 61 | iconTheme: iconTheme, | 63 | iconTheme: iconTheme, |
| @@ -75,6 +77,7 @@ class ThemeData extends Inherited { | @@ -75,6 +77,7 @@ class ThemeData extends Inherited { | ||
| 75 | required this.tableHeader, | 77 | required this.tableHeader, |
| 76 | required this.tableCell, | 78 | required this.tableCell, |
| 77 | required this.softWrap, | 79 | required this.softWrap, |
| 80 | + required this.overflow, | ||
| 78 | required this.textAlign, | 81 | required this.textAlign, |
| 79 | required this.iconTheme, | 82 | required this.iconTheme, |
| 80 | this.maxLines, | 83 | this.maxLines, |
| @@ -121,6 +124,7 @@ class ThemeData extends Inherited { | @@ -121,6 +124,7 @@ class ThemeData extends Inherited { | ||
| 121 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), | 124 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), |
| 122 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), | 125 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), |
| 123 | softWrap: true, | 126 | softWrap: true, |
| 127 | + overflow: TextOverflow.visible, | ||
| 124 | textAlign: TextAlign.left, | 128 | textAlign: TextAlign.left, |
| 125 | iconTheme: IconThemeData.fallback(icons), | 129 | iconTheme: IconThemeData.fallback(icons), |
| 126 | ); | 130 | ); |
| @@ -143,6 +147,7 @@ class ThemeData extends Inherited { | @@ -143,6 +147,7 @@ class ThemeData extends Inherited { | ||
| 143 | bool? softWrap, | 147 | bool? softWrap, |
| 144 | TextAlign? textAlign, | 148 | TextAlign? textAlign, |
| 145 | int? maxLines, | 149 | int? maxLines, |
| 150 | + TextOverflow? overflow, | ||
| 146 | IconThemeData? iconTheme, | 151 | IconThemeData? iconTheme, |
| 147 | }) => | 152 | }) => |
| 148 | ThemeData._( | 153 | ThemeData._( |
| @@ -158,6 +163,7 @@ class ThemeData extends Inherited { | @@ -158,6 +163,7 @@ class ThemeData extends Inherited { | ||
| 158 | tableHeader: this.tableHeader.merge(tableHeader), | 163 | tableHeader: this.tableHeader.merge(tableHeader), |
| 159 | tableCell: this.tableCell.merge(tableCell), | 164 | tableCell: this.tableCell.merge(tableCell), |
| 160 | softWrap: softWrap ?? this.softWrap, | 165 | softWrap: softWrap ?? this.softWrap, |
| 166 | + overflow: overflow ?? this.overflow, | ||
| 161 | textAlign: textAlign ?? this.textAlign, | 167 | textAlign: textAlign ?? this.textAlign, |
| 162 | maxLines: maxLines ?? this.maxLines, | 168 | maxLines: maxLines ?? this.maxLines, |
| 163 | iconTheme: iconTheme ?? this.iconTheme, | 169 | iconTheme: iconTheme ?? this.iconTheme, |
| @@ -183,6 +189,7 @@ class ThemeData extends Inherited { | @@ -183,6 +189,7 @@ class ThemeData extends Inherited { | ||
| 183 | final TextAlign textAlign; | 189 | final TextAlign textAlign; |
| 184 | final bool softWrap; | 190 | final bool softWrap; |
| 185 | final int? maxLines; | 191 | final int? maxLines; |
| 192 | + final TextOverflow overflow; | ||
| 186 | 193 | ||
| 187 | final IconThemeData iconTheme; | 194 | final IconThemeData iconTheme; |
| 188 | } | 195 | } |
| @@ -216,6 +223,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | @@ -216,6 +223,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
| 216 | required this.child, | 223 | required this.child, |
| 217 | this.textAlign, | 224 | this.textAlign, |
| 218 | this.softWrap = true, | 225 | this.softWrap = true, |
| 226 | + this.overflow, | ||
| 219 | this.maxLines, | 227 | this.maxLines, |
| 220 | }) : assert(maxLines == null || maxLines > 0); | 228 | }) : assert(maxLines == null || maxLines > 0); |
| 221 | 229 | ||
| @@ -224,6 +232,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | @@ -224,6 +232,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
| 224 | TextAlign? textAlign, | 232 | TextAlign? textAlign, |
| 225 | bool? softWrap, | 233 | bool? softWrap, |
| 226 | int? maxLines, | 234 | int? maxLines, |
| 235 | + TextOverflow? overflow, | ||
| 227 | required Widget child, | 236 | required Widget child, |
| 228 | }) { | 237 | }) { |
| 229 | return Builder( | 238 | return Builder( |
| @@ -234,6 +243,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | @@ -234,6 +243,7 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
| 234 | style: parent.defaultTextStyle.merge(style), | 243 | style: parent.defaultTextStyle.merge(style), |
| 235 | textAlign: textAlign ?? parent.textAlign, | 244 | textAlign: textAlign ?? parent.textAlign, |
| 236 | softWrap: softWrap ?? parent.softWrap, | 245 | softWrap: softWrap ?? parent.softWrap, |
| 246 | + overflow: overflow ?? parent.overflow, | ||
| 237 | maxLines: maxLines ?? parent.maxLines, | 247 | maxLines: maxLines ?? parent.maxLines, |
| 238 | child: child, | 248 | child: child, |
| 239 | ); | 249 | ); |
| @@ -251,12 +261,15 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | @@ -251,12 +261,15 @@ class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
| 251 | 261 | ||
| 252 | final int? maxLines; | 262 | final int? maxLines; |
| 253 | 263 | ||
| 264 | + final TextOverflow? overflow; | ||
| 265 | + | ||
| 254 | @override | 266 | @override |
| 255 | Widget build(Context context) { | 267 | Widget build(Context context) { |
| 256 | final theme = Theme.of(context).copyWith( | 268 | final theme = Theme.of(context).copyWith( |
| 257 | defaultTextStyle: style, | 269 | defaultTextStyle: style, |
| 258 | textAlign: textAlign, | 270 | textAlign: textAlign, |
| 259 | softWrap: softWrap, | 271 | softWrap: softWrap, |
| 272 | + overflow: overflow, | ||
| 260 | maxLines: maxLines, | 273 | maxLines: maxLines, |
| 261 | ); | 274 | ); |
| 262 | 275 |
-
Please register or login to post a comment