Repository: flutter
Issue: `TextTheme` and `DefaultTextStyle` Have Very Unintuitive Interaction
Labels: framework,f: material design,has reproducible steps,found in release: 3.3,found in release: 3.6,team-design,triaged-design

`Theme` is the intuitive way for a developer to override multiple text styles in a part of their app at once. For example, a developer may want a subset of the widget tree to have different body text and display text styling than the rest of the app. However, `DefaultTextStyle` is the actual source of truth for the default text style, NOT the text theme, so if the developer uses `Theme` to wrap their widget sub tree, any text widgets explicitly referencing the theme will pick up the new styling, whereas widgets not explicitly referencing the theme will get the default text style which was set by the parent theme.

Even more confusingly, every time you wrap a widget in `Material`, it sets default text style to the nearest enclosing `bodyMedium` style. So sub-widgets wrapped in `Material` WILL pick up the new styling whereas those that are not will not.

This is extremely counterintuitive behavior and is hard to debug if you're not already familiar with the peculiarities of the text style system.

## Steps to Reproduce

1. Wrap a sub-tree in a `Theme` with an arbitrary distinct style for body medium
2. Put two `Text` widgets in the widget tree under the theme, one wrapped in `Material`, one not

**Expected results:** <!-- what did you want to see? -->

Both text widgets use the new body medium style.

**Actual results:** <!-- what did you see? -->

The text widget wrapped in `Material` uses the new body medium style. The other text widget uses the old body medium style.

**Potential solutions:**

Generally, I'd say the confusion comes from `DefaultTextStyle` and `Theme` having excessively overlapping responsibilities. `DefaultTextStyle` is really just a special-case of `Theme` where you only want to override a single text style instead of the entire text theme. A good solution should programmatically reflect this.

- Make `DefaultTextStyle` a thin wrapper that just wraps its child in a `Theme` widget with an overridden `bodyMedium` and make `DefaultTextStyle.of(context)` just return `Theme.of(context).bodyMedium` 
- Make `Theme` wrap it's child in `DefaultTextStyle(style: textTheme.bodyMedium, child: child)`
- Some other solution? Anything that makes this not so insanely confusing.

<details>
<summary>Code sample</summary>

<!--
      Please create a minimal reproducible sample that shows the problem
      and attach it below between the lines with the backticks.

      To create it you can use `flutter create bug` command and update the `main.dart` file.

      Alternatively, you can use https://dartpad.dev/
      which is capable of creating and running small Flutter apps.

      Without this we will unlikely be able to progress on the issue, and because of that
      we regretfully will have to close it.
-->

```dart
    return MaterialApp(
      theme: ThemeData(
        textTheme: const TextTheme(
          bodyText2: TextStyle(color: Colors.pink),
        ),
      ),
      home: Scaffold(
        backgroundColor: Colors.white,
        body: SafeArea(
          child: Column(
            children: [
              const Text('This is pink'),
              Theme(
                data: ThemeData(
                  textTheme: const TextTheme(
                    bodyText2: TextStyle(color: Colors.blue),
                  ),
                ),
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: const [
                    Text('This should be blue but it\'s pink'),
                    Material(
                      child: Text('This should be blue and it\'s blue, but that\'s confusing given that the above widget was pink'),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
```

</details>

![201784528-f8fb113b-82f4-4908-b9e8-5a255980a9c7](https://user-images.githubusercontent.com/10675231/201802204-aa123e7d-c3d3-4fbc-bbf9-2c9f4ed94558.png)