Unverified Commit 75797a8a authored by Taha Tesser's avatar Taha Tesser Committed by GitHub

Fix `DataTable`'s `headingTextStyle` & `dataTextStyle` are not merged with...

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" /> |
parent 3b0359a0
...@@ -857,7 +857,7 @@ class DataTable extends StatelessWidget { ...@@ -857,7 +857,7 @@ class DataTable extends StatelessWidget {
height: effectiveHeadingRowHeight, height: effectiveHeadingRowHeight,
alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart, alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
child: AnimatedDefaultTextStyle( child: AnimatedDefaultTextStyle(
style: effectiveHeadingTextStyle, style: DefaultTextStyle.of(context).style.merge(effectiveHeadingTextStyle),
softWrap: false, softWrap: false,
duration: _sortArrowAnimationDuration, duration: _sortArrowAnimationDuration,
child: label, child: label,
...@@ -926,9 +926,9 @@ class DataTable extends StatelessWidget { ...@@ -926,9 +926,9 @@ class DataTable extends StatelessWidget {
constraints: BoxConstraints(minHeight: effectiveDataRowMinHeight, maxHeight: effectiveDataRowMaxHeight), constraints: BoxConstraints(minHeight: effectiveDataRowMinHeight, maxHeight: effectiveDataRowMaxHeight),
alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart, alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
child: DefaultTextStyle( child: DefaultTextStyle(
style: effectiveDataTextStyle.copyWith( style: DefaultTextStyle.of(context).style
color: placeholder ? effectiveDataTextStyle.color!.withOpacity(0.6) : null, .merge(effectiveDataTextStyle)
), .copyWith(color: placeholder ? effectiveDataTextStyle.color!.withOpacity(0.6) : null),
child: DropdownButtonHideUnderline(child: label), child: DropdownButtonHideUnderline(child: label),
), ),
); );
......
...@@ -2279,4 +2279,46 @@ void main() { ...@@ -2279,4 +2279,46 @@ void main() {
// Test that cursor is updated for the row. // Test that cursor is updated for the row.
expect(RendererBinding.instance.mouseTracker.debugDeviceActiveCursor(1), SystemMouseCursors.copy); 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));
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment