Visitar URL original
Nav bar static components respect ambient MediaQueryData (#174673) · flutter/flutter@d328555 · GitHub
Skip to content

Commit d328555

Browse files
authored
Nav bar static components respect ambient MediaQueryData (#174673)
Fixes [CupertinoSlidingSegmentedControl in CupertinoNavigationBar renders incorrectly in dark brightness (starting 3.35.0)](#174642) Fixes [[Cupertino] MediaQuery.of(context) returns Size(0,0) inside CupertinoNavigationBar trailing since Flutter 3.35](#174771 (comment)) Bug was introduced in [CupertinoSliverNavigationBar respects accessibility text scaling](#168866) See #174642 (comment)
1 parent 22c8ecd commit d328555

2 files changed

Lines changed: 59 additions & 27 deletions

File tree

‎packages/flutter/lib/src/cupertino/nav_bar.dart‎

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2027,11 +2027,7 @@ class _NavigationBarStaticComponents {
20272027
child: Padding(
20282028
padding: EdgeInsetsDirectional.only(start: padding?.start ?? _kNavBarEdgePadding),
20292029
child: MediaQuery(
2030-
data: MediaQueryData(
2031-
textScaler: MediaQuery.textScalerOf(
2032-
context,
2033-
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor),
2034-
),
2030+
data: MediaQuery.of(context).copyWith(textScaler: _clampedTextScaler(context)),
20352031
child: IconTheme.merge(data: const IconThemeData(size: 32.0), child: leadingContent),
20362032
),
20372033
),
@@ -2057,11 +2053,7 @@ class _NavigationBarStaticComponents {
20572053
return KeyedSubtree(
20582054
key: backChevronKey,
20592055
child: MediaQuery(
2060-
data: MediaQueryData(
2061-
textScaler: MediaQuery.textScalerOf(
2062-
context,
2063-
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor),
2064-
),
2056+
data: MediaQuery.of(context).copyWith(textScaler: _clampedTextScaler(context)),
20652057
child: const _BackChevron(),
20662058
),
20672059
);
@@ -2089,11 +2081,7 @@ class _NavigationBarStaticComponents {
20892081
return KeyedSubtree(
20902082
key: backLabelKey,
20912083
child: MediaQuery(
2092-
data: MediaQueryData(
2093-
textScaler: MediaQuery.textScalerOf(
2094-
context,
2095-
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor),
2096-
),
2084+
data: MediaQuery.of(context).copyWith(textScaler: _clampedTextScaler(context)),
20972085
child: _BackLabel(specifiedPreviousTitle: previousPageTitle, route: route),
20982086
),
20992087
);
@@ -2136,11 +2124,7 @@ class _NavigationBarStaticComponents {
21362124
return KeyedSubtree(
21372125
key: middleKey,
21382126
child: MediaQuery(
2139-
data: MediaQueryData(
2140-
textScaler: MediaQuery.textScalerOf(
2141-
context,
2142-
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor),
2143-
),
2127+
data: MediaQuery.of(context).copyWith(textScaler: _clampedTextScaler(context)),
21442128
child: middleContent,
21452129
),
21462130
);
@@ -2162,11 +2146,7 @@ class _NavigationBarStaticComponents {
21622146
child: Padding(
21632147
padding: EdgeInsetsDirectional.only(end: padding?.end ?? _kNavBarEdgePadding),
21642148
child: MediaQuery(
2165-
data: MediaQueryData(
2166-
textScaler: MediaQuery.textScalerOf(
2167-
context,
2168-
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor),
2169-
),
2149+
data: MediaQuery.of(context).copyWith(textScaler: _clampedTextScaler(context)),
21702150
child: IconTheme.merge(data: const IconThemeData(size: 32.0), child: userTrailing),
21712151
),
21722152
),
@@ -2200,7 +2180,7 @@ class _NavigationBarStaticComponents {
22002180
return KeyedSubtree(
22012181
key: largeTitleKey,
22022182
child: MediaQuery(
2203-
data: MediaQueryData(
2183+
data: MediaQuery.of(context).copyWith(
22042184
textScaler: TextScaler.linear(
22052185
_dampScaleFactor(
22062186
MediaQuery.textScalerOf(context).scale(_kNavBarLargeTitleHeightExtension),
@@ -2223,11 +2203,17 @@ class _NavigationBarStaticComponents {
22232203
return KeyedSubtree(
22242204
key: navBarBottomKey,
22252205
child: MediaQuery(
2226-
data: MediaQueryData(textScaler: MediaQuery.textScalerOf(context)),
2206+
data: MediaQuery.of(context).copyWith(textScaler: MediaQuery.textScalerOf(context)),
22272207
child: userBottom ?? const SizedBox.shrink(),
22282208
),
22292209
);
22302210
}
2211+
2212+
static TextScaler _clampedTextScaler(BuildContext context) {
2213+
return MediaQuery.textScalerOf(
2214+
context,
2215+
).clamp(minScaleFactor: 1.0, maxScaleFactor: _kMaxScaleFactor);
2216+
}
22312217
}
22322218

22332219
/// A nav bar back button typically used in [CupertinoNavigationBar].

‎packages/flutter/test/cupertino/nav_bar_test.dart‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,52 @@ void main() {
451451
expect(count, 0x010101);
452452
});
453453

454+
testWidgets('Nav bar static components respect MediaQueryData', (WidgetTester tester) async {
455+
// This is a regression test for https://github.com/flutter/flutter/issues/174642
456+
const double value = 10.0;
457+
458+
void expectCustomMediaQueryData(BuildContext context) {
459+
expect(MediaQuery.platformBrightnessOf(context), Brightness.dark);
460+
expect(MediaQuery.devicePixelRatioOf(context), value);
461+
expect(MediaQuery.viewInsetsOf(context), const EdgeInsets.all(value));
462+
}
463+
464+
await tester.pumpWidget(
465+
CupertinoApp(
466+
home: MediaQuery(
467+
data: const MediaQueryData(
468+
devicePixelRatio: value,
469+
viewInsets: EdgeInsets.all(value),
470+
platformBrightness: Brightness.dark,
471+
),
472+
child: CupertinoNavigationBar(
473+
leading: Builder(
474+
builder: (BuildContext context) {
475+
expectCustomMediaQueryData(context);
476+
return CupertinoButton(onPressed: () {}, child: const Text('leading'));
477+
},
478+
),
479+
middle: Builder(
480+
builder: (BuildContext context) {
481+
expectCustomMediaQueryData(context);
482+
return CupertinoButton(onPressed: () {}, child: const Text('middle'));
483+
},
484+
),
485+
trailing: Builder(
486+
builder: (BuildContext context) {
487+
expectCustomMediaQueryData(context);
488+
return CupertinoButton(onPressed: () {}, child: const Text('trailing'));
489+
},
490+
),
491+
),
492+
),
493+
),
494+
);
495+
expect(find.text('leading'), findsOneWidget);
496+
expect(find.text('middle'), findsOneWidget);
497+
expect(find.text('trailing'), findsOneWidget);
498+
});
499+
454500
testWidgets('No slivers with no large titles', (WidgetTester tester) async {
455501
await tester.pumpWidget(
456502
const CupertinoApp(

0 commit comments

Comments
 (0)