feat(Tooltip): pass the default text style down the tree (#163259)
Modify the tooltip's DefaultTextStyle to use the actual default text style picked to fit the current theme and platform instead of hardcoding the bodyMedium text style. Closes: #163255 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
7e2b4e8f86
commit
612d39e0e6
@ -191,12 +191,6 @@ class Tooltip extends StatefulWidget {
|
|||||||
}) : assert(
|
}) : assert(
|
||||||
(message == null) != (richMessage == null),
|
(message == null) != (richMessage == null),
|
||||||
'Either `message` or `richMessage` must be specified',
|
'Either `message` or `richMessage` must be specified',
|
||||||
),
|
|
||||||
assert(
|
|
||||||
richMessage == null || textStyle == null,
|
|
||||||
'If `richMessage` is specified, `textStyle` will have no effect. '
|
|
||||||
'If you wish to provide a `textStyle` for a rich tooltip, add the '
|
|
||||||
'`textStyle` directly to the `richMessage` InlineSpan.',
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/// The text to display in the tooltip.
|
/// The text to display in the tooltip.
|
||||||
@ -978,8 +972,8 @@ class _TooltipOverlay extends StatelessWidget {
|
|||||||
this.padding,
|
this.padding,
|
||||||
this.margin,
|
this.margin,
|
||||||
this.decoration,
|
this.decoration,
|
||||||
this.textStyle,
|
required this.textStyle,
|
||||||
this.textAlign,
|
required this.textAlign,
|
||||||
required this.animation,
|
required this.animation,
|
||||||
required this.target,
|
required this.target,
|
||||||
required this.verticalOffset,
|
required this.verticalOffset,
|
||||||
@ -994,8 +988,8 @@ class _TooltipOverlay extends StatelessWidget {
|
|||||||
final EdgeInsetsGeometry? padding;
|
final EdgeInsetsGeometry? padding;
|
||||||
final EdgeInsetsGeometry? margin;
|
final EdgeInsetsGeometry? margin;
|
||||||
final Decoration? decoration;
|
final Decoration? decoration;
|
||||||
final TextStyle? textStyle;
|
final TextStyle textStyle;
|
||||||
final TextAlign? textAlign;
|
final TextAlign textAlign;
|
||||||
final Animation<double> animation;
|
final Animation<double> animation;
|
||||||
final Offset target;
|
final Offset target;
|
||||||
final double verticalOffset;
|
final double verticalOffset;
|
||||||
@ -1011,7 +1005,8 @@ class _TooltipOverlay extends StatelessWidget {
|
|||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints: BoxConstraints(minHeight: height),
|
constraints: BoxConstraints(minHeight: height),
|
||||||
child: DefaultTextStyle(
|
child: DefaultTextStyle(
|
||||||
style: Theme.of(context).textTheme.bodyMedium!,
|
style: textStyle,
|
||||||
|
textAlign: textAlign,
|
||||||
child: Semantics(
|
child: Semantics(
|
||||||
container: true,
|
container: true,
|
||||||
child: Container(
|
child: Container(
|
||||||
|
@ -3390,6 +3390,65 @@ void main() {
|
|||||||
|
|
||||||
await gesture.removePointer();
|
await gesture.removePointer();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets('Tooltip should pass its default text style down to widget spans', (
|
||||||
|
WidgetTester tester,
|
||||||
|
) async {
|
||||||
|
final GlobalKey<TooltipState> tooltipKey = GlobalKey<TooltipState>();
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Tooltip(
|
||||||
|
key: tooltipKey,
|
||||||
|
richMessage: const WidgetSpan(child: Text(tooltipText)),
|
||||||
|
child: Container(width: 100.0, height: 100.0, color: Colors.green[500]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
tooltipKey.currentState?.ensureTooltipVisible();
|
||||||
|
await tester.pump(const Duration(seconds: 2));
|
||||||
|
|
||||||
|
final Finder defaultTextStyle = find.ancestor(
|
||||||
|
of: find.text(tooltipText),
|
||||||
|
matching: find.byType(DefaultTextStyle),
|
||||||
|
);
|
||||||
|
final DefaultTextStyle textStyle = tester.widget<DefaultTextStyle>(defaultTextStyle.first);
|
||||||
|
expect(textStyle.style.color, Colors.white);
|
||||||
|
expect(textStyle.style.fontFamily, 'Roboto');
|
||||||
|
expect(textStyle.style.decoration, TextDecoration.none);
|
||||||
|
expect(
|
||||||
|
textStyle.style.debugLabel,
|
||||||
|
'((englishLike bodyMedium 2021).merge((blackMountainView bodyMedium).apply)).copyWith',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
testWidgets('Tooltip should apply provided text style to rich messages', (
|
||||||
|
WidgetTester tester,
|
||||||
|
) async {
|
||||||
|
final GlobalKey<TooltipState> tooltipKey = GlobalKey<TooltipState>();
|
||||||
|
const TextStyle expectedTextStyle = TextStyle(color: Colors.orange);
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Tooltip(
|
||||||
|
key: tooltipKey,
|
||||||
|
richMessage: const TextSpan(text: tooltipText),
|
||||||
|
textStyle: expectedTextStyle,
|
||||||
|
child: Container(width: 100.0, height: 100.0, color: Colors.green[500]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
tooltipKey.currentState?.ensureTooltipVisible();
|
||||||
|
await tester.pump(const Duration(seconds: 2));
|
||||||
|
|
||||||
|
final TextStyle textStyle = tester.widget<Text>(find.text(tooltipText)).style!;
|
||||||
|
final Finder defaultTextStyleFinder = find.ancestor(
|
||||||
|
of: find.text(tooltipText),
|
||||||
|
matching: find.byType(DefaultTextStyle),
|
||||||
|
);
|
||||||
|
final TextStyle defaultTextStyle =
|
||||||
|
tester.widget<DefaultTextStyle>(defaultTextStyleFinder.first).style;
|
||||||
|
expect(textStyle, same(expectedTextStyle));
|
||||||
|
expect(defaultTextStyle, same(expectedTextStyle));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> setWidgetForTooltipMode(
|
Future<void> setWidgetForTooltipMode(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user