Fix DataTable
's headingTextStyle
& dataTextStyle
are not merged with default text style (#134138)
fixes [Inconsistent text color on DataTable in different platforms](https://github.com/flutter/flutter/issues/114470) ### Code sample <details> <summary>expand to view the code sample</summary> ```dart import 'package:flutter/material.dart'; /// Flutter code sample for [DataTable]. void main() => runApp(const DataTableExampleApp()); class DataTableExampleApp extends StatelessWidget { const DataTableExampleApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( themeMode: ThemeMode.dark, theme: ThemeData(), darkTheme: ThemeData.dark(), home: Scaffold( appBar: AppBar(title: const Text('DataTable Sample')), body: const DataTableExample(), ), ); } } class DataTableExample extends StatelessWidget { const DataTableExample({super.key}); @override Widget build(BuildContext context) { return DataTable( headingTextStyle: const TextStyle(), dataTextStyle: const TextStyle(), columns: const <DataColumn>[ DataColumn( label: Expanded( child: Text( 'Name', style: TextStyle(fontStyle: FontStyle.italic), ), ), ), DataColumn( label: Expanded( child: Text( 'Age', style: TextStyle(fontStyle: FontStyle.italic), ), ), ), DataColumn( label: Expanded( child: Text( 'Role', style: TextStyle(fontStyle: FontStyle.italic), ), ), ), ], rows: const <DataRow>[ DataRow( cells: <DataCell>[ DataCell(Text('Sarah')), DataCell(Text('19')), DataCell(Text('Student')), ], ), DataRow( cells: <DataCell>[ DataCell(Text('Janine')), DataCell(Text('43')), DataCell(Text('Professor')), ], ), DataRow( cells: <DataCell>[ DataCell(Text('William')), DataCell(Text('27')), DataCell(Text('Associate Professor')), ], ), ], ); } } ``` </details> ### Before | Desktop | Mobile | | --------------- | --------------- | | <img src="https://github.com/flutter/flutter/assets/48603081/19c3908d-6b6a-4408-9c6b-da83c8efaa4a" /> | <img src="https://github.com/flutter/flutter/assets/48603081/efda08fb-05f9-437e-be5c-6b6861babe19" width="350" /> | ### After | Desktop | Mobile | | --------------- | --------------- | | <img src="https://github.com/flutter/flutter/assets/48603081/6bd3433f-d61f-4f35-8a2a-f7539a74f93e" /> | <img src="https://github.com/flutter/flutter/assets/48603081/5123a79b-6c2a-4bea-9fbc-64ed3e599826" width="350" /> |
This commit is contained in:
parent
3b0359a024
commit
75797a8a7e
@ -857,7 +857,7 @@ class DataTable extends StatelessWidget {
|
||||
height: effectiveHeadingRowHeight,
|
||||
alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
|
||||
child: AnimatedDefaultTextStyle(
|
||||
style: effectiveHeadingTextStyle,
|
||||
style: DefaultTextStyle.of(context).style.merge(effectiveHeadingTextStyle),
|
||||
softWrap: false,
|
||||
duration: _sortArrowAnimationDuration,
|
||||
child: label,
|
||||
@ -926,9 +926,9 @@ class DataTable extends StatelessWidget {
|
||||
constraints: BoxConstraints(minHeight: effectiveDataRowMinHeight, maxHeight: effectiveDataRowMaxHeight),
|
||||
alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
|
||||
child: DefaultTextStyle(
|
||||
style: effectiveDataTextStyle.copyWith(
|
||||
color: placeholder ? effectiveDataTextStyle.color!.withOpacity(0.6) : null,
|
||||
),
|
||||
style: DefaultTextStyle.of(context).style
|
||||
.merge(effectiveDataTextStyle)
|
||||
.copyWith(color: placeholder ? effectiveDataTextStyle.color!.withOpacity(0.6) : null),
|
||||
child: DropdownButtonHideUnderline(child: label),
|
||||
),
|
||||
);
|
||||
|
@ -2279,4 +2279,46 @@ void main() {
|
||||
// Test that cursor is updated for the row.
|
||||
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.copy);
|
||||
});
|
||||
|
||||
// This is a regression test for https://github.com/flutter/flutter/issues/114470.
|
||||
testWidgetsWithLeakTracking('DataTable text styles are merged with default text style', (WidgetTester tester) async {
|
||||
late DefaultTextStyle defaultTextStyle;
|
||||
await tester.pumpWidget(
|
||||
MaterialApp(
|
||||
home: Scaffold(
|
||||
body: Builder(
|
||||
builder: (BuildContext context) {
|
||||
defaultTextStyle = DefaultTextStyle.of(context);
|
||||
return DataTable(
|
||||
headingTextStyle: const TextStyle(),
|
||||
dataTextStyle: const TextStyle(),
|
||||
columns: const <DataColumn>[
|
||||
DataColumn(label: Text('Header 1')),
|
||||
DataColumn(label: Text('Header 2')),
|
||||
],
|
||||
rows: const <DataRow>[
|
||||
DataRow(
|
||||
cells: <DataCell>[
|
||||
DataCell(Text('Data 1')),
|
||||
DataCell(Text('Data 2')),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
final TextStyle? headingTextStyle = _getTextRenderObject(tester, 'Header 1').text.style;
|
||||
expect(headingTextStyle, defaultTextStyle.style);
|
||||
|
||||
final TextStyle? dataTextStyle = _getTextRenderObject(tester, 'Data 1').text.style;
|
||||
expect(dataTextStyle, defaultTextStyle.style);
|
||||
});
|
||||
}
|
||||
|
||||
RenderParagraph _getTextRenderObject(WidgetTester tester, String text) {
|
||||
return tester.renderObject(find.text(text));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user