Flutter 1.22 candidate.10 (#65386)

* Cherry pick engine #20983

* Revert "Add DataTableTheme to allow for themable DataTables (#64316)" (#65382)

This reverts commit cb4b8677219482e3378b1b6bfeff1241a453ccb6.

Co-authored-by: Per Classon <perc@google.com>
diff --git a/packages/flutter/lib/material.dart b/packages/flutter/lib/material.dart
index 1ef4259..aa7c82b 100644
--- a/packages/flutter/lib/material.dart
+++ b/packages/flutter/lib/material.dart
@@ -52,7 +52,6 @@
 export 'src/material/curves.dart';
 export 'src/material/data_table.dart';
 export 'src/material/data_table_source.dart';
-export 'src/material/data_table_theme.dart';
 export 'src/material/debug.dart';
 export 'src/material/dialog.dart';
 export 'src/material/dialog_theme.dart';
diff --git a/packages/flutter/lib/src/material/data_table.dart b/packages/flutter/lib/src/material/data_table.dart
index 41122fd..98cc73d 100644
--- a/packages/flutter/lib/src/material/data_table.dart
+++ b/packages/flutter/lib/src/material/data_table.dart
@@ -11,12 +11,12 @@
 import 'package:flutter/widgets.dart';
 
 import 'checkbox.dart';
+import 'colors.dart';
 import 'constants.dart';
 import 'debug.dart';
 import 'divider.dart';
 import 'dropdown.dart';
 import 'icons.dart';
-import 'ink_decoration.dart';
 import 'ink_well.dart';
 import 'material.dart';
 import 'material_state.dart';
@@ -414,27 +414,25 @@
     this.sortColumnIndex,
     this.sortAscending = true,
     this.onSelectAll,
-    this.decoration,
-    this.dataRowColor,
-    this.dataRowHeight,
-    this.dataTextStyle,
-    this.headingRowColor,
-    this.headingRowHeight,
-    this.headingTextStyle,
-    this.horizontalMargin,
-    this.columnSpacing,
+    this.dataRowHeight = kMinInteractiveDimension,
+    this.headingRowHeight = 56.0,
+    this.horizontalMargin = 24.0,
+    this.columnSpacing = 56.0,
     this.showCheckboxColumn = true,
-    this.showBottomBorder = false,
-    this.dividerThickness,
+    this.dividerThickness = 1.0,
     @required this.rows,
   }) : assert(columns != null),
        assert(columns.isNotEmpty),
        assert(sortColumnIndex == null || (sortColumnIndex >= 0 && sortColumnIndex < columns.length)),
        assert(sortAscending != null),
+       assert(dataRowHeight != null),
+       assert(headingRowHeight != null),
+       assert(horizontalMargin != null),
+       assert(columnSpacing != null),
        assert(showCheckboxColumn != null),
        assert(rows != null),
        assert(!rows.any((DataRow row) => row.cells.length != columns.length)),
-       assert(dividerThickness == null || dividerThickness >= 0),
+       assert(dividerThickness != null && dividerThickness >= 0),
        _onlyTextColumn = _initOnlyTextColumn(columns),
        super(key: key);
 
@@ -477,117 +475,27 @@
   /// row is selectable.
   final ValueSetter<bool> onSelectAll;
 
-  /// {@template flutter.material.dataTable.decoration}
-  /// The background and border decoration for the table.
-  /// {@endtemplate}
-  ///
-  /// By default there is no decoration.
-  final BoxDecoration decoration;
-
-  /// {@template flutter.material.dataTable.dataRowColor}
-  /// The background color for the data rows.
-  ///
-  /// The effective background color can be made to depend on the
-  /// [MaterialState] state, i.e. if the row is selected, pressed, hovered,
-  /// focused, disabled or enabled. The color is painted as an overlay to the
-  /// row. To make sure that the row's [InkWell] is visible (when pressed,
-  /// hovered and focused), it is recommended to use a translucent background
-  /// color.
-  /// {@endtemplate}
-  ///
-  /// By default, the background color is transparent unless selected. Selected
-  /// rows have a grey translucent color. To set a different color for
-  /// individual rows, see [DataRow.color].
-  ///
-  /// {@template flutter.material.dataTable.dataRowColorCode}
-  /// ```dart
-  /// DataTable(
-  ///   dataRowColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) {
-  ///     if (states.contains(MaterialState.selected))
-  ///       return Theme.of(context).colorScheme.primary.withOpacity(0.08);
-  ///     return null;  // Use the default value.
-  ///   }),
-  /// )
-  /// ```
-  ///
-  /// See also:
-  ///
-  ///  * The Material Design specification for overlay colors and how they
-  ///    match a component's state:
-  ///    <https://material.io/design/interaction/states.html#anatomy>.
-  /// {@endtemplate}
-  final MaterialStateProperty<Color> dataRowColor;
-
-  /// {@template flutter.material.dataTable.dataRowHeight}
   /// The height of each row (excluding the row that contains column headings).
-  /// {@endtemplate}
   ///
-  /// This value defaults to [kMinInteractiveDimension] to adhere to the Material
+  /// This value defaults to kMinInteractiveDimension to adhere to the Material
   /// Design specifications.
   final double dataRowHeight;
 
-  /// {@template flutter.material.dataTable.dataTextStyle}
-  /// The text style for data rows.
-  /// {@endtemplate}
-  ///
-  /// By default, the text style is [TextTheme.bodyText2].
-  final TextStyle dataTextStyle;
-
-  /// {@template flutter.material.dataTable.headingRowColor}
-  /// The background color for the heading row.
-  ///
-  /// The effective background color can be made to depend on the
-  /// [MaterialState] state, i.e. if the row is pressed, hovered, focused when
-  /// sorted. The color is painted as an overlay to the row. To make sure that
-  /// the row's [InkWell] is visible (when pressed, hovered and focused), it is
-  /// recommended to use a translucent color.
-  ///
-  /// ```dart
-  /// DataTable(
-  ///   headingRowColor: MaterialStateProperty.resolveWith<Color>((Set<MaterialState> states) {
-  ///     if (states.contains(MaterialState.hovered))
-  ///       return Theme.of(context).colorScheme.primary.withOpacity(0.08);
-  ///     return null;  // Use the default value.
-  ///   }),
-  /// )
-  /// ```
-  ///
-  /// See also:
-  ///
-  ///  * The Material Design specification for overlay colors and how they
-  ///    match a component's state:
-  ///    <https://material.io/design/interaction/states.html#anatomy>.
-  /// {@endtemplate}
-  final MaterialStateProperty<Color> headingRowColor;
-
-  /// {@template flutter.material.dataTable.headingRowHeight}
   /// The height of the heading row.
-  /// {@endtemplate}
   ///
   /// This value defaults to 56.0 to adhere to the Material Design specifications.
   final double headingRowHeight;
 
-  /// {@template flutter.material.dataTable.headingTextStyle}
-  /// The text style for the heading row.
-  /// {@endtemplate}
-  ///
-  /// By default, the text style is [TextTheme.subtitle2].
-  final TextStyle headingTextStyle;
-
-  /// {@template flutter.material.dataTable.horizontalMargin}
   /// The horizontal margin between the edges of the table and the content
   /// in the first and last cells of each row.
   ///
   /// When a checkbox is displayed, it is also the margin between the checkbox
   /// the content in the first data column.
-  /// {@endtemplate}
   ///
   /// This value defaults to 24.0 to adhere to the Material Design specifications.
   final double horizontalMargin;
 
-  /// {@template flutter.material.dataTable.columnSpacing}
   /// The horizontal margin between the contents of each data column.
-  /// {@endtemplate}
   ///
   /// This value defaults to 56.0 to adhere to the Material Design specifications.
   final double columnSpacing;
@@ -609,20 +517,6 @@
   /// Must be non-null, but may be empty.
   final List<DataRow> rows;
 
-  /// {@template flutter.material.dataTable.dividerThickness}
-  /// The width of the divider that appears between [TableRow]s.
-  ///
-  /// Must be greater than or equal to zero.
-  /// {@endtemplate}
-  /// This value defaults to 1.0.
-  final double dividerThickness;
-
-  /// Whether a border at the bottom of the table is displayed.
-  ///
-  /// By default, a border is not shown at the bottom to allow for a border
-  /// around the table set with [DataTable.decoration].
-  final bool showBottomBorder;
-
   // Set by the constructor to the index of the only Column that is
   // non-numeric, if there is exactly one, otherwise null.
   final int _onlyTextColumn;
@@ -657,45 +551,29 @@
     }
   }
 
-  /// The default height of the heading row.
-  static const double _headingRowHeight = 56.0;
-
-  /// The default horizontal margin between the edges of the table and the content
-  /// in the first and last cells of each row.
-  static const double _horizontalMargin = 24.0;
-
-  /// The default horizontal margin between the contents of each data column.
-  static const double _columnSpacing = 56.0;
-
-  /// The default padding between the heading content and sort arrow.
   static const double _sortArrowPadding = 2.0;
-
-  /// The default divider thickness.
-  static const double _dividerThickness = 1.0;
-
+  static const double _headingFontSize = 12.0;
   static const Duration _sortArrowAnimationDuration = Duration(milliseconds: 150);
   static const Color _grey100Opacity = Color(0x0A000000); // Grey 100 as opacity instead of solid color
   static const Color _grey300Opacity = Color(0x1E000000); // Dark theme variant is just a guess.
 
+  /// The width of the divider that appears between [TableRow]s.
+  ///
+  /// Must be non-null and greater than or equal to zero.
+  /// This value defaults to 1.0.
+  final double dividerThickness;
+
   Widget _buildCheckbox({
-    BuildContext context,
     Color activeColor,
     bool checked,
     VoidCallback onRowTap,
     ValueChanged<bool> onCheckboxChanged,
     MaterialStateProperty<Color> overlayColor,
   }) {
-    final ThemeData themeData = Theme.of(context);
-    final double effectiveHorizontalMargin = horizontalMargin
-      ?? themeData.dataTableTheme.horizontalMargin
-      ?? _horizontalMargin;
     Widget contents = Semantics(
       container: true,
       child: Padding(
-        padding: EdgeInsetsDirectional.only(
-          start: effectiveHorizontalMargin,
-          end: effectiveHorizontalMargin / 2.0,
-        ),
+        padding: EdgeInsetsDirectional.only(start: horizontalMargin, end: horizontalMargin / 2.0),
         child: Center(
           child: Checkbox(
             activeColor: activeColor,
@@ -727,37 +605,39 @@
     VoidCallback onSort,
     bool sorted,
     bool ascending,
-    MaterialStateProperty<Color> overlayColor,
   }) {
-    final ThemeData themeData = Theme.of(context);
+    List<Widget> arrowWithPadding() {
+      return onSort == null ? const <Widget>[] : <Widget>[
+        _SortArrow(
+          visible: sorted,
+          up: sorted ? ascending : null,
+          duration: _sortArrowAnimationDuration,
+        ),
+        const SizedBox(width: _sortArrowPadding),
+      ];
+    }
     label = Row(
       textDirection: numeric ? TextDirection.rtl : null,
       children: <Widget>[
         label,
-        if (onSort != null)
-          ...<Widget>[
-            _SortArrow(
-              visible: sorted,
-              up: sorted ? ascending : null,
-              duration: _sortArrowAnimationDuration,
-            ),
-            const SizedBox(width: _sortArrowPadding),
-          ],
+        ...arrowWithPadding(),
       ],
     );
-
-    final TextStyle effectiveHeadingTextStyle = headingTextStyle
-      ?? themeData.dataTableTheme.headingTextStyle
-      ?? themeData.textTheme.subtitle2;
-    final double effectiveHeadingRowHeight = headingRowHeight
-      ?? themeData.dataTableTheme.headingRowHeight
-      ?? _headingRowHeight;
     label = Container(
       padding: padding,
-      height: effectiveHeadingRowHeight,
+      height: headingRowHeight,
       alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
       child: AnimatedDefaultTextStyle(
-        style: effectiveHeadingTextStyle,
+        style: TextStyle(
+          // TODO(hansmuller): This should use the information provided by
+          // textTheme/DataTableTheme, https://github.com/flutter/flutter/issues/56079
+          fontWeight: FontWeight.w500,
+          fontSize: _headingFontSize,
+          height: math.min(1.0, headingRowHeight / _headingFontSize),
+          color: (Theme.of(context).brightness == Brightness.light)
+            ? ((onSort != null && sorted) ? Colors.black87 : Colors.black54)
+            : ((onSort != null && sorted) ? Colors.white : Colors.white70),
+        ),
         softWrap: false,
         duration: _sortArrowAnimationDuration,
         child: label,
@@ -769,12 +649,10 @@
         child: label,
       );
     }
-
     // TODO(dkwingsmt): Only wrap Inkwell if onSort != null. Blocked by
     // https://github.com/flutter/flutter/issues/51152
     label = InkWell(
       onTap: onSort,
-      overlayColor: overlayColor,
       child: label,
     );
     return label;
@@ -791,7 +669,7 @@
     VoidCallback onSelectChanged,
     MaterialStateProperty<Color> overlayColor,
   }) {
-    final ThemeData themeData = Theme.of(context);
+    final bool isLightTheme = Theme.of(context).brightness == Brightness.light;
     if (showEditIcon) {
       const Widget icon = Icon(Icons.edit, size: 18.0);
       label = Expanded(child: label);
@@ -800,22 +678,25 @@
         children: <Widget>[ label, icon ],
       );
     }
-
-    final TextStyle effectiveDataTextStyle = dataTextStyle
-      ?? themeData.dataTableTheme.dataTextStyle
-      ?? themeData.textTheme.bodyText2;
-    final double effectiveDataRowHeight = dataRowHeight
-      ?? themeData.dataTableTheme.dataRowHeight
-      ?? kMinInteractiveDimension;
     label = Container(
       padding: padding,
-      height: effectiveDataRowHeight,
+      height: dataRowHeight,
       alignment: numeric ? Alignment.centerRight : AlignmentDirectional.centerStart,
       child: DefaultTextStyle(
-        style: effectiveDataTextStyle.copyWith(
-          color: placeholder ? effectiveDataTextStyle.color.withOpacity(0.6) : null,
+        style: TextStyle(
+          // TODO(hansmuller): This should use the information provided by
+          // textTheme/DataTableTheme, https://github.com/flutter/flutter/issues/56079
+          fontSize: 13.0,
+          color: isLightTheme
+            ? (placeholder ? Colors.black38 : Colors.black87)
+            : (placeholder ? Colors.white38 : Colors.white70),
         ),
-        child: DropdownButtonHideUnderline(child: label),
+        child: IconTheme.merge(
+          data: IconThemeData(
+            color: isLightTheme ? Colors.black54 : Colors.white70,
+          ),
+          child: DropdownButtonHideUnderline(child: label),
+        ),
       ),
     );
     if (onTap != null) {
@@ -839,16 +720,12 @@
     assert(!_debugInteractive || debugCheckHasMaterial(context));
 
     final ThemeData theme = Theme.of(context);
-    final MaterialStateProperty<Color> effectiveHeadingRowColor = headingRowColor
-      ?? theme.dataTableTheme.headingRowColor;
-    final MaterialStateProperty<Color> effectiveDataRowColor = dataRowColor
-      ?? theme.dataTableTheme.dataRowColor;
     final MaterialStateProperty<Color> defaultRowColor = MaterialStateProperty.resolveWith(
       (Set<MaterialState> states) {
         if (states.contains(MaterialState.selected)) {
+          // TODO(per): Add theming support for DataTable, https://github.com/flutter/flutter/issues/56079.
           // The color has to be transparent so you can see the ink on
           // the [Material].
-          // TODO(perclasson): Align with Material specs, use translucent primary color: https://github.com/flutter/flutter/issues/64314.
           return (Theme.of(context).brightness == Brightness.light) ?
             _grey100Opacity : _grey300Opacity;
         }
@@ -858,12 +735,6 @@
     final bool anyRowSelectable = rows.any((DataRow row) => row.onSelectChanged != null);
     final bool displayCheckboxColumn = showCheckboxColumn && anyRowSelectable;
     final bool allChecked = displayCheckboxColumn && !rows.any((DataRow row) => row.onSelectChanged != null && !row.selected);
-    final double effectiveHorizontalMargin = horizontalMargin
-      ?? theme.dataTableTheme.horizontalMargin
-      ?? _horizontalMargin;
-    final double effectiveColumnSpacing = columnSpacing
-      ?? theme.dataTableTheme.columnSpacing
-      ?? _columnSpacing;
 
     final List<TableColumnWidth> tableColumns = List<TableColumnWidth>(columns.length + (displayCheckboxColumn ? 1 : 0));
     final List<TableRow> tableRows = List<TableRow>.generate(
@@ -877,22 +748,13 @@
           if (isDisabled)
             MaterialState.disabled,
         };
-        final Color resolvedDataRowColor = index > 0 ? (rows[index - 1].color ?? effectiveDataRowColor)?.resolve(states) : null;
-        final Color resolvedHeadingRowColor = effectiveHeadingRowColor?.resolve(<MaterialState>{});
-        final Color rowColor = index > 0 ? resolvedDataRowColor : resolvedHeadingRowColor;
-        final BorderSide borderSide = Divider.createBorderSide(
-          context,
-          width: dividerThickness
-            ?? theme.dataTableTheme.dividerThickness
-            ?? _dividerThickness,
-        );
-        final Border border = showBottomBorder
-          ? Border(bottom: borderSide)
-          : index == 0 ? null : Border(top: borderSide);
+        final Color rowColor = index > 0 ? rows[index - 1].color?.resolve(states) : null;
         return TableRow(
           key: index == 0 ? _headingRowKey : rows[index - 1].key,
           decoration: BoxDecoration(
-            border: border,
+            border: Border(
+              bottom: Divider.createBorderSide(context, width: dividerThickness),
+            ),
             color: rowColor ?? defaultRowColor.resolve(states),
           ),
           children: List<Widget>(tableColumns.length),
@@ -904,9 +766,8 @@
 
     int displayColumnIndex = 0;
     if (displayCheckboxColumn) {
-      tableColumns[0] = FixedColumnWidth(effectiveHorizontalMargin + Checkbox.width + effectiveHorizontalMargin / 2.0);
+      tableColumns[0] = FixedColumnWidth(horizontalMargin + Checkbox.width + horizontalMargin / 2.0);
       tableRows[0].children[0] = _buildCheckbox(
-        context: context,
         activeColor: theme.accentColor,
         checked: allChecked,
         onCheckboxChanged: _handleSelectAll,
@@ -914,12 +775,11 @@
       rowIndex = 1;
       for (final DataRow row in rows) {
         tableRows[rowIndex].children[0] = _buildCheckbox(
-          context: context,
           activeColor: theme.accentColor,
           checked: row.selected,
           onRowTap: () => row.onSelectChanged != null ? row.onSelectChanged(!row.selected) : null ,
           onCheckboxChanged: row.onSelectChanged,
-          overlayColor: row.color ?? effectiveDataRowColor,
+          overlayColor: row.color,
         );
         rowIndex += 1;
       }
@@ -931,18 +791,18 @@
 
       double paddingStart;
       if (dataColumnIndex == 0 && displayCheckboxColumn) {
-        paddingStart = effectiveHorizontalMargin / 2.0;
+        paddingStart = horizontalMargin / 2.0;
       } else if (dataColumnIndex == 0 && !displayCheckboxColumn) {
-        paddingStart = effectiveHorizontalMargin;
+        paddingStart = horizontalMargin;
       } else {
-        paddingStart = effectiveColumnSpacing / 2.0;
+        paddingStart = columnSpacing / 2.0;
       }
 
       double paddingEnd;
       if (dataColumnIndex == columns.length - 1) {
-        paddingEnd = effectiveHorizontalMargin;
+        paddingEnd = horizontalMargin;
       } else {
-        paddingEnd = effectiveColumnSpacing / 2.0;
+        paddingEnd = columnSpacing / 2.0;
       }
 
       final EdgeInsetsDirectional padding = EdgeInsetsDirectional.only(
@@ -963,7 +823,6 @@
         onSort: column.onSort != null ? () => column.onSort(dataColumnIndex, sortColumnIndex != dataColumnIndex || !sortAscending) : null,
         sorted: dataColumnIndex == sortColumnIndex,
         ascending: sortAscending,
-        overlayColor: effectiveHeadingRowColor,
       );
       rowIndex = 1;
       for (final DataRow row in rows) {
@@ -977,19 +836,16 @@
           showEditIcon: cell.showEditIcon,
           onTap: cell.onTap,
           onSelectChanged: () => row.onSelectChanged != null ? row.onSelectChanged(!row.selected) : null,
-          overlayColor: row.color ?? effectiveDataRowColor,
+          overlayColor: row.color,
         );
         rowIndex += 1;
       }
       displayColumnIndex += 1;
     }
 
-    return Ink(
-      decoration: decoration ?? theme.dataTableTheme.decoration,
-      child: Table(
-        columnWidths: tableColumns.asMap(),
-        children: tableRows,
-      ),
+    return Table(
+      columnWidths: tableColumns.asMap(),
+      children: tableRows,
     );
   }
 }
@@ -1179,9 +1035,10 @@
         transform: Matrix4.rotationZ(_orientationOffset + _orientationAnimation.value)
                              ..setTranslationRaw(0.0, _arrowIconBaselineOffset, 0.0),
         alignment: Alignment.center,
-        child: const Icon(
+        child: Icon(
           Icons.arrow_upward,
           size: _arrowIconSize,
+          color: (Theme.of(context).brightness == Brightness.light) ? Colors.black87 : Colors.white70,
         ),
       ),
     );
diff --git a/packages/flutter/lib/src/material/data_table_theme.dart b/packages/flutter/lib/src/material/data_table_theme.dart
deleted file mode 100644
index 595f636..0000000
--- a/packages/flutter/lib/src/material/data_table_theme.dart
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// @dart = 2.8
-
-import 'dart:ui' show lerpDouble;
-
-import 'package:flutter/foundation.dart';
-import 'package:flutter/widgets.dart';
-
-import 'material_state.dart';
-import 'theme.dart';
-
-/// Defines default property values for descendant [DataTable]
-/// widgets.
-///
-/// Descendant widgets obtain the current [DataTableThemeData] object
-/// using `DataTableTheme.of(context)`. Instances of
-/// [DataTableThemeData] can be customized with
-/// [DataTableThemeData.copyWith].
-///
-/// Typically a [DataTableThemeData] is specified as part of the
-/// overall [Theme] with [ThemeData.dataTableTheme].
-///
-/// All [DataTableThemeData] properties are `null` by default. When
-/// null, the [DataTable] will use the values from [ThemeData] if they exist,
-/// otherwise it will provide its own defaults based on the overall [Theme]'s
-/// textTheme and colorScheme. See the individual [DataTable] properties for
-/// details.
-///
-/// See also:
-///
-///  * [ThemeData], which describes the overall theme information for the
-///    application.
-@immutable
-class DataTableThemeData with Diagnosticable {
-  /// Creates a theme that can be used for [ThemeData.dataTableTheme].
-  const DataTableThemeData({
-    this.decoration,
-    this.dataRowColor,
-    this.dataRowHeight,
-    this.dataTextStyle,
-    this.headingRowColor,
-    this.headingRowHeight,
-    this.headingTextStyle,
-    this.horizontalMargin,
-    this.columnSpacing,
-    this.dividerThickness,
-  });
-
-  /// {@macro flutter.material.dataTable.decoration}
-  final Decoration decoration;
-
-  /// {@macro flutter.material.dataTable.dataRowColor}
-  /// {@macro flutter.material.dataTable.dataRowColorCode}
-  final MaterialStateProperty<Color> dataRowColor;
-
-  /// {@macro flutter.material.dataTable.dataRowHeight}
-  final double dataRowHeight;
-
-  /// {@macro flutter.material.dataTable.dataTextStyle}
-  final TextStyle dataTextStyle;
-
-  /// {@macro flutter.material.dataTable.headingRowColor}
-  final MaterialStateProperty<Color> headingRowColor;
-
-  /// {@macro flutter.material.dataTable.headingRowHeight}
-  final double headingRowHeight;
-
-  /// {@macro flutter.material.dataTable.headingTextStyle}
-  final TextStyle headingTextStyle;
-
-  /// {@macro flutter.material.dataTable.horizontalMargin}
-  final double horizontalMargin;
-
-  /// {@macro flutter.material.dataTable.columnSpacing}
-  final double columnSpacing;
-
-  /// {@macro flutter.material.dataTable.dividerThickness}
-  final double dividerThickness;
-
-  /// Creates a copy of this object but with the given fields replaced with the
-  /// new values.
-  DataTableThemeData copyWith({
-    Decoration decoration,
-    MaterialStateProperty<Color> dataRowColor,
-    double dataRowHeight,
-    TextStyle dataTextStyle,
-    MaterialStateProperty<Color> headingRowColor,
-    double headingRowHeight,
-    TextStyle headingTextStyle,
-    double horizontalMargin,
-    double columnSpacing,
-    double dividerThickness,
-  }) {
-    return DataTableThemeData(
-      decoration: decoration ?? this.decoration,
-      dataRowColor: dataRowColor ?? this.dataRowColor,
-      dataRowHeight: dataRowHeight ?? this.dataRowHeight,
-      dataTextStyle: dataTextStyle ?? this.dataTextStyle,
-      headingRowColor: headingRowColor ?? this.headingRowColor,
-      headingRowHeight: headingRowHeight ?? this.headingRowHeight,
-      headingTextStyle: headingTextStyle ?? this.headingTextStyle,
-      horizontalMargin: horizontalMargin ?? this.horizontalMargin,
-      columnSpacing: columnSpacing ?? this.columnSpacing,
-      dividerThickness: dividerThickness ?? this.dividerThickness,
-    );
-  }
-
-  /// Linearly interpolate between two [DataTableThemeData]s.
-  ///
-  /// The argument `t` must not be null.
-  ///
-  /// {@macro dart.ui.shadow.lerp}
-  static DataTableThemeData lerp(DataTableThemeData a, DataTableThemeData b, double t) {
-    assert(t != null);
-    return DataTableThemeData(
-      decoration: Decoration.lerp(a.decoration, b.decoration, t),
-      dataRowColor: _lerpProperties(a.dataRowColor, b.dataRowColor, t, Color.lerp),
-      dataRowHeight: lerpDouble(a.dataRowHeight, b.dataRowHeight, t),
-      dataTextStyle: TextStyle.lerp(a.dataTextStyle, b.dataTextStyle, t),
-      headingRowColor: _lerpProperties(a.headingRowColor, b.headingRowColor, t, Color.lerp),
-      headingRowHeight: lerpDouble(a.headingRowHeight, b.headingRowHeight, t),
-      headingTextStyle: TextStyle.lerp(a.headingTextStyle, b.headingTextStyle, t),
-      horizontalMargin: lerpDouble(a.horizontalMargin, b.horizontalMargin, t),
-      columnSpacing: lerpDouble(a.columnSpacing, b.columnSpacing, t),
-      dividerThickness: lerpDouble(a.dividerThickness, b.dividerThickness, t)
-    );
-  }
-
-  @override
-  int get hashCode {
-    return hashValues(
-      decoration,
-      dataRowColor,
-      dataRowHeight,
-      dataTextStyle,
-      headingRowColor,
-      headingRowHeight,
-      headingTextStyle,
-      horizontalMargin,
-      columnSpacing,
-      dividerThickness,
-    );
-  }
-
-  @override
-  bool operator ==(Object other) {
-    if (identical(this, other))
-      return true;
-    if (other.runtimeType != runtimeType)
-      return false;
-    return other is DataTableThemeData
-      && other.decoration == decoration
-      && other.dataRowColor == dataRowColor
-      && other.dataRowHeight == dataRowHeight
-      && other.dataTextStyle == dataTextStyle
-      && other.headingRowColor == headingRowColor
-      && other.headingRowHeight == headingRowHeight
-      && other.headingTextStyle == headingTextStyle
-      && other.horizontalMargin == horizontalMargin
-      && other.columnSpacing == columnSpacing
-      && other.dividerThickness == dividerThickness;
-  }
-
-  @override
-  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
-    super.debugFillProperties(properties);
-    properties.add(DiagnosticsProperty<Decoration>('decoration', decoration, defaultValue: null));
-    properties.add(DiagnosticsProperty<MaterialStateProperty<Color>>('dataRowColor', dataRowColor, defaultValue: null));
-    properties.add(DoubleProperty('dataRowHeight', dataRowHeight, defaultValue: null));
-    properties.add(DiagnosticsProperty<TextStyle>('dataTextStyle', dataTextStyle, defaultValue: null));
-    properties.add(DiagnosticsProperty<MaterialStateProperty<Color>>('headingRowColor', headingRowColor, defaultValue: null));
-    properties.add(DoubleProperty('headingRowHeight', headingRowHeight, defaultValue: null));
-    properties.add(DiagnosticsProperty<TextStyle>('headingTextStyle', headingTextStyle, defaultValue: null));
-    properties.add(DoubleProperty('horizontalMargin', horizontalMargin, defaultValue: null));
-    properties.add(DoubleProperty('columnSpacing', columnSpacing, defaultValue: null));
-    properties.add(DoubleProperty('dividerThickness', dividerThickness, defaultValue: null));
-  }
-
-  static MaterialStateProperty<T> _lerpProperties<T>(MaterialStateProperty<T> a, MaterialStateProperty<T> b, double t, T Function(T, T, double) lerpFunction ) {
-    // Avoid creating a _LerpProperties object for a common case.
-    if (a == null && b == null)
-      return null;
-    return _LerpProperties<T>(a, b, t, lerpFunction);
-  }
-}
-
-class _LerpProperties<T> implements MaterialStateProperty<T> {
-  const _LerpProperties(this.a, this.b, this.t, this.lerpFunction);
-
-  final MaterialStateProperty<T> a;
-  final MaterialStateProperty<T> b;
-  final double t;
-  final T Function(T, T, double) lerpFunction;
-
-  @override
-  T resolve(Set<MaterialState> states) {
-    final T resolvedA = a?.resolve(states);
-    final T resolvedB = b?.resolve(states);
-    return lerpFunction(resolvedA, resolvedB, t);
-  }
-}
-
-/// Applies a data table theme to descendant [DataTable] widgets.
-///
-/// Descendant widgets obtain the current theme's [DataTableTheme] object using
-/// [DataTableTheme.of]. When a widget uses [DataTableTheme.of], it is
-/// automatically rebuilt if the theme later changes.
-///
-/// A data table theme can be specified as part of the overall Material
-/// theme using [ThemeData.dataTableTheme].
-///
-/// See also:
-///
-///  * [DataTableThemeData], which describes the actual configuration
-///    of a data table theme.
-class DataTableTheme extends InheritedWidget {
-  /// Constructs a data table theme that configures all descendant
-  /// [DataTable] widgets.
-  ///
-  /// The [data] must not be null.
-  const DataTableTheme({
-    Key key,
-    @required this.data,
-    Widget child,
-  }) : assert(data != null), super(key: key, child: child);
-
-  /// The properties used for all descendant [DataTable] widgets.
-  final DataTableThemeData data;
-
-  /// Returns the configuration [data] from the closest
-  /// [DataTableTheme] ancestor. If there is no ancestor, it returns
-  /// [ThemeData.dataTableTheme]. Applications can assume that the
-  /// returned value will not be null.
-  ///
-  /// Typical usage is as follows:
-  ///
-  /// ```dart
-  /// DataTableThemeData theme = DataTableTheme.of(context);
-  /// ```
-  static DataTableThemeData of(BuildContext context) {
-    final DataTableTheme dataTableTheme = context.dependOnInheritedWidgetOfExactType<DataTableTheme>();
-    return dataTableTheme?.data ?? Theme.of(context).dataTableTheme;
-  }
-
-  @override
-  bool updateShouldNotify(DataTableTheme oldWidget) => data != oldWidget.data;
-}
diff --git a/packages/flutter/lib/src/material/paginated_data_table.dart b/packages/flutter/lib/src/material/paginated_data_table.dart
index 1269a42..a0e9937 100644
--- a/packages/flutter/lib/src/material/paginated_data_table.dart
+++ b/packages/flutter/lib/src/material/paginated_data_table.dart
@@ -476,7 +476,6 @@
                     horizontalMargin: widget.horizontalMargin,
                     columnSpacing: widget.columnSpacing,
                     showCheckboxColumn: widget.showCheckboxColumn,
-                    showBottomBorder: true,
                     rows: _getRows(_firstRowIndex, widget.rowsPerPage),
                   ),
                 ),
diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart
index 566193e..389d21f 100644
--- a/packages/flutter/lib/src/material/theme_data.dart
+++ b/packages/flutter/lib/src/material/theme_data.dart
@@ -22,7 +22,6 @@
 import 'chip_theme.dart';
 import 'color_scheme.dart';
 import 'colors.dart';
-import 'data_table_theme.dart';
 import 'dialog_theme.dart';
 import 'divider_theme.dart';
 import 'elevated_button_theme.dart';
@@ -284,7 +283,6 @@
     ElevatedButtonThemeData elevatedButtonTheme,
     OutlinedButtonThemeData outlinedButtonTheme,
     TextSelectionThemeData textSelectionTheme,
-    DataTableThemeData dataTableTheme,
     bool fixTextFieldOutlineLabel,
     bool useTextSelectionTheme,
   }) {
@@ -402,7 +400,6 @@
     elevatedButtonTheme ??= const ElevatedButtonThemeData();
     outlinedButtonTheme ??= const OutlinedButtonThemeData();
     textSelectionTheme ??= const TextSelectionThemeData();
-    dataTableTheme ??= const DataTableThemeData();
 
     fixTextFieldOutlineLabel ??= false;
     useTextSelectionTheme ??= false;
@@ -478,7 +475,6 @@
       elevatedButtonTheme: elevatedButtonTheme,
       outlinedButtonTheme: outlinedButtonTheme,
       textSelectionTheme: textSelectionTheme,
-      dataTableTheme: dataTableTheme,
       fixTextFieldOutlineLabel: fixTextFieldOutlineLabel,
       useTextSelectionTheme: useTextSelectionTheme,
     );
@@ -565,7 +561,6 @@
     @required this.elevatedButtonTheme,
     @required this.outlinedButtonTheme,
     @required this.textSelectionTheme,
-    @required this.dataTableTheme,
     @required this.fixTextFieldOutlineLabel,
     @required this.useTextSelectionTheme,
   }) : assert(visualDensity != null),
@@ -634,8 +629,8 @@
        assert(textButtonTheme != null),
        assert(elevatedButtonTheme != null),
        assert(outlinedButtonTheme != null),
+       assert(fixTextFieldOutlineLabel != null),
        assert(textSelectionTheme != null),
-       assert(dataTableTheme != null),
        assert(fixTextFieldOutlineLabel != null),
        assert(useTextSelectionTheme != null);
 
@@ -1112,10 +1107,6 @@
   /// A theme for customizing the appearance and layout of [TextField] widgets.
   final TextSelectionThemeData textSelectionTheme;
 
-  /// A theme for customizing the appearance and layout of [DataTable]
-  /// widgets.
-  final DataTableThemeData dataTableTheme;
-
   /// A temporary flag to allow apps to opt-in to a
   /// [small fix](https://github.com/flutter/flutter/issues/54028) for the Y
   /// coordinate of the floating label in a [TextField] [OutlineInputBorder].
@@ -1215,7 +1206,6 @@
     ElevatedButtonThemeData elevatedButtonTheme,
     OutlinedButtonThemeData outlinedButtonTheme,
     TextSelectionThemeData textSelectionTheme,
-    DataTableThemeData dataTableTheme,
     bool fixTextFieldOutlineLabel,
     bool useTextSelectionTheme,
   }) {
@@ -1291,7 +1281,6 @@
       elevatedButtonTheme: elevatedButtonTheme ?? this.elevatedButtonTheme,
       outlinedButtonTheme: outlinedButtonTheme ?? this.outlinedButtonTheme,
       textSelectionTheme: textSelectionTheme ?? this.textSelectionTheme,
-      dataTableTheme: dataTableTheme ?? this.dataTableTheme,
       fixTextFieldOutlineLabel: fixTextFieldOutlineLabel ?? this.fixTextFieldOutlineLabel,
       useTextSelectionTheme: useTextSelectionTheme ?? this.useTextSelectionTheme,
     );
@@ -1445,7 +1434,6 @@
       elevatedButtonTheme: ElevatedButtonThemeData.lerp(a.elevatedButtonTheme, b.elevatedButtonTheme, t),
       outlinedButtonTheme: OutlinedButtonThemeData.lerp(a.outlinedButtonTheme, b.outlinedButtonTheme, t),
       textSelectionTheme: TextSelectionThemeData .lerp(a.textSelectionTheme, b.textSelectionTheme, t),
-      dataTableTheme: DataTableThemeData.lerp(a.dataTableTheme, b.dataTableTheme, t),
       fixTextFieldOutlineLabel: t < 0.5 ? a.fixTextFieldOutlineLabel : b.fixTextFieldOutlineLabel,
       useTextSelectionTheme: t < 0.5 ? a.useTextSelectionTheme : b.useTextSelectionTheme,
     );
@@ -1527,7 +1515,6 @@
         && other.elevatedButtonTheme == elevatedButtonTheme
         && other.outlinedButtonTheme == outlinedButtonTheme
         && other.textSelectionTheme == textSelectionTheme
-        && other.dataTableTheme == dataTableTheme
         && other.fixTextFieldOutlineLabel == fixTextFieldOutlineLabel
         && other.useTextSelectionTheme == useTextSelectionTheme;
   }
@@ -1608,7 +1595,6 @@
       elevatedButtonTheme,
       outlinedButtonTheme,
       textSelectionTheme,
-      dataTableTheme,
       fixTextFieldOutlineLabel,
       useTextSelectionTheme,
     ];
@@ -1687,7 +1673,6 @@
     properties.add(DiagnosticsProperty<TextButtonThemeData>('textButtonTheme', textButtonTheme, defaultValue: defaultData.textButtonTheme, level: DiagnosticLevel.debug));
     properties.add(DiagnosticsProperty<ElevatedButtonThemeData>('elevatedButtonTheme', elevatedButtonTheme, defaultValue: defaultData.elevatedButtonTheme, level: DiagnosticLevel.debug));
     properties.add(DiagnosticsProperty<OutlinedButtonThemeData>('outlinedButtonTheme', outlinedButtonTheme, defaultValue: defaultData.outlinedButtonTheme, level: DiagnosticLevel.debug));
-    properties.add(DiagnosticsProperty<DataTableThemeData>('dataTableTheme', dataTableTheme, defaultValue: defaultData.dataTableTheme, level: DiagnosticLevel.debug));
   }
 }
 
diff --git a/packages/flutter/test/material/data_table_test.dart b/packages/flutter/test/material/data_table_test.dart
index 722a861..eee3175 100644
--- a/packages/flutter/test/material/data_table_test.dart
+++ b/packages/flutter/test/material/data_table_test.dart
@@ -177,10 +177,6 @@
       MaterialApp(
         home: Material(
           child: DataTable(
-            headingTextStyle: const TextStyle(
-              fontSize: 14.0,
-              letterSpacing: 0.0, // Will overflow if letter spacing is larger than 0.0.
-            ),
             columns: <DataColumn>[
               DataColumn(
                 label: Text('X' * 2000),
@@ -199,7 +195,6 @@
         ),
       ),
     );
-
     expect(tester.renderObject<RenderBox>(find.byType(Text).first).size.width, greaterThan(800.0));
     expect(tester.renderObject<RenderBox>(find.byType(Row).first).size.width, greaterThan(800.0));
     expect(tester.takeException(), isNull); // column overflows table, but text doesn't overflow cell
@@ -697,7 +692,7 @@
     );
 
     // custom first column padding
-    padding = find.widgetWithText(Padding, 'Frozen yogurt').first;
+    padding = find.widgetWithText(Padding, 'Frozen yogurt');
     cellContent = find.widgetWithText(Align, 'Frozen yogurt'); // DataTable wraps its DataCells in an Align widget
     expect(
       tester.getRect(cellContent).left - tester.getRect(padding).left,
@@ -957,9 +952,9 @@
     );
 
     Table table = tester.widget(find.byType(Table));
-    TableRow tableRow = table.children.last;
+    TableRow tableRow = table.children.first;
     BoxDecoration boxDecoration = tableRow.decoration as BoxDecoration;
-    expect(boxDecoration.border.top.width, 1.0);
+    expect(boxDecoration.border.bottom.width, 1.0);
 
     const double thickness =  4.2;
     await tester.pumpWidget(
@@ -974,58 +969,9 @@
       ),
     );
     table = tester.widget(find.byType(Table));
-    tableRow = table.children.last;
+    tableRow = table.children.first;
     boxDecoration = tableRow.decoration as BoxDecoration;
-    expect(boxDecoration.border.top.width, thickness);
-  });
-
-  testWidgets('DataTable set show bottom border', (WidgetTester tester) async {
-    const List<DataColumn> columns = <DataColumn>[
-      DataColumn(label: Text('column1')),
-      DataColumn(label: Text('column2')),
-    ];
-
-    const List<DataCell> cells = <DataCell>[
-      DataCell(Text('cell1')),
-      DataCell(Text('cell2')),
-    ];
-
-    const List<DataRow> rows = <DataRow>[
-      DataRow(cells: cells),
-      DataRow(cells: cells),
-    ];
-
-    await tester.pumpWidget(
-      MaterialApp(
-        home: Material(
-          child: DataTable(
-            showBottomBorder: true,
-            columns: columns,
-            rows: rows,
-          ),
-        ),
-      ),
-    );
-
-    Table table = tester.widget(find.byType(Table));
-    TableRow tableRow = table.children.last;
-    BoxDecoration boxDecoration = tableRow.decoration as BoxDecoration;
-    expect(boxDecoration.border.bottom.width, 1.0);
-
-    await tester.pumpWidget(
-      MaterialApp(
-        home: Material(
-          child: DataTable(
-            columns: columns,
-            rows: rows,
-          ),
-        ),
-      ),
-    );
-    table = tester.widget(find.byType(Table));
-    tableRow = table.children.last;
-    boxDecoration = tableRow.decoration as BoxDecoration;
-    expect(boxDecoration.border.bottom.width, 0.0);
+    expect(boxDecoration.border.bottom.width, thickness);
   });
 
   testWidgets('DataTable column heading cell - with and without sorting', (WidgetTester tester) async {
@@ -1279,7 +1225,7 @@
     final TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Content1')));
     await tester.pump(const Duration(milliseconds: 200)); // splash is well underway
     final RenderBox box = Material.of(tester.element(find.byType(InkWell))) as RenderBox;
-    expect(box, paints..circle(x: 68.0, y: 24.0, color: pressedColor));
+    expect(box, paints..circle(x: 64.0, y: 24.0, color: pressedColor));
     await gesture.up();
   });
 }
diff --git a/packages/flutter/test/material/data_table_theme_test.dart b/packages/flutter/test/material/data_table_theme_test.dart
deleted file mode 100644
index fe409cd..0000000
--- a/packages/flutter/test/material/data_table_theme_test.dart
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// @dart = 2.8
-
-import 'package:flutter/material.dart';
-import 'package:flutter/rendering.dart';
-import 'package:flutter_test/flutter_test.dart';
-
-void main() {
-  test('DataTableThemeData copyWith, ==, hashCode basics', () {
-    expect(const DataTableThemeData(), const DataTableThemeData().copyWith());
-    expect(const DataTableThemeData().hashCode, const DataTableThemeData().copyWith().hashCode);
-  });
-
-  test('DataTableThemeData defaults', () {
-    const DataTableThemeData themeData = DataTableThemeData();
-    expect(themeData.decoration, null);
-    expect(themeData.dataRowColor, null);
-    expect(themeData.dataRowHeight, null);
-    expect(themeData.dataTextStyle, null);
-    expect(themeData.headingRowColor, null);
-    expect(themeData.headingRowHeight, null);
-    expect(themeData.headingTextStyle, null);
-    expect(themeData.horizontalMargin, null);
-    expect(themeData.columnSpacing, null);
-    expect(themeData.dividerThickness, null);
-
-    const DataTableTheme theme = DataTableTheme(data: DataTableThemeData());
-    expect(theme.data.decoration, null);
-    expect(theme.data.dataRowColor, null);
-    expect(theme.data.dataRowHeight, null);
-    expect(theme.data.dataTextStyle, null);
-    expect(theme.data.headingRowColor, null);
-    expect(theme.data.headingRowHeight, null);
-    expect(theme.data.headingTextStyle, null);
-    expect(theme.data.horizontalMargin, null);
-    expect(theme.data.columnSpacing, null);
-    expect(theme.data.dividerThickness, null);
-  });
-
-  testWidgets('Default DataTableThemeData debugFillProperties', (WidgetTester tester) async {
-    final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
-    const DataTableThemeData().debugFillProperties(builder);
-
-    final List<String> description = builder.properties
-      .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
-      .map((DiagnosticsNode node) => node.toString())
-      .toList();
-
-    expect(description, <String>[]);
-  });
-
-  testWidgets('DataTableThemeData implements debugFillProperties', (WidgetTester tester) async {
-    final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
-    DataTableThemeData(
-      decoration: const BoxDecoration(color: Color(0xfffffff0)),
-      dataRowColor: MaterialStateProperty.resolveWith<Color>(
-        (Set<MaterialState> states) => const Color(0xfffffff1),
-      ),
-      dataRowHeight: 51.0,
-      dataTextStyle: const TextStyle(fontSize: 12.0),
-      headingRowColor: MaterialStateProperty.resolveWith<Color>(
-        (Set<MaterialState> states) => const Color(0xfffffff2),
-      ),
-      headingRowHeight: 52.0,
-      headingTextStyle:  const TextStyle(fontSize: 14.0),
-      horizontalMargin: 3.0,
-      columnSpacing: 4.0,
-      dividerThickness: 5.0,
-    ).debugFillProperties(builder);
-
-    final List<String> description = builder.properties
-      .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
-      .map((DiagnosticsNode node) => node.toString())
-      .toList();
-
-    expect(description[0], 'decoration: BoxDecoration(color: Color(0xfffffff0))');
-    expect(description[1], 'dataRowColor: Instance of \'_MaterialStatePropertyWith<Color>\'');
-    expect(description[2], 'dataRowHeight: 51.0');
-    expect(description[3], 'dataTextStyle: TextStyle(inherit: true, size: 12.0)');
-    expect(description[4], 'headingRowColor: Instance of \'_MaterialStatePropertyWith<Color>\'');
-    expect(description[5], 'headingRowHeight: 52.0');
-    expect(description[6], 'headingTextStyle: TextStyle(inherit: true, size: 14.0)');
-    expect(description[7], 'horizontalMargin: 3.0');
-    expect(description[8], 'columnSpacing: 4.0');
-    expect(description[9], 'dividerThickness: 5.0');
-  });
-
-  testWidgets('DataTable is themeable', (WidgetTester tester) async {
-    const BoxDecoration decoration = BoxDecoration(color: Color(0xfffffff0));
-    final MaterialStateProperty<Color> dataRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff1),
-    );
-    const double dataRowHeight = 51.0;
-    const TextStyle dataTextStyle = TextStyle(fontSize: 12.5);
-    final MaterialStateProperty<Color> headingRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff2),
-    );
-    const double headingRowHeight = 52.0;
-    const TextStyle headingTextStyle = TextStyle(fontSize: 14.5);
-    const double horizontalMargin = 3.0;
-    const double columnSpacing = 4.0;
-    const double dividerThickness = 5.0;
-
-    await tester.pumpWidget(
-      MaterialApp(
-        theme: ThemeData(
-          dataTableTheme: DataTableThemeData(
-            decoration: decoration,
-            dataRowColor: dataRowColor,
-            dataRowHeight: dataRowHeight,
-            dataTextStyle: dataTextStyle,
-            headingRowColor: headingRowColor,
-            headingRowHeight: headingRowHeight,
-            headingTextStyle: headingTextStyle,
-            horizontalMargin: horizontalMargin,
-            columnSpacing: columnSpacing,
-            dividerThickness: dividerThickness,
-          ),
-        ),
-        home: Scaffold(
-          body: DataTable(
-            sortColumnIndex: 0,
-            columns: <DataColumn>[
-              DataColumn(
-                label: const Text('A'),
-                onSort: (int columnIndex, bool ascending) {},
-              ),
-              const DataColumn(label: Text('B')),
-            ],
-            rows: const <DataRow>[
-              DataRow(cells: <DataCell>[
-                DataCell(Text('Data')),
-                DataCell(Text('Data 2')),
-              ]),
-            ],
-          ),
-        ),
-      ),
-    );
-
-    final Finder dataTableInkFinder = find.descendant(of: find.byType(DataTable), matching: find.byType(Ink));
-    expect(tester.widgetList<Ink>(dataTableInkFinder).last.decoration, decoration);
-
-    final TextStyle dataRowTextStyle = tester.renderObject<RenderParagraph>(find.text('Data')).text.style;
-    expect(dataRowTextStyle.fontSize, dataTextStyle.fontSize);
-    expect(_tableRowBoxDecoration(tester: tester, index: 1).color, dataRowColor.resolve(<MaterialState>{}));
-    expect(_tableRowBoxDecoration(tester: tester, index: 1).border.top.width, dividerThickness);
-
-    final Finder dataRowContainer = find.ancestor(of: find.text('Data'), matching: find.byType(Container));
-    expect(tester.getSize(dataRowContainer).height, dataRowHeight);
-
-    final TextStyle headingRowTextStyle = tester.renderObject<RenderParagraph>(find.text('A')).text.style;
-    expect(headingRowTextStyle.fontSize, headingTextStyle.fontSize);
-    expect(_tableRowBoxDecoration(tester: tester, index: 0).color, headingRowColor.resolve(<MaterialState>{}));
-
-    final Finder headingRowContainer = find.ancestor(of: find.text('A'), matching: find.byType(Container));
-    expect(tester.getSize(headingRowContainer).height, headingRowHeight);
-    expect(tester.getTopLeft(find.text('A')).dx, horizontalMargin);
-    expect(tester.getTopLeft(find.text('Data 2')).dx - tester.getTopRight(find.text('Data')).dx, columnSpacing);
-  });
-
-  testWidgets('DataTable properties are taken over the theme values', (WidgetTester tester) async {
-    const BoxDecoration themeDecoration = BoxDecoration(color: Color(0xfffffff1));
-    final MaterialStateProperty<Color> themeDataRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff0),
-    );
-    const double themeDataRowHeight = 50.0;
-    const TextStyle themeDataTextStyle = TextStyle(fontSize: 11.5);
-    final MaterialStateProperty<Color> themeHeadingRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff1),
-    );
-    const double themeHeadingRowHeight = 51.0;
-    const TextStyle themeHeadingTextStyle = TextStyle(fontSize: 13.5);
-    const double themeHorizontalMargin = 2.0;
-    const double themeColumnSpacing = 3.0;
-    const double themeDividerThickness = 4.0;
-
-    const BoxDecoration decoration = BoxDecoration(color: Color(0xfffffff0));
-    final MaterialStateProperty<Color> dataRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff1),
-    );
-    const double dataRowHeight = 51.0;
-    const TextStyle dataTextStyle = TextStyle(fontSize: 12.5);
-    final MaterialStateProperty<Color> headingRowColor = MaterialStateProperty.resolveWith<Color>(
-      (Set<MaterialState> states) => const Color(0xfffffff2),
-    );
-    const double headingRowHeight = 52.0;
-    const TextStyle headingTextStyle = TextStyle(fontSize: 14.5);
-    const double horizontalMargin = 3.0;
-    const double columnSpacing = 4.0;
-    const double dividerThickness = 5.0;
-    await tester.pumpWidget(
-      MaterialApp(
-        theme: ThemeData(
-          dataTableTheme: DataTableThemeData(
-            decoration: themeDecoration,
-            dataRowColor: themeDataRowColor,
-            dataRowHeight: themeDataRowHeight,
-            dataTextStyle: themeDataTextStyle,
-            headingRowColor: themeHeadingRowColor,
-            headingRowHeight: themeHeadingRowHeight,
-            headingTextStyle: themeHeadingTextStyle,
-            horizontalMargin: themeHorizontalMargin,
-            columnSpacing: themeColumnSpacing,
-            dividerThickness: themeDividerThickness,
-          ),
-        ),
-        home: Scaffold(
-          body: DataTable(
-            decoration: decoration,
-            dataRowColor: dataRowColor,
-            dataRowHeight: dataRowHeight,
-            dataTextStyle: dataTextStyle,
-            headingRowColor: headingRowColor,
-            headingRowHeight: headingRowHeight,
-            headingTextStyle: headingTextStyle,
-            horizontalMargin: horizontalMargin,
-            columnSpacing: columnSpacing,
-            dividerThickness: dividerThickness,
-            sortColumnIndex: 0,
-            columns: <DataColumn>[
-              DataColumn(
-                label: const Text('A'),
-                onSort: (int columnIndex, bool ascending) {},
-              ),
-              const DataColumn(label: Text('B')),
-            ],
-            rows: const <DataRow>[
-              DataRow(cells: <DataCell>[
-                DataCell(Text('Data')),
-                DataCell(Text('Data 2')),
-              ]),
-            ],
-          ),
-        ),
-      ),
-    );
-
-    final Finder dataTableInkFinder = find.descendant(of: find.byType(DataTable), matching: find.byType(Ink));
-    expect(tester.widgetList<Ink>(dataTableInkFinder).last.decoration, decoration);
-
-    final TextStyle dataRowTextStyle = tester.renderObject<RenderParagraph>(find.text('Data')).text.style;
-    expect(dataRowTextStyle.fontSize, dataTextStyle.fontSize);
-    expect(_tableRowBoxDecoration(tester: tester, index: 1).color, dataRowColor.resolve(<MaterialState>{}));
-    expect(_tableRowBoxDecoration(tester: tester, index: 1).border.top.width, dividerThickness);
-
-    final Finder dataRowContainer = find.ancestor(of: find.text('Data'), matching: find.byType(Container));
-    expect(tester.getSize(dataRowContainer).height, dataRowHeight);
-
-    final TextStyle headingRowTextStyle = tester.renderObject<RenderParagraph>(find.text('A')).text.style;
-    expect(headingRowTextStyle.fontSize, headingTextStyle.fontSize);
-    expect(_tableRowBoxDecoration(tester: tester, index: 0).color, headingRowColor.resolve(<MaterialState>{}));
-
-    final Finder headingRowContainer = find.ancestor(of: find.text('A'), matching: find.byType(Container));
-    expect(tester.getSize(headingRowContainer).height, headingRowHeight);
-    expect(tester.getTopLeft(find.text('A')).dx, horizontalMargin);
-    expect(tester.getTopLeft(find.text('Data 2')).dx - tester.getTopRight(find.text('Data')).dx, columnSpacing);
-  });
-}
-
-BoxDecoration _tableRowBoxDecoration({WidgetTester tester, int index}) {
-  final Table table = tester.widget(find.byType(Table));
-  final TableRow tableRow = table.children[index];
-  return tableRow.decoration as BoxDecoration;
-}
diff --git a/packages/flutter/test/material/theme_data_test.dart b/packages/flutter/test/material/theme_data_test.dart
index 2bc3bf8..3ebf2dc 100644
--- a/packages/flutter/test/material/theme_data_test.dart
+++ b/packages/flutter/test/material/theme_data_test.dart
@@ -288,7 +288,6 @@
       elevatedButtonTheme: ElevatedButtonThemeData(style: ElevatedButton.styleFrom(primary: Colors.green)),
       outlinedButtonTheme: OutlinedButtonThemeData(style: OutlinedButton.styleFrom(primary: Colors.blue)),
       textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.black),
-      dataTableTheme: const DataTableThemeData(),
       fixTextFieldOutlineLabel: false,
       useTextSelectionTheme: false,
     );
@@ -377,7 +376,6 @@
       elevatedButtonTheme: const ElevatedButtonThemeData(),
       outlinedButtonTheme: const OutlinedButtonThemeData(),
       textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.white),
-      dataTableTheme: const DataTableThemeData(),
       fixTextFieldOutlineLabel: true,
       useTextSelectionTheme: true,
     );