Skip to content

Commit 0e93a0d

Browse files
moffatmangspencergoog
authored andcommitted
Fix MediaQuery.paddingOf (flutter#116858)
* Fix MediaQuery.paddingOf * Try to fix test overflow on web
1 parent 0005f78 commit 0e93a0d

File tree

2 files changed

+230
-17
lines changed

2 files changed

+230
-17
lines changed

packages/flutter/lib/src/widgets/media_query.dart

Lines changed: 99 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ class MediaQueryData {
667667
&& other.padding == padding
668668
&& other.viewPadding == viewPadding
669669
&& other.viewInsets == viewInsets
670+
&& other.systemGestureInsets == systemGestureInsets
670671
&& other.alwaysUse24HourFormat == alwaysUse24HourFormat
671672
&& other.highContrast == highContrast
672673
&& other.disableAnimations == disableAnimations
@@ -708,6 +709,7 @@ class MediaQueryData {
708709
'padding: $padding',
709710
'viewPadding: $viewPadding',
710711
'viewInsets: $viewInsets',
712+
'systemGestureInsets: $systemGestureInsets',
711713
'alwaysUse24HourFormat: $alwaysUse24HourFormat',
712714
'accessibleNavigation: $accessibleNavigation',
713715
'highContrast: $highContrast',
@@ -1282,23 +1284,103 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> {
12821284

12831285
@override
12841286
bool updateShouldNotifyDependent(MediaQuery oldWidget, Set<Object> dependencies) {
1285-
return (data.size != oldWidget.data.size && dependencies.contains(_MediaQueryAspect.size))
1286-
|| (data.orientation != oldWidget.data.orientation && dependencies.contains(_MediaQueryAspect.orientation))
1287-
|| (data.devicePixelRatio != oldWidget.data.devicePixelRatio && dependencies.contains(_MediaQueryAspect.devicePixelRatio))
1288-
|| (data.textScaleFactor != oldWidget.data.textScaleFactor && dependencies.contains(_MediaQueryAspect.textScaleFactor))
1289-
|| (data.platformBrightness != oldWidget.data.platformBrightness && dependencies.contains(_MediaQueryAspect.platformBrightness))
1290-
|| (data.viewInsets != oldWidget.data.viewInsets && dependencies.contains(_MediaQueryAspect.viewInsets))
1291-
|| (data.systemGestureInsets != oldWidget.data.systemGestureInsets && dependencies.contains(_MediaQueryAspect.systemGestureInsets))
1292-
|| (data.viewPadding != oldWidget.data.viewPadding && dependencies.contains(_MediaQueryAspect.viewPadding))
1293-
|| (data.alwaysUse24HourFormat != oldWidget.data.alwaysUse24HourFormat && dependencies.contains(_MediaQueryAspect.alwaysUse24HourFormat))
1294-
|| (data.accessibleNavigation != oldWidget.data.accessibleNavigation && dependencies.contains(_MediaQueryAspect.accessibleNavigation))
1295-
|| (data.invertColors != oldWidget.data.invertColors && dependencies.contains(_MediaQueryAspect.invertColors))
1296-
|| (data.highContrast != oldWidget.data.highContrast && dependencies.contains(_MediaQueryAspect.highContrast))
1297-
|| (data.disableAnimations != oldWidget.data.disableAnimations && dependencies.contains(_MediaQueryAspect.disableAnimations))
1298-
|| (data.boldText != oldWidget.data.boldText && dependencies.contains(_MediaQueryAspect.boldText))
1299-
|| (data.navigationMode != oldWidget.data.navigationMode && dependencies.contains(_MediaQueryAspect.navigationMode))
1300-
|| (data.gestureSettings != oldWidget.data.gestureSettings && dependencies.contains(_MediaQueryAspect.gestureSettings))
1301-
|| (data.displayFeatures != oldWidget.data.displayFeatures && dependencies.contains(_MediaQueryAspect.displayFeatures));
1287+
for (final Object dependency in dependencies) {
1288+
if (dependency is _MediaQueryAspect) {
1289+
switch (dependency) {
1290+
case _MediaQueryAspect.size:
1291+
if (data.size != oldWidget.data.size) {
1292+
return true;
1293+
}
1294+
break;
1295+
case _MediaQueryAspect.orientation:
1296+
if (data.orientation != oldWidget.data.orientation) {
1297+
return true;
1298+
}
1299+
break;
1300+
case _MediaQueryAspect.devicePixelRatio:
1301+
if (data.devicePixelRatio != oldWidget.data.devicePixelRatio) {
1302+
return true;
1303+
}
1304+
break;
1305+
case _MediaQueryAspect.textScaleFactor:
1306+
if (data.textScaleFactor != oldWidget.data.textScaleFactor) {
1307+
return true;
1308+
}
1309+
break;
1310+
case _MediaQueryAspect.platformBrightness:
1311+
if (data.platformBrightness != oldWidget.data.platformBrightness) {
1312+
return true;
1313+
}
1314+
break;
1315+
case _MediaQueryAspect.padding:
1316+
if (data.padding != oldWidget.data.padding) {
1317+
return true;
1318+
}
1319+
break;
1320+
case _MediaQueryAspect.viewInsets:
1321+
if (data.viewInsets != oldWidget.data.viewInsets) {
1322+
return true;
1323+
}
1324+
break;
1325+
case _MediaQueryAspect.systemGestureInsets:
1326+
if (data.systemGestureInsets != oldWidget.data.systemGestureInsets) {
1327+
return true;
1328+
}
1329+
break;
1330+
case _MediaQueryAspect.viewPadding:
1331+
if (data.viewPadding != oldWidget.data.viewPadding) {
1332+
return true;
1333+
}
1334+
break;
1335+
case _MediaQueryAspect.alwaysUse24HourFormat:
1336+
if (data.alwaysUse24HourFormat != oldWidget.data.alwaysUse24HourFormat) {
1337+
return true;
1338+
}
1339+
break;
1340+
case _MediaQueryAspect.accessibleNavigation:
1341+
if (data.accessibleNavigation != oldWidget.data.accessibleNavigation) {
1342+
return true;
1343+
}
1344+
break;
1345+
case _MediaQueryAspect.invertColors:
1346+
if (data.invertColors != oldWidget.data.invertColors) {
1347+
return true;
1348+
}
1349+
break;
1350+
case _MediaQueryAspect.highContrast:
1351+
if (data.highContrast != oldWidget.data.highContrast) {
1352+
return true;
1353+
}
1354+
break;
1355+
case _MediaQueryAspect.disableAnimations:
1356+
if (data.disableAnimations != oldWidget.data.disableAnimations) {
1357+
return true;
1358+
}
1359+
break;
1360+
case _MediaQueryAspect.boldText:
1361+
if (data.boldText != oldWidget.data.boldText) {
1362+
return true;
1363+
}
1364+
break;
1365+
case _MediaQueryAspect.navigationMode:
1366+
if (data.navigationMode != oldWidget.data.navigationMode) {
1367+
return true;
1368+
}
1369+
break;
1370+
case _MediaQueryAspect.gestureSettings:
1371+
if (data.gestureSettings != oldWidget.data.gestureSettings) {
1372+
return true;
1373+
}
1374+
break;
1375+
case _MediaQueryAspect.displayFeatures:
1376+
if (data.displayFeatures != oldWidget.data.displayFeatures) {
1377+
return true;
1378+
}
1379+
break;
1380+
}
1381+
}
1382+
}
1383+
return false;
13021384
}
13031385
}
13041386

packages/flutter/test/widgets/media_query_test.dart

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,40 @@ import 'package:flutter/gestures.dart';
88
import 'package:flutter/material.dart';
99
import 'package:flutter_test/flutter_test.dart';
1010

11+
class _MediaQueryAspectCase {
12+
const _MediaQueryAspectCase(this.method, this.data);
13+
final Function(BuildContext) method;
14+
final MediaQueryData data;
15+
}
16+
17+
class _MediaQueryAspectVariant extends TestVariant<_MediaQueryAspectCase> {
18+
_MediaQueryAspectVariant({
19+
required this.values
20+
});
21+
22+
@override
23+
final List<_MediaQueryAspectCase> values;
24+
25+
static _MediaQueryAspectCase? aspect;
26+
27+
@override
28+
String describeValue(_MediaQueryAspectCase value) {
29+
return value.method.toString();
30+
}
31+
32+
@override
33+
Future<_MediaQueryAspectCase?> setUp(_MediaQueryAspectCase value) async {
34+
final _MediaQueryAspectCase? oldAspect = aspect;
35+
aspect = value;
36+
return oldAspect;
37+
}
38+
39+
@override
40+
Future<void> tearDown(_MediaQueryAspectCase value, _MediaQueryAspectCase? memento) async {
41+
aspect = memento;
42+
}
43+
}
44+
1145
void main() {
1246
testWidgets('MediaQuery does not have a default', (WidgetTester tester) async {
1347
bool tested = false;
@@ -1013,4 +1047,101 @@ void main() {
10131047
expect(sizeBuildCount, 2);
10141048
expect(textScaleFactorBuildCount, 2);
10151049
});
1050+
1051+
testWidgets('MediaQuery partial dependencies', (WidgetTester tester) async {
1052+
MediaQueryData data = const MediaQueryData();
1053+
1054+
int buildCount = 0;
1055+
1056+
final Widget builder = Builder(
1057+
builder: (BuildContext context) {
1058+
_MediaQueryAspectVariant.aspect!.method(context);
1059+
buildCount++;
1060+
return const SizedBox.shrink();
1061+
}
1062+
);
1063+
1064+
final Widget page = StatefulBuilder(
1065+
builder: (BuildContext context, StateSetter setState) {
1066+
return MediaQuery(
1067+
data: data,
1068+
child: ListView(
1069+
children: <Widget>[
1070+
builder,
1071+
ElevatedButton(
1072+
onPressed: () {
1073+
setState(() {
1074+
data = _MediaQueryAspectVariant.aspect!.data;
1075+
});
1076+
},
1077+
child: const Text('Change data')
1078+
),
1079+
ElevatedButton(
1080+
onPressed: () {
1081+
setState(() {
1082+
data = data.copyWith();
1083+
});
1084+
},
1085+
child: const Text('Copy data')
1086+
)
1087+
]
1088+
)
1089+
);
1090+
},
1091+
);
1092+
1093+
await tester.pumpWidget(MaterialApp(home: page));
1094+
expect(buildCount, 1);
1095+
1096+
await tester.tap(find.text('Copy data'));
1097+
await tester.pumpAndSettle();
1098+
expect(buildCount, 1);
1099+
1100+
await tester.tap(find.text('Change data'));
1101+
await tester.pumpAndSettle();
1102+
expect(buildCount, 2);
1103+
1104+
await tester.tap(find.text('Copy data'));
1105+
await tester.pumpAndSettle();
1106+
expect(buildCount, 2);
1107+
}, variant: _MediaQueryAspectVariant(
1108+
values: <_MediaQueryAspectCase>[
1109+
const _MediaQueryAspectCase(MediaQuery.sizeOf, MediaQueryData(size: Size(1, 1))),
1110+
const _MediaQueryAspectCase(MediaQuery.maybeSizeOf, MediaQueryData(size: Size(1, 1))),
1111+
const _MediaQueryAspectCase(MediaQuery.orientationOf, MediaQueryData(size: Size(2, 1))),
1112+
const _MediaQueryAspectCase(MediaQuery.maybeOrientationOf, MediaQueryData(size: Size(2, 1))),
1113+
const _MediaQueryAspectCase(MediaQuery.devicePixelRatioOf, MediaQueryData(devicePixelRatio: 1.1)),
1114+
const _MediaQueryAspectCase(MediaQuery.maybeDevicePixelRatioOf, MediaQueryData(devicePixelRatio: 1.1)),
1115+
const _MediaQueryAspectCase(MediaQuery.textScaleFactorOf, MediaQueryData(textScaleFactor: 1.1)),
1116+
const _MediaQueryAspectCase(MediaQuery.maybeTextScaleFactorOf, MediaQueryData(textScaleFactor: 1.1)),
1117+
const _MediaQueryAspectCase(MediaQuery.platformBrightnessOf, MediaQueryData(platformBrightness: Brightness.dark)),
1118+
const _MediaQueryAspectCase(MediaQuery.maybePlatformBrightnessOf, MediaQueryData(platformBrightness: Brightness.dark)),
1119+
const _MediaQueryAspectCase(MediaQuery.paddingOf, MediaQueryData(padding: EdgeInsets.all(1))),
1120+
const _MediaQueryAspectCase(MediaQuery.maybePaddingOf, MediaQueryData(padding: EdgeInsets.all(1))),
1121+
const _MediaQueryAspectCase(MediaQuery.viewInsetsOf, MediaQueryData(viewInsets: EdgeInsets.all(1))),
1122+
const _MediaQueryAspectCase(MediaQuery.maybeViewInsetsOf, MediaQueryData(viewInsets: EdgeInsets.all(1))),
1123+
const _MediaQueryAspectCase(MediaQuery.systemGestureInsetsOf, MediaQueryData(systemGestureInsets: EdgeInsets.all(1))),
1124+
const _MediaQueryAspectCase(MediaQuery.maybeSystemGestureInsetsOf, MediaQueryData(systemGestureInsets: EdgeInsets.all(1))),
1125+
const _MediaQueryAspectCase(MediaQuery.viewPaddingOf, MediaQueryData(viewPadding: EdgeInsets.all(1))),
1126+
const _MediaQueryAspectCase(MediaQuery.maybeViewPaddingOf, MediaQueryData(viewPadding: EdgeInsets.all(1))),
1127+
const _MediaQueryAspectCase(MediaQuery.alwaysUse24HourFormatOf, MediaQueryData(alwaysUse24HourFormat: true)),
1128+
const _MediaQueryAspectCase(MediaQuery.maybeAlwaysUse24HourFormatOf, MediaQueryData(alwaysUse24HourFormat: true)),
1129+
const _MediaQueryAspectCase(MediaQuery.accessibleNavigationOf, MediaQueryData(accessibleNavigation: true)),
1130+
const _MediaQueryAspectCase(MediaQuery.maybeAccessibleNavigationOf, MediaQueryData(accessibleNavigation: true)),
1131+
const _MediaQueryAspectCase(MediaQuery.invertColorsOf, MediaQueryData(invertColors: true)),
1132+
const _MediaQueryAspectCase(MediaQuery.maybeInvertColorsOf, MediaQueryData(invertColors: true)),
1133+
const _MediaQueryAspectCase(MediaQuery.highContrastOf, MediaQueryData(highContrast: true)),
1134+
const _MediaQueryAspectCase(MediaQuery.maybeHighContrastOf, MediaQueryData(highContrast: true)),
1135+
const _MediaQueryAspectCase(MediaQuery.disableAnimationsOf, MediaQueryData(disableAnimations: true)),
1136+
const _MediaQueryAspectCase(MediaQuery.maybeDisableAnimationsOf, MediaQueryData(disableAnimations: true)),
1137+
const _MediaQueryAspectCase(MediaQuery.boldTextOf, MediaQueryData(boldText: true)),
1138+
const _MediaQueryAspectCase(MediaQuery.maybeBoldTextOf, MediaQueryData(boldText: true)),
1139+
const _MediaQueryAspectCase(MediaQuery.navigationModeOf, MediaQueryData(navigationMode: NavigationMode.directional)),
1140+
const _MediaQueryAspectCase(MediaQuery.maybeNavigationModeOf, MediaQueryData(navigationMode: NavigationMode.directional)),
1141+
const _MediaQueryAspectCase(MediaQuery.gestureSettingsOf, MediaQueryData(gestureSettings: DeviceGestureSettings(touchSlop: 1))),
1142+
const _MediaQueryAspectCase(MediaQuery.maybeGestureSettingsOf, MediaQueryData(gestureSettings: DeviceGestureSettings(touchSlop: 1))),
1143+
const _MediaQueryAspectCase(MediaQuery.displayFeaturesOf, MediaQueryData(displayFeatures: <DisplayFeature>[DisplayFeature(bounds: Rect.zero, type: DisplayFeatureType.unknown, state: DisplayFeatureState.unknown)])),
1144+
const _MediaQueryAspectCase(MediaQuery.maybeDisplayFeaturesOf, MediaQueryData(displayFeatures: <DisplayFeature>[DisplayFeature(bounds: Rect.zero, type: DisplayFeatureType.unknown, state: DisplayFeatureState.unknown)])),
1145+
]
1146+
));
10161147
}

0 commit comments

Comments
 (0)