From c910d8d58d3a32b5316a538f121b0039f856cb29 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 06:09:09 -0400 Subject: [PATCH 001/108] Roll Engine from 586c90c1336f to 4228b72286ff (4 revisions) (#102290) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index f8a6975cadca4..84146a74fee68 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -586c90c1336f9bba303a4ce6147c212ffffdd5d8 +4228b72286ff76303ae632d6db5a047f86ee6e69 From 1065ca000b3ce16573d88c37d022d5d416699610 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 12:04:07 -0400 Subject: [PATCH 002/108] Roll Plugins from 6e18c7195678 to 5c3c1b8aac06 (7 revisions) (#102306) --- bin/internal/flutter_plugins.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/flutter_plugins.version b/bin/internal/flutter_plugins.version index 03bde7b570745..a083a54bc9ded 100644 --- a/bin/internal/flutter_plugins.version +++ b/bin/internal/flutter_plugins.version @@ -1 +1 @@ -6e18c7195678f5f2ff12e79a5fe738280a66fe26 +5c3c1b8aac065aa1988f114d0c66ecec758e9cbb From a9eaee55eaa4d6ad5e3ac6f584ef169435173ece Mon Sep 17 00:00:00 2001 From: yusuf-goog <91688203+yusuf-goog@users.noreply.github.com> Date: Thu, 21 Apr 2022 09:35:24 -0700 Subject: [PATCH 003/108] Switch ci.yaml Linux builders to Debian. (#102253) In preparation for upgrading linux VMs to Ubuntu, specify builders to use 'os: Debian' instead of 'os: Linux'. There should be no functional changes to current builders with this change. Bug:102252 --- .ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci.yaml b/.ci.yaml index dcf183eff6baa..d54143a5d21f2 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -26,7 +26,7 @@ platform_properties: [ {"dependency": "curl"} ] - os: Linux + os: Debian device_type: none linux_android: properties: From e4edcbceb388c79fc2002a1b84159dab5f41c5e5 Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Thu, 21 Apr 2022 20:39:09 +0300 Subject: [PATCH 004/108] Improve 'NestedScrollView and internal scrolling' test to account for all the inner children layers (#102309) --- .../test/widgets/nested_scroll_view_test.dart | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/flutter/test/widgets/nested_scroll_view_test.dart b/packages/flutter/test/widgets/nested_scroll_view_test.dart index 212e86428e3af..62a257e38d59a 100644 --- a/packages/flutter/test/widgets/nested_scroll_view_test.dart +++ b/packages/flutter/test/widgets/nested_scroll_view_test.dart @@ -599,9 +599,15 @@ void main() { return child; } if (child is ContainerLayer) { - final PhysicalModelLayer? candidate = _dfsFindPhysicalLayer(child); - if (candidate != null) { - return candidate; + Layer? innerChild = child.firstChild; + while (innerChild != null) { + if (innerChild is ContainerLayer) { + final PhysicalModelLayer? candidate = _dfsFindPhysicalLayer(innerChild); + if (candidate != null) { + return candidate; + } + } + innerChild = innerChild.nextSibling; } } child = child.nextSibling; From 49e043a2c006ef334682b2feb6e9b9f423e3e2db Mon Sep 17 00:00:00 2001 From: Flutter GitHub Bot Date: Thu, 21 Apr 2022 10:49:09 -0700 Subject: [PATCH 005/108] Marks Linux_android gradient_dynamic_perf__e2e_summary to be unflaky (#101832) --- .ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.ci.yaml b/.ci.yaml index d54143a5d21f2..ede503f7e59a8 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -2376,7 +2376,6 @@ targets: scheduler: luci - name: Linux_android gradient_dynamic_perf__e2e_summary - bringup: true recipe: devicelab/devicelab_drone presubmit: false timeout: 60 From d3ce6d6eb1788cd274f6b1a1e333e31dcc512a8e Mon Sep 17 00:00:00 2001 From: Flutter GitHub Bot Date: Thu, 21 Apr 2022 11:09:10 -0700 Subject: [PATCH 006/108] Marks Mac_ios cubic_bezier_perf_ios_sksl_warmup__timeline_summary to be flaky (#102231) --- .ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci.yaml b/.ci.yaml index ede503f7e59a8..13fdac329be53 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -3276,6 +3276,7 @@ targets: scheduler: luci - name: Mac_ios cubic_bezier_perf_ios_sksl_warmup__timeline_summary + bringup: true # Flaky https://github.com/flutter/flutter/issues/102230 recipe: devicelab/devicelab_drone presubmit: false timeout: 60 From 73b4a7cb9ed73e7b92fa02cc46813e76b0e62c6e Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 15:04:07 -0400 Subject: [PATCH 007/108] Roll Engine from 4228b72286ff to 701e5e8f44ac (4 revisions) (#102316) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 84146a74fee68..6b14862e5a17e 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -4228b72286ff76303ae632d6db5a047f86ee6e69 +701e5e8f44acea0c556adda5c84d1b877096c0b4 From ec6481bed84613ada10d52a39fd123ba88280952 Mon Sep 17 00:00:00 2001 From: drewroengoogle <102626803+drewroengoogle@users.noreply.github.com> Date: Thu, 21 Apr 2022 19:12:38 +0000 Subject: [PATCH 008/108] Change dependency from ios_signing to apple_signing (#102259) * Change dependency name to apple_signing for a better understanding of it's use * Updated Mac_ios test to run if .ci.yaml is updated --- .ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci.yaml b/.ci.yaml index 13fdac329be53..eaee1eb4d8915 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -125,7 +125,7 @@ platform_properties: [ {"dependency": "xcode"}, {"dependency": "gems"}, - {"dependency": "ios_signing"} + {"dependency": "apple_signing"} ] os: Mac-12 cpu: x86 @@ -3365,6 +3365,7 @@ targets: task_name: hot_mode_dev_cycle_macos_target__benchmark runIf: - dev/** + - .ci.yaml scheduler: luci - name: Mac_ios integration_test_test_ios From 2ebc7bee9ca1ef992d2111902b4134d5896741ad Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Thu, 21 Apr 2022 12:14:09 -0700 Subject: [PATCH 009/108] Adds tooltip to semantics node (#87684) --- .../flutter/lib/src/material/tooltip.dart | 2 +- .../flutter/lib/src/rendering/proxy_box.dart | 16 ++++++ .../flutter/lib/src/semantics/semantics.dart | 51 ++++++++++++++++++- packages/flutter/lib/src/widgets/basic.dart | 7 ++- .../lib/src/widgets/semantics_debugger.dart | 20 +++++--- .../test/material/back_button_test.dart | 2 +- .../material/calendar_date_picker_test.dart | 4 +- packages/flutter/test/material/chip_test.dart | 2 +- .../test/material/date_picker_test.dart | 4 +- .../material/floating_action_button_test.dart | 4 +- .../flutter/test/material/search_test.dart | 2 +- .../flutter/test/material/tooltip_test.dart | 5 +- .../test/material/tooltip_theme_test.dart | 6 ++- .../test/semantics/semantics_test.dart | 2 + .../test/semantics/semantics_update_test.dart | 3 +- .../flutter/test/widgets/semantics_test.dart | 28 ++++++++++ .../test/widgets/semantics_tester.dart | 10 ++++ .../flutter_test/lib/src/accessibility.dart | 2 +- packages/flutter_test/lib/src/matchers.dart | 8 +++ packages/flutter_test/test/matchers_test.dart | 1 + 20 files changed, 154 insertions(+), 25 deletions(-) diff --git a/packages/flutter/lib/src/material/tooltip.dart b/packages/flutter/lib/src/material/tooltip.dart index 7b49f81eb15e9..fd70a6b5eec2d 100644 --- a/packages/flutter/lib/src/material/tooltip.dart +++ b/packages/flutter/lib/src/material/tooltip.dart @@ -698,7 +698,7 @@ class TooltipState extends State with SingleTickerProviderStateMixin { _enableFeedback = widget.enableFeedback ?? tooltipTheme.enableFeedback ?? _defaultEnableFeedback; Widget result = Semantics( - label: _excludeFromSemantics + tooltip: _excludeFromSemantics ? null : _tooltipMessage, child: widget.child, diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 7d204b807671b..32fb58e9433ba 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -3859,6 +3859,7 @@ class RenderSemanticsAnnotations extends RenderProxyBox { AttributedString? attributedIncreasedValue, AttributedString? attributedDecreasedValue, AttributedString? attributedHint, + String? tooltip, SemanticsHintOverrides? hintOverrides, TextDirection? textDirection, SemanticsSortKey? sortKey, @@ -3917,6 +3918,7 @@ class RenderSemanticsAnnotations extends RenderProxyBox { _attributedIncreasedValue = attributedIncreasedValue, _attributedDecreasedValue = attributedDecreasedValue, _attributedHint = attributedHint, + _tooltip = tooltip, _hintOverrides = hintOverrides, _textDirection = textDirection, _sortKey = sortKey, @@ -4311,6 +4313,18 @@ class RenderSemanticsAnnotations extends RenderProxyBox { markNeedsSemanticsUpdate(); } + /// If non-null, sets the [SemanticsNode.tooltip] semantic to the given value. + /// + /// The reading direction is given by [textDirection]. + String? get tooltip => _tooltip; + String? _tooltip; + set tooltip(String? value) { + if (_tooltip == value) + return; + _tooltip = value; + markNeedsSemanticsUpdate(); + } + /// If non-null, sets the [SemanticsConfiguration.hintOverrides] to the given value. SemanticsHintOverrides? get hintOverrides => _hintOverrides; SemanticsHintOverrides? _hintOverrides; @@ -4843,6 +4857,8 @@ class RenderSemanticsAnnotations extends RenderProxyBox { config.attributedDecreasedValue = attributedDecreasedValue!; if (attributedHint != null) config.attributedHint = attributedHint!; + if (tooltip != null) + config.tooltip = tooltip!; if (hintOverrides != null && hintOverrides!.isNotEmpty) config.hintOverrides = hintOverrides; if (scopesRoute != null) diff --git a/packages/flutter/lib/src/semantics/semantics.dart b/packages/flutter/lib/src/semantics/semantics.dart index 851cd5e8819f9..a7373e589d195 100644 --- a/packages/flutter/lib/src/semantics/semantics.dart +++ b/packages/flutter/lib/src/semantics/semantics.dart @@ -316,6 +316,7 @@ class SemanticsData with Diagnosticable { required this.attributedIncreasedValue, required this.attributedDecreasedValue, required this.attributedHint, + required this.tooltip, required this.textDirection, required this.rect, required this.elevation, @@ -339,6 +340,7 @@ class SemanticsData with Diagnosticable { assert(attributedDecreasedValue != null), assert(attributedIncreasedValue != null), assert(attributedHint != null), + assert(tooltip == '' || textDirection != null, 'A SemanticsData object with tooltip "$tooltip" had a null textDirection.'), assert(attributedLabel.string == '' || textDirection != null, 'A SemanticsData object with label "${attributedLabel.string}" had a null textDirection.'), assert(attributedValue.string == '' || textDirection != null, 'A SemanticsData object with value "${attributedValue.string}" had a null textDirection.'), assert(attributedDecreasedValue.string == '' || textDirection != null, 'A SemanticsData object with decreasedValue "${attributedDecreasedValue.string}" had a null textDirection.'), @@ -429,6 +431,11 @@ class SemanticsData with Diagnosticable { /// See also [hint], which exposes just the raw text. final AttributedString attributedHint; + /// A textual description of the widget's tooltip. + /// + /// The reading direction is given by [textDirection]. + final String tooltip; + /// The reading direction for the text in [label], [value], /// [increasedValue], [decreasedValue], and [hint]. final TextDirection? textDirection; @@ -587,6 +594,7 @@ class SemanticsData with Diagnosticable { properties.add(AttributedStringProperty('increasedValue', attributedIncreasedValue)); properties.add(AttributedStringProperty('decreasedValue', attributedDecreasedValue)); properties.add(AttributedStringProperty('hint', attributedHint)); + properties.add(StringProperty('tooltip', tooltip, defaultValue: '')); properties.add(EnumProperty('textDirection', textDirection, defaultValue: null)); if (textSelection?.isValid ?? false) properties.add(MessageProperty('textSelection', '[${textSelection!.start}, ${textSelection!.end}]')); @@ -610,6 +618,7 @@ class SemanticsData with Diagnosticable { && other.attributedIncreasedValue == attributedIncreasedValue && other.attributedDecreasedValue == attributedDecreasedValue && other.attributedHint == attributedHint + && other.tooltip == tooltip && other.textDirection == textDirection && other.rect == rect && setEquals(other.tags, tags) @@ -637,6 +646,7 @@ class SemanticsData with Diagnosticable { attributedIncreasedValue, attributedDecreasedValue, attributedHint, + tooltip, textDirection, rect, tags, @@ -648,8 +658,8 @@ class SemanticsData with Diagnosticable { scrollExtentMin, platformViewId, maxValueLength, - currentValueLength, Object.hash( + currentValueLength, transform, elevation, thickness, @@ -785,6 +795,7 @@ class SemanticsProperties extends DiagnosticableTree { this.decreasedValue, this.attributedDecreasedValue, this.hint, + this.tooltip, this.attributedHint, this.hintOverrides, this.textDirection, @@ -1178,6 +1189,16 @@ class SemanticsProperties extends DiagnosticableTree { /// * [hint] for a plain string version of this property. final AttributedString? attributedHint; + /// Provides a textual description of the widget's tooltip. + /// + /// In Android, this property sets the `AccessibilityNodeInfo.setTooltipText`. + /// In iOS, this property is appended to the end of the + /// `UIAccessibilityElement.accessibilityLabel`. + /// + /// If a [tooltip] is provided, there must either by an ambient + /// [Directionality] or an explicit [textDirection] should be provided. + final String? tooltip; + /// Provides hint values which override the default hints on supported /// platforms. /// @@ -1469,6 +1490,7 @@ class SemanticsProperties extends DiagnosticableTree { properties.add(AttributedStringProperty('attributedDecreasedValue', attributedDecreasedValue, defaultValue: null)); properties.add(StringProperty('hint', hint, defaultValue: null)); properties.add(AttributedStringProperty('attributedHint', attributedHint, defaultValue: null)); + properties.add(StringProperty('tooltip', tooltip)); properties.add(EnumProperty('textDirection', textDirection, defaultValue: null)); properties.add(DiagnosticsProperty('sortKey', sortKey, defaultValue: null)); properties.add(DiagnosticsProperty('hintOverrides', hintOverrides, defaultValue: null)); @@ -1898,6 +1920,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { || _attributedValue != config.attributedValue || _attributedIncreasedValue != config.attributedIncreasedValue || _attributedDecreasedValue != config.attributedDecreasedValue + || _tooltip != config.tooltip || _flags != config._flags || _textDirection != config.textDirection || _sortKey != config._sortKey @@ -2027,6 +2050,12 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { AttributedString get attributedHint => _attributedHint; AttributedString _attributedHint = _kEmptyConfig.attributedHint; + /// A textual description of the widget's tooltip. + /// + /// The reading direction is given by [textDirection]. + String get tooltip => _tooltip; + String _tooltip = _kEmptyConfig.tooltip; + /// The elevation along the z-axis at which the [rect] of this [SemanticsNode] /// is located above its parent. /// @@ -2235,6 +2264,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { _attributedIncreasedValue = config.attributedIncreasedValue; _attributedDecreasedValue = config.attributedDecreasedValue; _attributedHint = config.attributedHint; + _tooltip = config.tooltip; _hintOverrides = config.hintOverrides; _elevation = config.elevation; _thickness = config.thickness; @@ -2282,6 +2312,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { AttributedString attributedIncreasedValue = _attributedIncreasedValue; AttributedString attributedDecreasedValue = _attributedDecreasedValue; AttributedString attributedHint = _attributedHint; + String tooltip = _tooltip; TextDirection? textDirection = _textDirection; Set? mergedTags = tags == null ? null : Set.of(tags!); TextSelection? textSelection = _textSelection; @@ -2336,6 +2367,8 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { attributedIncreasedValue = node._attributedIncreasedValue; if (attributedDecreasedValue == null || attributedDecreasedValue.string == '') attributedDecreasedValue = node._attributedDecreasedValue; + if (tooltip == '') + tooltip = node._tooltip; if (node.tags != null) { mergedTags ??= {}; mergedTags!.addAll(node.tags!); @@ -2385,6 +2418,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { attributedIncreasedValue: attributedIncreasedValue, attributedDecreasedValue: attributedDecreasedValue, attributedHint: attributedHint, + tooltip: tooltip, textDirection: textDirection, rect: rect, transform: transform, @@ -2457,6 +2491,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { decreasedValueAttributes: data.attributedDecreasedValue.attributes, hint: data.attributedHint.string, hintAttributes: data.attributedHint.attributes, + tooltip: data.tooltip, textDirection: data.textDirection, textSelectionBase: data.textSelection != null ? data.textSelection!.baseOffset : -1, textSelectionExtent: data.textSelection != null ? data.textSelection!.extentOffset : -1, @@ -2595,6 +2630,7 @@ class SemanticsNode extends AbstractNode with DiagnosticableTreeMixin { properties.add(AttributedStringProperty('increasedValue', _attributedIncreasedValue)); properties.add(AttributedStringProperty('decreasedValue', _attributedDecreasedValue)); properties.add(AttributedStringProperty('hint', _attributedHint)); + properties.add(StringProperty('tooltip', _tooltip, defaultValue: '')); properties.add(EnumProperty('textDirection', _textDirection, defaultValue: null)); properties.add(DiagnosticsProperty('sortKey', sortKey, defaultValue: null)); if (_textSelection?.isValid ?? false) @@ -3955,6 +3991,16 @@ class SemanticsConfiguration { _hasBeenAnnotated = true; } + /// A textual description of the widget's tooltip. + /// + /// The reading direction is given by [textDirection]. + String get tooltip => _tooltip; + String _tooltip = ''; + set tooltip(String tooltip) { + _tooltip = tooltip; + _hasBeenAnnotated = true; + } + /// Provides hint values which override the default hints on supported /// platforms. SemanticsHintOverrides? get hintOverrides => _hintOverrides; @@ -4420,6 +4466,8 @@ class SemanticsConfiguration { otherAttributedString: child._attributedHint, otherTextDirection: child.textDirection, ); + if (_tooltip == '') + _tooltip = child._tooltip; _thickness = math.max(_thickness, child._thickness + child._elevation); @@ -4442,6 +4490,7 @@ class SemanticsConfiguration { .._attributedDecreasedValue = _attributedDecreasedValue .._attributedHint = _attributedHint .._hintOverrides = _hintOverrides + .._tooltip = _tooltip .._elevation = _elevation .._thickness = _thickness .._flags = _flags diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index 417f09f2a18ea..f565db3598e2e 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -6695,6 +6695,7 @@ class Semantics extends SingleChildRenderObjectWidget { AttributedString? attributedDecreasedValue, String? hint, AttributedString? attributedHint, + String? tooltip, String? onTapHint, String? onLongPressHint, TextDirection? textDirection, @@ -6759,6 +6760,7 @@ class Semantics extends SingleChildRenderObjectWidget { attributedDecreasedValue: attributedDecreasedValue, hint: hint, attributedHint: attributedHint, + tooltip: tooltip, textDirection: textDirection, sortKey: sortKey, tagForChildren: tagForChildren, @@ -6901,6 +6903,7 @@ class Semantics extends SingleChildRenderObjectWidget { attributedIncreasedValue: _effectiveAttributedIncreasedValue, attributedDecreasedValue: _effectiveAttributedDecreasedValue, attributedHint: _effectiveAttributedHint, + tooltip: properties.tooltip, hintOverrides: properties.hintOverrides, textDirection: _getTextDirection(context), sortKey: properties.sortKey, @@ -6936,7 +6939,8 @@ class Semantics extends SingleChildRenderObjectWidget { final bool containsText = properties.attributedLabel != null || properties.label != null || properties.value != null || - properties.hint != null; + properties.hint != null || + properties.tooltip != null; if (!containsText) return null; @@ -6977,6 +6981,7 @@ class Semantics extends SingleChildRenderObjectWidget { ..attributedIncreasedValue = _effectiveAttributedIncreasedValue ..attributedDecreasedValue = _effectiveAttributedDecreasedValue ..attributedHint = _effectiveAttributedHint + ..tooltip = properties.tooltip ..hintOverrides = properties.hintOverrides ..namesRoute = properties.namesRoute ..textDirection = _getTextDirection(context) diff --git a/packages/flutter/lib/src/widgets/semantics_debugger.dart b/packages/flutter/lib/src/widgets/semantics_debugger.dart index b7796248921dd..062659186cd3e 100644 --- a/packages/flutter/lib/src/widgets/semantics_debugger.dart +++ b/packages/flutter/lib/src/widgets/semantics_debugger.dart @@ -281,27 +281,33 @@ class _SemanticsDebuggerPainter extends CustomPainter { assert(data.attributedLabel != null); final String message; - if (data.attributedLabel.string.isEmpty) { + final String tooltipAndLabel = [ + if (data.tooltip.isNotEmpty) + data.tooltip, + if (data.attributedLabel.string.isNotEmpty) + data.attributedLabel.string, + ].join('\n'); + if (tooltipAndLabel.isEmpty) { message = annotations.join('; '); } else { - final String label; + final String effectivelabel; if (data.textDirection == null) { - label = '${Unicode.FSI}${data.attributedLabel.string}${Unicode.PDI}'; + effectivelabel = '${Unicode.FSI}$tooltipAndLabel${Unicode.PDI}'; annotations.insert(0, 'MISSING TEXT DIRECTION'); } else { switch (data.textDirection!) { case TextDirection.rtl: - label = '${Unicode.RLI}${data.attributedLabel.string}${Unicode.PDF}'; + effectivelabel = '${Unicode.RLI}$tooltipAndLabel${Unicode.PDF}'; break; case TextDirection.ltr: - label = data.attributedLabel.string; + effectivelabel = tooltipAndLabel; break; } } if (annotations.isEmpty) { - message = label; + message = effectivelabel; } else { - message = '$label (${annotations.join('; ')})'; + message = '$effectivelabel (${annotations.join('; ')})'; } } diff --git a/packages/flutter/test/material/back_button_test.dart b/packages/flutter/test/material/back_button_test.dart index eb4db41a6bab1..d4ff9a92ffab1 100644 --- a/packages/flutter/test/material/back_button_test.dart +++ b/packages/flutter/test/material/back_button_test.dart @@ -154,7 +154,7 @@ void main() { await tester.pumpAndSettle(); expect(tester.getSemantics(find.byType(BackButton)), matchesSemantics( - label: 'Back', + tooltip: 'Back', isButton: true, hasEnabledState: true, isEnabled: true, diff --git a/packages/flutter/test/material/calendar_date_picker_test.dart b/packages/flutter/test/material/calendar_date_picker_test.dart index bf1add0ef3b3b..f21300a043847 100644 --- a/packages/flutter/test/material/calendar_date_picker_test.dart +++ b/packages/flutter/test/material/calendar_date_picker_test.dart @@ -649,7 +649,7 @@ void main() { // Prev/Next month buttons. expect(tester.getSemantics(previousMonthIcon), matchesSemantics( - label: 'Previous month', + tooltip: 'Previous month', isButton: true, hasTapAction: true, isEnabled: true, @@ -657,7 +657,7 @@ void main() { isFocusable: true, )); expect(tester.getSemantics(nextMonthIcon), matchesSemantics( - label: 'Next month', + tooltip: 'Next month', isButton: true, hasTapAction: true, isEnabled: true, diff --git a/packages/flutter/test/material/chip_test.dart b/packages/flutter/test/material/chip_test.dart index 80cb5ccec09fe..ea4c7947a20a4 100644 --- a/packages/flutter/test/material/chip_test.dart +++ b/packages/flutter/test/material/chip_test.dart @@ -1964,7 +1964,7 @@ void main() { ], children: [ TestSemantics( - label: 'Delete', + tooltip: 'Delete', actions: [SemanticsAction.tap], textDirection: TextDirection.ltr, flags: [ diff --git a/packages/flutter/test/material/date_picker_test.dart b/packages/flutter/test/material/date_picker_test.dart index 45ab8b05ccb97..525148fb82cf7 100644 --- a/packages/flutter/test/material/date_picker_test.dart +++ b/packages/flutter/test/material/date_picker_test.dart @@ -817,7 +817,7 @@ void main() { // Input mode toggle button expect(tester.getSemantics(switchToInputIcon), matchesSemantics( - label: 'Switch to input', + tooltip: 'Switch to input', isButton: true, hasTapAction: true, isEnabled: true, @@ -860,7 +860,7 @@ void main() { // Input mode toggle button expect(tester.getSemantics(switchToCalendarIcon), matchesSemantics( - label: 'Switch to calendar', + tooltip: 'Switch to calendar', isButton: true, hasTapAction: true, isEnabled: true, diff --git a/packages/flutter/test/material/floating_action_button_test.dart b/packages/flutter/test/material/floating_action_button_test.dart index 3b41bc336d01e..987e8a9905005 100644 --- a/packages/flutter/test/material/floating_action_button_test.dart +++ b/packages/flutter/test/material/floating_action_button_test.dart @@ -670,7 +670,7 @@ void main() { semantics.dispose(); }); - testWidgets('Tooltip is used as semantics label', (WidgetTester tester) async { + testWidgets('Tooltip is used as semantics tooltip', (WidgetTester tester) async { final SemanticsTester semantics = SemanticsTester(tester); await tester.pumpWidget( @@ -697,7 +697,7 @@ void main() { ], children: [ TestSemantics( - label: 'Add Photo', + tooltip: 'Add Photo', actions: [ SemanticsAction.tap, ], diff --git a/packages/flutter/test/material/search_test.dart b/packages/flutter/test/material/search_test.dart index 9d7ccb30daca4..9a6c24e1529d8 100644 --- a/packages/flutter/test/material/search_test.dart +++ b/packages/flutter/test/material/search_test.dart @@ -616,7 +616,7 @@ void main() { SemanticsFlag.isFocusable, ], actions: [SemanticsAction.tap], - label: 'Back', + tooltip: 'Back', textDirection: TextDirection.ltr, ), TestSemantics( diff --git a/packages/flutter/test/material/tooltip_test.dart b/packages/flutter/test/material/tooltip_test.dart index 842cf8b0c112c..2d25385bc6dc9 100644 --- a/packages/flutter/test/material/tooltip_test.dart +++ b/packages/flutter/test/material/tooltip_test.dart @@ -1263,7 +1263,7 @@ void main() { children: [ TestSemantics.rootChild( id: 1, - label: 'TIP', + tooltip: 'TIP', textDirection: TextDirection.ltr, ), ], @@ -1462,7 +1462,8 @@ void main() { flags: [SemanticsFlag.scopesRoute], children: [ TestSemantics( - label: 'Foo\nBar', + tooltip: 'Foo', + label: 'Bar', textDirection: TextDirection.ltr, ), ], diff --git a/packages/flutter/test/material/tooltip_theme_test.dart b/packages/flutter/test/material/tooltip_theme_test.dart index 999c335115b6a..2fedbf3a5e6f1 100644 --- a/packages/flutter/test/material/tooltip_theme_test.dart +++ b/packages/flutter/test/material/tooltip_theme_test.dart @@ -1066,7 +1066,8 @@ void main() { flags: [SemanticsFlag.scopesRoute], children: [ TestSemantics( - label: 'Foo\nBar', + tooltip: 'Foo', + label: 'Bar', textDirection: TextDirection.ltr, ), ], @@ -1108,7 +1109,8 @@ void main() { flags: [SemanticsFlag.scopesRoute], children: [ TestSemantics( - label: 'Foo\nBar', + tooltip: 'Foo', + label: 'Bar', textDirection: TextDirection.ltr, ), ], diff --git a/packages/flutter/test/semantics/semantics_test.dart b/packages/flutter/test/semantics/semantics_test.dart index ebc240b3436d4..4f2be0e967e11 100644 --- a/packages/flutter/test/semantics/semantics_test.dart +++ b/packages/flutter/test/semantics/semantics_test.dart @@ -561,6 +561,7 @@ void main() { ' increasedValue: ""\n' ' decreasedValue: ""\n' ' hint: ""\n' + ' tooltip: ""\n' ' textDirection: null\n' ' sortKey: null\n' ' platformViewId: null\n' @@ -659,6 +660,7 @@ void main() { ' increasedValue: ""\n' ' decreasedValue: ""\n' ' hint: ""\n' + ' tooltip: ""\n' ' textDirection: null\n' ' sortKey: null\n' ' platformViewId: null\n' diff --git a/packages/flutter/test/semantics/semantics_update_test.dart b/packages/flutter/test/semantics/semantics_update_test.dart index 78b0926dee053..0026e50674306 100644 --- a/packages/flutter/test/semantics/semantics_update_test.dart +++ b/packages/flutter/test/semantics/semantics_update_test.dart @@ -158,7 +158,8 @@ void main() { 'properties: SemanticsProperties, ' 'attributedLabel: "label" [SpellOutStringAttribute(TextRange(start: 0, end: 5))], ' 'attributedValue: "value" [LocaleStringAttribute(TextRange(start: 0, end: 5), en-MX)], ' - 'attributedHint: "hint" [SpellOutStringAttribute(TextRange(start: 1, end: 2))]' // ignore: missing_whitespace_between_adjacent_strings + 'attributedHint: "hint" [SpellOutStringAttribute(TextRange(start: 1, end: 2))], ' + 'tooltip: null'// ignore: missing_whitespace_between_adjacent_strings ')', ); diff --git a/packages/flutter/test/widgets/semantics_test.dart b/packages/flutter/test/widgets/semantics_test.dart index d8e6fc636d9da..5586aa83860a6 100644 --- a/packages/flutter/test/widgets/semantics_test.dart +++ b/packages/flutter/test/widgets/semantics_test.dart @@ -61,6 +61,34 @@ void main() { semantics.dispose(); }, semanticsEnabled: false); + testWidgets('Semantics tooltip', (WidgetTester tester) async { + final SemanticsTester semantics = SemanticsTester(tester); + + final TestSemantics expectedSemantics = TestSemantics.root( + children: [ + TestSemantics.rootChild( + tooltip: 'test1', + textDirection: TextDirection.ltr, + ), + ], + ); + + await tester.pumpWidget( + Semantics( + tooltip: 'test1', + textDirection: TextDirection.ltr, + ), + ); + + expect(semantics, hasSemantics( + expectedSemantics, + ignoreTransform: true, + ignoreRect: true, + ignoreId: true, + )); + semantics.dispose(); + }); + testWidgets('Detach and reattach assert', (WidgetTester tester) async { final SemanticsTester semantics = SemanticsTester(tester); final GlobalKey key = GlobalKey(); diff --git a/packages/flutter/test/widgets/semantics_tester.dart b/packages/flutter/test/widgets/semantics_tester.dart index 3c4cc90ac8112..e15332dfc7d31 100644 --- a/packages/flutter/test/widgets/semantics_tester.dart +++ b/packages/flutter/test/widgets/semantics_tester.dart @@ -39,6 +39,7 @@ class TestSemantics { this.actions = 0, this.label = '', this.value = '', + this.tooltip = '', this.increasedValue = '', this.decreasedValue = '', this.hint = '', @@ -72,6 +73,7 @@ class TestSemantics { this.increasedValue = '', this.decreasedValue = '', this.hint = '', + this.tooltip = '', this.textDirection, this.transform, this.textSelection, @@ -110,6 +112,7 @@ class TestSemantics { this.label = '', this.hint = '', this.value = '', + this.tooltip = '', this.increasedValue = '', this.decreasedValue = '', this.textDirection, @@ -176,6 +179,9 @@ class TestSemantics { /// performed on this node. final String hint; + /// A textual tooltip of this node. + final String tooltip; + /// The reading direction of the [label]. /// /// Even if this is not set, the [hasSemantics] matcher will verify that if a @@ -292,6 +298,8 @@ class TestSemantics { return fail('expected node id $id to have decreasedValue "$decreasedValue" but found value "${nodeData.decreasedValue}".'); if (hint != nodeData.hint) return fail('expected node id $id to have hint "$hint" but found hint "${nodeData.hint}".'); + if (tooltip != nodeData.tooltip) + return fail('expected node id $id to have tooltip "$tooltip" but found hint "${nodeData.tooltip}".'); if (textDirection != null && textDirection != nodeData.textDirection) return fail('expected node id $id to have textDirection "$textDirection" but found "${nodeData.textDirection}".'); if ((nodeData.label != '' || nodeData.value != '' || nodeData.hint != '' || node.increasedValue != '' || node.decreasedValue != '') && nodeData.textDirection == null) @@ -365,6 +373,8 @@ class TestSemantics { buf.writeln("$indent decreasedValue: '$decreasedValue',"); if (hint != null && hint != '') buf.writeln("$indent hint: '$hint',"); + if (tooltip != null && tooltip != '') + buf.writeln("$indent tooltip: '$tooltip',"); if (textDirection != null) buf.writeln('$indent textDirection: $textDirection,'); if (textSelection?.isValid ?? false) diff --git a/packages/flutter_test/lib/src/accessibility.dart b/packages/flutter_test/lib/src/accessibility.dart index 5bb9262a91745..f23c589b81de5 100644 --- a/packages/flutter_test/lib/src/accessibility.dart +++ b/packages/flutter_test/lib/src/accessibility.dart @@ -228,7 +228,7 @@ class LabeledTapTargetGuideline extends AccessibilityGuideline { !data.hasAction(ui.SemanticsAction.tap)) { return result; } - if (data.label == null || data.label.isEmpty) { + if ((data.label == null || data.label.isEmpty) && (data.tooltip == null || data.tooltip.isEmpty)) { result += Evaluation.fail( '$node: expected tappable node to have semantic label, ' 'but none was found.\n', diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart index bad708fe4f7b8..338e5bcaf1860 100644 --- a/packages/flutter_test/lib/src/matchers.dart +++ b/packages/flutter_test/lib/src/matchers.dart @@ -494,6 +494,7 @@ Matcher matchesSemantics({ String? increasedValue, AttributedString? attributedIncreasedValue, String? decreasedValue, + String? tooltip, AttributedString? attributedDecreasedValue, TextDirection? textDirection, Rect? rect, @@ -625,6 +626,7 @@ Matcher matchesSemantics({ value: value, attributedValue: attributedValue, increasedValue: increasedValue, + tooltip: tooltip, attributedIncreasedValue: attributedIncreasedValue, decreasedValue: decreasedValue, attributedDecreasedValue: attributedDecreasedValue, @@ -1783,6 +1785,7 @@ class _MatchesSemanticsData extends Matcher { this.attributedIncreasedValue, this.decreasedValue, this.attributedDecreasedValue, + this.tooltip, this.flags, this.actions, this.textDirection, @@ -1808,6 +1811,7 @@ class _MatchesSemanticsData extends Matcher { final AttributedString? attributedIncreasedValue; final String? decreasedValue; final AttributedString? attributedDecreasedValue; + final String? tooltip; final SemanticsHintOverrides? hintOverrides; final List? actions; final List? customActions; @@ -1845,6 +1849,8 @@ class _MatchesSemanticsData extends Matcher { description.add(' with decreasedValue: $decreasedValue '); if (attributedDecreasedValue != null) description.add(' with attributedDecreasedValue: $attributedDecreasedValue'); + if (tooltip != null) + description.add(' with tooltip: $tooltip'); if (actions != null) description.add(' with actions: ').addDescriptionOf(actions); if (flags != null) @@ -1942,6 +1948,8 @@ class _MatchesSemanticsData extends Matcher { return failWithDescription( matchState, 'attributedDecreasedValue was: ${data.attributedDecreasedValue}'); } + if (tooltip != null && tooltip != data.tooltip) + return failWithDescription(matchState, 'tooltip was: ${data.tooltip}'); if (textDirection != null && textDirection != data.textDirection) return failWithDescription(matchState, 'textDirection was: $textDirection'); if (rect != null && rect != data.rect) diff --git a/packages/flutter_test/test/matchers_test.dart b/packages/flutter_test/test/matchers_test.dart index 48a9d781035b6..4632aba6fc4ea 100644 --- a/packages/flutter_test/test/matchers_test.dart +++ b/packages/flutter_test/test/matchers_test.dart @@ -566,6 +566,7 @@ void main() { attributedValue: AttributedString('c'), attributedDecreasedValue: AttributedString('d'), attributedHint: AttributedString('e'), + tooltip: 'f', textDirection: TextDirection.ltr, rect: const Rect.fromLTRB(0.0, 0.0, 10.0, 10.0), elevation: 3.0, From ab889ab976fbe69ff9d54afbf1ba41a696c32b2c Mon Sep 17 00:00:00 2001 From: Abhishek Ghaskata Date: Fri, 22 Apr 2022 01:04:07 +0530 Subject: [PATCH 010/108] macos support for image_list (#84899) --- examples/image_list/macos/.gitignore | 6 + .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../macos/Runner.xcodeproj/project.pbxproj | 572 ++++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 89 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../image_list/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 +++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 46993 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 3276 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 1429 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 5933 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1243 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 14800 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 1874 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 339 +++++++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + examples/image_list/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 19 + .../macos/Runner/Release.entitlements | 8 + 26 files changed, 1214 insertions(+) create mode 100644 examples/image_list/macos/.gitignore create mode 100644 examples/image_list/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 examples/image_list/macos/Flutter/Flutter-Release.xcconfig create mode 100644 examples/image_list/macos/Runner.xcodeproj/project.pbxproj create mode 100644 examples/image_list/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/image_list/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 examples/image_list/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 examples/image_list/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/image_list/macos/Runner/AppDelegate.swift create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 examples/image_list/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 examples/image_list/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 examples/image_list/macos/Runner/Configs/Debug.xcconfig create mode 100644 examples/image_list/macos/Runner/Configs/Release.xcconfig create mode 100644 examples/image_list/macos/Runner/Configs/Warnings.xcconfig create mode 100644 examples/image_list/macos/Runner/DebugProfile.entitlements create mode 100644 examples/image_list/macos/Runner/Info.plist create mode 100644 examples/image_list/macos/Runner/MainFlutterWindow.swift create mode 100644 examples/image_list/macos/Runner/Release.entitlements diff --git a/examples/image_list/macos/.gitignore b/examples/image_list/macos/.gitignore new file mode 100644 index 0000000000000..d2fd3772308cc --- /dev/null +++ b/examples/image_list/macos/.gitignore @@ -0,0 +1,6 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/xcuserdata/ diff --git a/examples/image_list/macos/Flutter/Flutter-Debug.xcconfig b/examples/image_list/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000000000..c2efd0b608ba8 --- /dev/null +++ b/examples/image_list/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/image_list/macos/Flutter/Flutter-Release.xcconfig b/examples/image_list/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000000000..c2efd0b608ba8 --- /dev/null +++ b/examples/image_list/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/examples/image_list/macos/Runner.xcodeproj/project.pbxproj b/examples/image_list/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000000..65e1baa895ba6 --- /dev/null +++ b/examples/image_list/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* image_list.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "image_list.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* image_list.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* image_list.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/examples/image_list/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/image_list/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000000..18d981003d68d --- /dev/null +++ b/examples/image_list/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/image_list/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/image_list/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000000..8d8f1dd636d6d --- /dev/null +++ b/examples/image_list/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/image_list/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/image_list/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000000..1d526a16ed0f1 --- /dev/null +++ b/examples/image_list/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/image_list/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/image_list/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000000..18d981003d68d --- /dev/null +++ b/examples/image_list/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/image_list/macos/Runner/AppDelegate.swift b/examples/image_list/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000000000..d080d41951d35 --- /dev/null +++ b/examples/image_list/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +// 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. + +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000000..a2ec33f19f110 --- /dev/null +++ b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4935a7ca84f0976aca34b7f2895d65fb94d1ea GIT binary patch literal 46993 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 literal 0 HcmV?d00001 diff --git a/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4cc16421680a50164ba74381b4b35ceaa0ccfc GIT binary patch literal 3276 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 N;OXk;vd$@?2>?>Ex^Vyi literal 0 HcmV?d00001 diff --git a/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbf36df2f2aaaa0a63c7dabc94e600184229d0d GIT binary patch literal 5933 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 f$KZHO*s&vt|9^w-6P?|#0pRK8NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c&& zS>O>_%)r1c48n{Iv*t(u1=&kHeO=ifbFy+6aSK)V_AxLppYn8Z42d|rc6w}vOsL55 z`t&mC&y2@JTEyg!eDiFX^k#CC!jq%>erB=yHqUP0XcDOTw6ko}L zX;EmMrq(fKk*eygEuA616;0)>@A{TK|55PV@70 z$OfzS*(VJxQev3J?yY?O=ul(v`fp}?u9z`JK3ugibK>)DyCwImZOF4d{xK%%Ks1*} zv$oa)9anR%lXIBUqYnhLmT>VOzHfNP?ZwJNZ!5$s9M08RynIvaXw>@G^T9@r9^KH1 zVy??F&uuk)bH9Y4pQY!hP58i_H6 znl-NcuCpLV6ZWU;4C zu@9exF&OZi`Bovq_m%T+WhU2kvkz@^_LpycBvqm3bMpLw8X-Or5sL>0AKE1$(k_L=_Zc=CUq#=x1-QZf)G7nHu@fmsQ1eN_N3+nTEz`4HI4Z6uVlE zJH+X&det8JU?tO?upcM4Z=cV!JV;yF>FfL5Q$M|W_2Z!P`S=}Wzp|_1^#d%e?_H`> zV@%vA$+bFVqhw9`U;TfP|5|PD{||OiYdor8P*i??|NJcb%kzT_73*7WE?Ua5hAnR2 z=7WE=PhTlJ#ZeRznjTUb;`E(wkMZrj4e|Hilz-mK>9cZHQY**5TUPw~u}k;u73KI}xAx!0m-)GVia|x^d3p~s_9gh83jA&Ra<8rM%`>U3x69t&NzbwWY}7Ar?)FK#IZ0z|d0H0EkRO w3{9;}4Xg|ebq&m|3=9_N6z8I7$jwj5OsmAL;bP(Gi$Dzwp00i_>zopr02+f8CIA2c literal 0 HcmV?d00001 diff --git a/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/image_list/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e71a726136a47ed24125c7efc79d68a4a01961b4 GIT binary patch literal 14800 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/image_list/macos/Runner/Configs/AppInfo.xcconfig b/examples/image_list/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000000000..55939c7dca21e --- /dev/null +++ b/examples/image_list/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = image_list + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.imageList + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved. diff --git a/examples/image_list/macos/Runner/Configs/Debug.xcconfig b/examples/image_list/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000000000..36b0fd9464f45 --- /dev/null +++ b/examples/image_list/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/image_list/macos/Runner/Configs/Release.xcconfig b/examples/image_list/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000000000..dff4f49561c81 --- /dev/null +++ b/examples/image_list/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/examples/image_list/macos/Runner/Configs/Warnings.xcconfig b/examples/image_list/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000000000..42bcbf4780b18 --- /dev/null +++ b/examples/image_list/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/examples/image_list/macos/Runner/DebugProfile.entitlements b/examples/image_list/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000000000..dddb8a30c851e --- /dev/null +++ b/examples/image_list/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/examples/image_list/macos/Runner/Info.plist b/examples/image_list/macos/Runner/Info.plist new file mode 100644 index 0000000000000..4789daa6a443e --- /dev/null +++ b/examples/image_list/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/examples/image_list/macos/Runner/MainFlutterWindow.swift b/examples/image_list/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000000000..a97a96274ee93 --- /dev/null +++ b/examples/image_list/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,19 @@ +// 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. + +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/examples/image_list/macos/Runner/Release.entitlements b/examples/image_list/macos/Runner/Release.entitlements new file mode 100644 index 0000000000000..852fa1a4728ae --- /dev/null +++ b/examples/image_list/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + From 4a72c5345eca5540d1420019caf6217e638eeca5 Mon Sep 17 00:00:00 2001 From: Casey Hillers Date: Thu, 21 Apr 2022 12:49:08 -0700 Subject: [PATCH 011/108] [ci.yaml] Migrate bringup targets to cocoon scheduler (#102249) --- .ci.yaml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.ci.yaml b/.ci.yaml index eaee1eb4d8915..c8946b32847b9 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -1425,7 +1425,6 @@ targets: tags: > ["devicelab","android","linux"] task_name: android_semantics_integration_test - scheduler: luci - name: Linux_android android_stack_size_test recipe: devicelab/devicelab_drone @@ -2302,7 +2301,6 @@ targets: ] tags: > ["framework","hostonly"] - scheduler: luci timeout: 60 - name: Linux_android opacity_peephole_one_rect_perf__e2e_summary @@ -2383,7 +2381,6 @@ targets: tags: > ["devicelab","android","linux"] task_name: gradient_dynamic_perf__e2e_summary - scheduler: luci - name: Linux_android gradient_consistent_perf__e2e_summary bringup: true @@ -2394,7 +2391,6 @@ targets: tags: > ["devicelab","android","linux"] task_name: gradient_consistent_perf__e2e_summary - scheduler: luci - name: Linux_android gradient_static_perf__e2e_summary bringup: true @@ -2405,7 +2401,6 @@ targets: tags: > ["devicelab","android","linux"] task_name: gradient_static_perf__e2e_summary - scheduler: luci - name: Linux_android android_choreographer_do_frame_test recipe: devicelab/devicelab_drone @@ -2426,7 +2421,6 @@ targets: tags: > ["devicelab","android","linux"] task_name: android_lifecycles_test - scheduler: luci - name: Mac build_aar_module_test recipe: devicelab/devicelab_drone @@ -2908,7 +2902,6 @@ targets: tags: > ["framework","hostonly","shard"] test_timeout_secs: "2700" - scheduler: luci runIf: - dev/** - packages/flutter_tools/** @@ -3103,7 +3096,6 @@ targets: tags: > ["devicelab","android","mac"] task_name: entrypoint_dart_registrant - scheduler: luci runIf: - dev/** - packages/flutter_tools/** @@ -3344,7 +3336,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: flutter_view_ios__start_up - scheduler: luci - name: Mac_ios hello_world_ios__compile recipe: devicelab/devicelab_drone @@ -3477,7 +3468,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: large_image_changer_perf_ios - scheduler: luci - name: Mac_ios macos_chrome_dev_mode recipe: devicelab/devicelab_drone @@ -3508,7 +3498,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: new_gallery_ios__transition_perf - scheduler: luci - name: Mac_ios new_gallery_impeller_ios__transition_perf bringup: true # Flaky https://github.com/flutter/flutter/issues/96401 @@ -3519,7 +3508,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: new_gallery_impeller_ios__transition_perf - scheduler: luci - name: Mac_ios ios_picture_cache_complexity_scoring_perf__timeline_summary recipe: devicelab/devicelab_drone @@ -3620,7 +3608,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: hot_mode_dev_cycle_ios__benchmark - scheduler: luci - name: Mac_ios tiles_scroll_perf_ios__timeline_summary recipe: devicelab/devicelab_drone @@ -3640,7 +3627,6 @@ targets: tags: > ["devicelab","ios","mac"] task_name: native_ui_tests_ios - scheduler: luci - name: Mac native_ui_tests_macos recipe: devicelab/devicelab_drone From 900e5405c223e9983f644d237467e18cda0a51f5 Mon Sep 17 00:00:00 2001 From: Taha Tesser Date: Thu, 21 Apr 2022 22:59:07 +0300 Subject: [PATCH 012/108] Replace `ListTile` with `Chip` in the `debugCheckHasMaterial control test` (#102311) --- packages/flutter/test/material/debug_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/flutter/test/material/debug_test.dart b/packages/flutter/test/material/debug_test.dart index 37628bb8c17a7..46f9e61b37fd9 100644 --- a/packages/flutter/test/material/debug_test.dart +++ b/packages/flutter/test/material/debug_test.dart @@ -8,7 +8,7 @@ import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('debugCheckHasMaterial control test', (WidgetTester tester) async { - await tester.pumpWidget(const ListTile()); + await tester.pumpWidget(const Chip(label: Text('label'))); final dynamic exception = tester.takeException(); expect(exception, isFlutterError); final FlutterError error = exception as FlutterError; @@ -28,7 +28,7 @@ void main() { error.toStringDeep(), 'FlutterError\n' ' No Material widget found.\n' - ' ListTile widgets require a Material widget ancestor.\n' + ' Chip widgets require a Material widget ancestor.\n' ' In material design, most widgets are conceptually "printed" on a\n' " sheet of material. In Flutter's material library, that material\n" ' is represented by the Material widget. It is the Material widget\n' @@ -39,7 +39,7 @@ void main() { ' one, or use a widget that contains Material itself, such as a\n' ' Card, Dialog, Drawer, or Scaffold.\n' ' The specific widget that could not find a Material ancestor was:\n' - ' ListTile\n' + ' Chip\n' ' The ancestors of this widget were:\n' ' [root]\n', ); From b63689de691a77679687dc419346a88b12536b38 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 16:09:07 -0400 Subject: [PATCH 013/108] Roll Engine from 701e5e8f44ac to 1cb7af579661 (1 revision) (#102322) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 6b14862e5a17e..05562aaa5ad50 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -701e5e8f44acea0c556adda5c84d1b877096c0b4 +1cb7af579661d2910ee5423ae2091e36836a7b84 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 00c4bf56d3a74..2f79426f55bb4 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -p0aZoDAqDDEeIK9bKWRhrH1nXxArDPLqvfGHm4vMVFkC +zjqxHaj1c_wYG8bqwUhNinmx-_aZ-_dL7nyLd8SGKGcC From 06314a073dfdd844e42471259dfaaecad998e97e Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Thu, 21 Apr 2022 13:14:10 -0700 Subject: [PATCH 014/108] Put `waitFor` back in keyboard_textfield_test integration test (#102315) --- .../ui/lib/keyboard_textfield.dart | 7 +++---- .../test_driver/keyboard_textfield_test.dart | 21 ++++--------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/dev/integration_tests/ui/lib/keyboard_textfield.dart b/dev/integration_tests/ui/lib/keyboard_textfield.dart index 4917657c6036a..0f9268a6fe289 100644 --- a/dev/integration_tests/ui/lib/keyboard_textfield.dart +++ b/dev/integration_tests/ui/lib/keyboard_textfield.dart @@ -62,11 +62,10 @@ class _MyHomePageState extends State { Text('$offset', key: const ValueKey(keys.kOffsetText), ), - Text( - isSoftKeyboardVisible ? 'keyboard visible' : 'keyboard hidden', - key: const ValueKey(keys.kKeyboardVisibleView), + if (isSoftKeyboardVisible) const Text( + 'keyboard visible', + key: ValueKey(keys.kKeyboardVisibleView), ), - const ElevatedButton(onPressed: debugDumpApp, child: Text('dump app')), Expanded( child: ListView( key: const ValueKey(keys.kListView), diff --git a/dev/integration_tests/ui/test_driver/keyboard_textfield_test.dart b/dev/integration_tests/ui/test_driver/keyboard_textfield_test.dart index d8353873cc18e..286fc396b1d50 100644 --- a/dev/integration_tests/ui/test_driver/keyboard_textfield_test.dart +++ b/dev/integration_tests/ui/test_driver/keyboard_textfield_test.dart @@ -40,23 +40,10 @@ void main() { // Bring up keyboard await driver.tap(textFieldFinder); - const int keyboardTimeout = 3; - bool keyboardVisible = false; - for (int i = 0; i < keyboardTimeout; i++) { - await Future.delayed(const Duration(seconds: 1)); - final String keyboardVisibilityText = await driver.getText(keyboardVisibilityIndicatorFinder); - keyboardVisible = keyboardVisibilityText == 'keyboard visible'; - if (keyboardVisible) { - break; - } - } - - if (!keyboardVisible) { - await driver.tap(find.text('dump app')); - } - - // TODO(jmagman): Remove timeout once flake has been diagnosed. https://github.com/flutter/flutter/issues/96787 - expect(keyboardVisible, isTrue); + // The blinking cursor may have animation. Do not wait for it to finish. + await driver.runUnsynchronized(() async { + await driver.waitFor(keyboardVisibilityIndicatorFinder); + }); // Ensure that TextField is visible again await driver.waitFor(textFieldFinder); From 242ad0f730dc35eded0bc106daabbbeebd53420d Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Thu, 21 Apr 2022 13:24:07 -0700 Subject: [PATCH 015/108] Enable DeviceLab arm64 ios tests as `bringup: true` (#102089) --- .ci.yaml | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/.ci.yaml b/.ci.yaml index c8946b32847b9..4a22bf4e12304 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -131,6 +131,29 @@ platform_properties: cpu: x86 device_os: iOS-15.1 xcode: 13a233 + mac_arm64_ios: + properties: + caches: >- + [ + {"name":"builder_mac_devicelab","path":"builder"}, + {"name":"chrome_and_driver_96","path":"chrome"}, + {"name":"flutter_sdk","path":"flutter sdk"}, + {"name":"gradle","path":"gradle"}, + {"name":"openjdk","path":"java11"}, + {"name":"pub_cache","path":".pub-cache"}, + {"name":"xcode_binary","path":"xcode_binary"}, + {"name":"osx_sdk_13a233","path":"osx_sdk"} + ] + dependencies: >- + [ + {"dependency": "xcode"}, + {"dependency": "gems"}, + {"dependency": "apple_signing"} + ] + os: Mac-12 + cpu: arm64 + device_os: iOS-15.1 + xcode: 13a233 windows: properties: caches: >- @@ -2472,6 +2495,22 @@ targets: - bin/** - .ci.yaml + - name: Mac_arm64_ios build_ios_framework_module_test + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: build_ios_framework_module_test + runIf: + - dev/** + - packages/flutter_tools/** + - bin/** + - .ci.yaml + scheduler: luci + - name: Mac build_tests_1_4 recipe: flutter/flutter_drone timeout: 60 @@ -3318,6 +3357,17 @@ targets: task_name: flutter_gallery_ios__compile scheduler: luci + - name: Mac_arm64_ios flutter_gallery_ios__compile + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: flutter_gallery_ios__compile + scheduler: luci + - name: Mac_ios flutter_gallery_ios__start_up recipe: devicelab/devicelab_drone presubmit: false @@ -3347,6 +3397,17 @@ targets: task_name: hello_world_ios__compile scheduler: luci + - name: Mac_arm64_ios hello_world_ios__compile + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: hello_world_ios__compile + scheduler: luci + - name: Mac_ios hot_mode_dev_cycle_macos_target__benchmark recipe: devicelab/devicelab_drone timeout: 60 @@ -3359,6 +3420,19 @@ targets: - .ci.yaml scheduler: luci + - name: Mac_arm64_ios hot_mode_dev_cycle_macos_target__benchmark + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: hot_mode_dev_cycle_macos_target__benchmark + runIf: + - dev/** + scheduler: luci + - name: Mac_ios integration_test_test_ios recipe: devicelab/devicelab_drone presubmit: false @@ -3429,6 +3503,17 @@ targets: task_name: ios_app_with_extensions_test scheduler: luci + - name: Mac_arm64_ios ios_app_with_extensions_test + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: ios_app_with_extensions_test + scheduler: luci + - name: Mac_ios ios_content_validation_test recipe: devicelab/devicelab_drone presubmit: false @@ -3439,6 +3524,17 @@ targets: task_name: ios_content_validation_test scheduler: luci + - name: Mac_arm64_ios ios_content_validation_test + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: ios_content_validation_test + scheduler: luci + - name: Mac_ios ios_defines_test recipe: devicelab/devicelab_drone presubmit: false @@ -3479,6 +3575,17 @@ targets: task_name: macos_chrome_dev_mode scheduler: luci + - name: Mac_arm64_ios macos_chrome_dev_mode + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: macos_chrome_dev_mode + scheduler: luci + - name: Mac_ios microbenchmarks_ios recipe: devicelab/devicelab_drone presubmit: false @@ -3628,6 +3735,17 @@ targets: ["devicelab","ios","mac"] task_name: native_ui_tests_ios + - name: Mac_arm64_ios native_ui_tests_ios + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: native_ui_tests_ios + scheduler: luci + - name: Mac native_ui_tests_macos recipe: devicelab/devicelab_drone timeout: 60 @@ -3666,6 +3784,22 @@ targets: - .ci.yaml scheduler: luci + - name: Mac_arm64_ios run_release_test_macos + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","ios","mac","arm64"] + task_name: run_release_test_macos + runIf: + - dev/** + - packages/flutter_tools/** + - bin/** + - .ci.yaml + scheduler: luci + - name: Windows build_aar_module_test bringup: true # Flaky https://github.com/flutter/flutter/issues/102226 recipe: devicelab/devicelab_drone From 0cbd6231e4e5411ac7c021cf685a1025ec507a17 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 17:14:06 -0400 Subject: [PATCH 016/108] Roll Engine from 1cb7af579661 to 4f05631a710a (1 revision) (#102326) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 05562aaa5ad50..63e2cfb1eed9a 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -1cb7af579661d2910ee5423ae2091e36836a7b84 +4f05631a710ab707ab252b34695446bd2a2ad244 From 4ca94ab2fcd04012ef9e64463270bcfb69b3ce3f Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Thu, 21 Apr 2022 15:24:09 -0700 Subject: [PATCH 017/108] Remove build_aar_module_test from devicelab tests (#102329) --- .ci.yaml | 78 -------------------------------------------------------- 1 file changed, 78 deletions(-) diff --git a/.ci.yaml b/.ci.yaml index 4a22bf4e12304..41ec45cd947fa 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -205,32 +205,6 @@ targets: validation_name: Analyze scheduler: luci - - name: Linux build_aar_module_test - recipe: devicelab/devicelab_drone - timeout: 60 - properties: - add_recipes_cq: "true" - caches: >- - [ - {"name":"gradle","path":"gradle"}, - {"name": "openjdk_11", "path": "java"} - ] - dependencies: >- - [ - {"dependency": "android_sdk", "version": "version:31v8"}, - {"dependency": "chrome_and_driver", "version": "version:96.2"}, - {"dependency": "open_jdk", "version": "11"} - ] - tags: > - ["devicelab","hostonly"] - task_name: build_aar_module_test - scheduler: luci - runIf: - - dev/** - - packages/flutter_tools/** - - bin/** - - .ci.yaml - - name: Linux build_tests_1_2 recipe: flutter/flutter_drone timeout: 60 @@ -2445,31 +2419,6 @@ targets: ["devicelab","android","linux"] task_name: android_lifecycles_test - - name: Mac build_aar_module_test - recipe: devicelab/devicelab_drone - timeout: 60 - properties: - add_recipes_cq: "true" - caches: >- - [ - {"name":"gradle", "path":"gradle"}, - {"name": "openjdk_11", "path": "java"} - ] - dependencies: >- - [ - {"dependency": "android_sdk", "version": "version:31v8"}, - {"dependency": "open_jdk", "version": "11"} - ] - tags: > - ["devicelab","hostonly"] - task_name: build_aar_module_test - runIf: - - dev/** - - packages/flutter_tools/** - - bin/** - - .ci.yaml - scheduler: luci - - name: Mac build_ios_framework_module_test recipe: devicelab/devicelab_drone timeout: 60 @@ -3800,33 +3749,6 @@ targets: - .ci.yaml scheduler: luci - - name: Windows build_aar_module_test - bringup: true # Flaky https://github.com/flutter/flutter/issues/102226 - recipe: devicelab/devicelab_drone - timeout: 60 - properties: - add_recipes_cq: "true" - caches: >- - [ - {"name":"gradle","path":"gradle"}, - {"name": "openjdk_11", "path": "java"} - ] - dependencies: >- - [ - {"dependency": "android_sdk", "version": "version:31v8"}, - {"dependency": "chrome_and_driver", "version": "version:96.2"}, - {"dependency": "open_jdk", "version": "11"} - ] - tags: > - ["devicelab","hostonly"] - task_name: build_aar_module_test - scheduler: luci - runIf: - - dev/** - - packages/flutter_tools/** - - bin/** - - .ci.yaml - - name: Windows build_tests_1_3 recipe: flutter/flutter_drone timeout: 60 From c73100bfaec52f48eaa4662c5fa60adfb2fb9cbf Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Thu, 21 Apr 2022 15:39:07 -0700 Subject: [PATCH 018/108] Fix the code point for CupertinoIcons.location (#101923) --- packages/flutter/lib/src/cupertino/icons.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/cupertino/icons.dart b/packages/flutter/lib/src/cupertino/icons.dart index d214511b3a382..fd02f2350fcf9 100644 --- a/packages/flutter/lib/src/cupertino/icons.dart +++ b/packages/flutter/lib/src/cupertino/icons.dart @@ -912,7 +912,7 @@ class CupertinoIcons { static const IconData mail_solid = IconData(0xf423, fontFamily: iconFont, fontPackage: iconFontPackage); /// location — Cupertino icon for a location pin. - static const IconData location = IconData(0xf455, fontFamily: iconFont, fontPackage: iconFontPackage); + static const IconData location = IconData(0xf6ee, fontFamily: iconFont, fontPackage: iconFontPackage); /// placemark_fill — Cupertino icon for a location pin. This icon is filled in. /// This is the same icon as [placemark_fill] in cupertino_icons 1.0.0+. From c9825d24dd8a624c9720d24a4af4753e5d468b79 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 21 Apr 2022 15:49:08 -0700 Subject: [PATCH 019/108] Handle CocoaPods ffi stderr (#102327) --- packages/flutter_tools/lib/src/macos/cocoapods.dart | 7 ++++--- .../test/general.shard/macos/cocoapods_test.dart | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/lib/src/macos/cocoapods.dart b/packages/flutter_tools/lib/src/macos/cocoapods.dart index a471e36b1fbf3..26365b6a46425 100644 --- a/packages/flutter_tools/lib/src/macos/cocoapods.dart +++ b/packages/flutter_tools/lib/src/macos/cocoapods.dart @@ -349,10 +349,11 @@ class CocoaPods { } void _diagnosePodInstallFailure(ProcessResult result) { - if (result.stdout is! String) { + final Object? stdout = result.stdout; + final Object? stderr = result.stderr; + if (stdout is! String || stderr is! String) { return; } - final String stdout = result.stdout as String; if (stdout.contains('out-of-date source repos')) { _logger.printError( "Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.\n" @@ -360,7 +361,7 @@ class CocoaPods { ' pod repo update\n', emphasis: true, ); - } else if ((stdout.contains('ffi_c.bundle') || stdout.contains('/ffi/')) && + } else if ((stderr.contains('ffi_c.bundle') || stderr.contains('/ffi/')) && _operatingSystemUtils.hostPlatform == HostPlatform.darwin_arm) { // https://github.com/flutter/flutter/issues/70796 UsageEvent( diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart index e5554ba2466eb..81139a64730c0 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart @@ -514,7 +514,7 @@ Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by 'LANG': 'en_US.UTF-8', }, exitCode: 1, - stdout: cocoaPodsError, + stderr: cocoaPodsError, ), const FakeCommand( command: ['which', 'sysctl'], From 512cbdb9da883cc59013ef3363a62beb7d2a6e3c Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Thu, 21 Apr 2022 18:54:13 -0400 Subject: [PATCH 020/108] Enable jank metric collection in profile mode (#102334) --- packages/flutter_tools/lib/src/resident_runner.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 419c1953a0c79..d303e639a60db 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -682,7 +682,7 @@ abstract class ResidentHandlers { /// use case is to look at the various layers in proportion to see what /// contributes the most towards raster performance. Future debugFrameJankMetrics() async { - if (!supportsServiceProtocol || !isRunningDebug) { + if (!supportsServiceProtocol) { return false; } for (final FlutterDevice device in flutterDevices) { From 570e23e94944fcc90d60e95ffbc10b2fe45b4a3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Apr 2022 15:59:07 -0700 Subject: [PATCH 021/108] Bump actions/checkout from 3.0.1 to 3.0.2 (#102337) --- .github/workflows/scorecards-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index a00102e3287e6..e4a0f5407ebb7 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -21,7 +21,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@dcd71f646680f2efd8db4afa5ad64fdcba30e748 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b with: persist-credentials: false From b7abece9cd44b45aafb32dc9442ae022ff06f9f7 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 19:24:09 -0400 Subject: [PATCH 022/108] Roll Engine from 4f05631a710a to 238eb9d7f55f (5 revisions) (#102340) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 63e2cfb1eed9a..a5a46c41584e6 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -4f05631a710ab707ab252b34695446bd2a2ad244 +238eb9d7f55f0ca24d2a1e706b02109ef76844cf From b8dfe0d80c4c16f605f08015ee39c769f1c57e6c Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 20:29:06 -0400 Subject: [PATCH 023/108] Roll Engine from 238eb9d7f55f to 1b10b146cf7c (2 revisions) (#102344) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index a5a46c41584e6..8c2f99063d593 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -238eb9d7f55f0ca24d2a1e706b02109ef76844cf +1b10b146cf7c73cf4e543e6762e479eb1b023f1e diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 75b80067c63bd..979c9a5d493ed 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -9g8p_giFbkP4781dwqfOd3BTojVaMQTirYYfd07wLLEC +CQEP7X2HznO3K8CVIYx6C3TYvcIcymV0QfthRNJ01zMC From 9a3806bd0877b2a9fdcfa2c8b869f8631244a98f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 21:44:03 -0400 Subject: [PATCH 024/108] Roll Engine from 1b10b146cf7c to bcd35000ed99 (1 revision) (#102345) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 8c2f99063d593..ac6ccf83deb75 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -1b10b146cf7c73cf4e543e6762e479eb1b023f1e +bcd35000ed997ad7fa52f5f45b525567f880b755 From 0d9c51c7329fb7aefdae55b6d054053329b8aa3a Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Thu, 21 Apr 2022 22:49:07 -0400 Subject: [PATCH 025/108] Roll Engine from bcd35000ed99 to c6ea046c2cda (3 revisions) (#102347) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index ac6ccf83deb75..0529b874e6588 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -bcd35000ed997ad7fa52f5f45b525567f880b755 +c6ea046c2cdaf3fb2428b31108eae3c3b1174e6e From a91ad0052f5ee88e788bac094856b772c754484f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 00:34:06 -0400 Subject: [PATCH 026/108] Roll Engine from c6ea046c2cda to d4158760408d (1 revision) (#102349) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 0529b874e6588..f8a7b3b3715bb 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -c6ea046c2cdaf3fb2428b31108eae3c3b1174e6e +d4158760408d01db8d0b5f924bd8b8c3411f822a From 0a36b53551c49b2fb302f20e3424b9d68c50ed17 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 05:09:07 -0400 Subject: [PATCH 027/108] Roll Engine from d4158760408d to e96c75676ee5 (2 revisions) (#102354) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index f8a7b3b3715bb..e15fe8a7abab2 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -d4158760408d01db8d0b5f924bd8b8c3411f822a +e96c75676ee56c039ea136c9f70328e14fd08b9d diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 2f79426f55bb4..b730a98fb7298 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -zjqxHaj1c_wYG8bqwUhNinmx-_aZ-_dL7nyLd8SGKGcC +sTvRmqTst61TllIcWosYZZBa5b7Qa9aFlu65kBU-FSkC From fde7622f7e0ab915ce19bd49a8ead5707141df6a Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 06:14:07 -0400 Subject: [PATCH 028/108] Roll Engine from e96c75676ee5 to 2d7fcf4e36eb (1 revision) (#102359) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index e15fe8a7abab2..39a05e18da3c3 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -e96c75676ee56c039ea136c9f70328e14fd08b9d +2d7fcf4e36ebaea10bd9c471644389e69c423b12 From ad652a665900e7b45037b1e525845e862853700c Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 09:14:07 -0400 Subject: [PATCH 029/108] Roll Engine from 2d7fcf4e36eb to 0a88671c35f6 (2 revisions) (#102371) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 39a05e18da3c3..3586d7224104f 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -2d7fcf4e36ebaea10bd9c471644389e69c423b12 +0a88671c35f6974db605d3a9cae9422d21fb0290 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 979c9a5d493ed..e061e1f5d8a25 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -CQEP7X2HznO3K8CVIYx6C3TYvcIcymV0QfthRNJ01zMC +2URwvdZiLGMKsnYKqGCtPo6Vw4fiUnRuEp4OayAc0PQC From e2f4e80ce5cc5143d6455e727163d0b8e6117993 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 11:04:07 -0400 Subject: [PATCH 030/108] Roll Engine from 0a88671c35f6 to d9b3a550a75a (1 revision) (#102375) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 3586d7224104f..61092f8a2d77c 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0a88671c35f6974db605d3a9cae9422d21fb0290 +d9b3a550a75a4db522c06324a8c5a61a18d49f30 From 03c93640b4ed82a984cbbfcf959918d35b68ed11 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 12:04:08 -0400 Subject: [PATCH 031/108] Roll Plugins from 5c3c1b8aac06 to ca63d964d9fd (10 revisions) (#102379) --- bin/internal/flutter_plugins.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/flutter_plugins.version b/bin/internal/flutter_plugins.version index a083a54bc9ded..8915d67171ac0 100644 --- a/bin/internal/flutter_plugins.version +++ b/bin/internal/flutter_plugins.version @@ -1 +1 @@ -5c3c1b8aac065aa1988f114d0c66ecec758e9cbb +ca63d964d9fdfff9be36533ea4248d0d0ca28fd0 From e2dc2c821ff82a75e7da339ab981062fe48d46b4 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 12:49:07 -0400 Subject: [PATCH 032/108] Roll Engine from d9b3a550a75a to 587bca0454bc (1 revision) (#102380) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 61092f8a2d77c..6a6d1270bb87c 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -d9b3a550a75a4db522c06324a8c5a61a18d49f30 +587bca0454bcc9858cff709e31a2392d4b6aa3b7 From f4de048ff88bf227f8857bb9b5c899712344e220 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 14:19:07 -0400 Subject: [PATCH 033/108] Roll Engine from 587bca0454bc to 4350d117406d (1 revision) (#102386) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 6a6d1270bb87c..4392f29bf9dcc 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -587bca0454bcc9858cff709e31a2392d4b6aa3b7 +4350d117406dbb1dc1dcfcd117292176de3169de From ca3b406c44138b547b0e7ee7ac516722a66a5135 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 15:39:06 -0400 Subject: [PATCH 034/108] Roll Engine from 4350d117406d to ad6976c4d1db (1 revision) (#102394) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 4392f29bf9dcc..4a3a032579e91 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -4350d117406dbb1dc1dcfcd117292176de3169de +ad6976c4d1db068d6462733516c89837a4958042 From 5414ef4c86ba014568bafd721a30cb3e5cfb9b96 Mon Sep 17 00:00:00 2001 From: "Elliott Brooks (she/her)" <21270878+elliette@users.noreply.github.com> Date: Fri, 22 Apr 2022 12:43:39 -0700 Subject: [PATCH 035/108] Hide unresolved DartUri log messages (#102338) --- .../flutter_tools/lib/src/isolated/devfs_web.dart | 10 ++++++++++ .../test/web.shard/output_web_test.dart | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index 8b6f22b78703d..8a833129bba9e 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -1009,6 +1009,16 @@ void _log(logging.LogRecord event) { if (event.level >= logging.Level.SEVERE) { globals.printError('${event.loggerName}: ${event.message}$error', stackTrace: event.stackTrace); } else if (event.level == logging.Level.WARNING) { + // TODO(elliette): Remove the following message suppressions after DWDS is + // >13.1.0, https://github.com/flutter/flutter/issues/101639 + const String dartUri = 'DartUri'; + if (event.loggerName == dartUri) { + const String webSqlWarning = 'Unresolved uri: dart:web_sql'; + const String uiWarning = 'Unresolved uri: dart:ui'; + if (event.message == webSqlWarning || event.message == uiWarning) { + return; + } + } globals.printWarning('${event.loggerName}: ${event.message}$error'); } else { globals.printTrace('${event.loggerName}: ${event.message}$error'); diff --git a/packages/flutter_tools/test/web.shard/output_web_test.dart b/packages/flutter_tools/test/web.shard/output_web_test.dart index a689088ab0dcf..bcb4b7473a703 100644 --- a/packages/flutter_tools/test/web.shard/output_web_test.dart +++ b/packages/flutter_tools/test/web.shard/output_web_test.dart @@ -78,4 +78,18 @@ void main() { await sendEvent({'type': 'DevtoolsEvent'}); await warning; }, skip: true); // Skipping for 'https://github.com/dart-lang/webdev/issues/1562' + + testWithoutContext( + 'flutter run output skips DartUri warning messages from dwds', () async { + bool containsDartUriWarning = false; + flutter.stderr.listen((String msg) { + if (msg.contains('DartUri')) { + containsDartUriWarning = true; + } + }); + await start(); + await flutter.stop(); + expect(containsDartUriWarning, isFalse); + // TODO(elliette): Enable for DWDS >13.1.0, https://github.com/flutter/flutter/issues/101639 + }, skip: true); // [intended] enable for DWDS >13.1.0 } From dc51dfe61ebb6e0f7f96e7fca0e7c2cf0719706f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 16:44:07 -0400 Subject: [PATCH 036/108] Roll Engine from ad6976c4d1db to 061fb1d74a9f (1 revision) (#102397) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 4a3a032579e91..38295d2cb2ed7 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -ad6976c4d1db068d6462733516c89837a4958042 +061fb1d74a9fd0d738de02442f4a9c4d94e00a6b From 1ba573b758dc384a2738384c7f83853bc11308ad Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 17:49:06 -0400 Subject: [PATCH 037/108] Roll Engine from 061fb1d74a9f to 0da451d25cf8 (1 revision) (#102400) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 38295d2cb2ed7..0d7243973c386 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -061fb1d74a9fd0d738de02442f4a9c4d94e00a6b +0da451d25cf84a1336ad32028427873bc3e87c70 From 6ea4aef827cefff2f088dae8abd4f762271d2ff0 Mon Sep 17 00:00:00 2001 From: rgevrek Date: Sat, 23 Apr 2022 00:19:06 +0200 Subject: [PATCH 038/108] Fix jumping when doing long press for selecting text (#102270) --- .../lib/src/widgets/editable_text.dart | 5 ++ .../test/widgets/editable_text_test.dart | 47 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index 8e477b4032cb7..be622d5ba3bda 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -2514,6 +2514,11 @@ class EditableTextState extends State with AutomaticKeepAliveClien _showCaretOnScreenScheduled = true; SchedulerBinding.instance.addPostFrameCallback((Duration _) { _showCaretOnScreenScheduled = false; + + // if cursor is inactive, e.g. while selecting text, do not jump away + if (!_cursorActive) { + return; + } if (_currentCaretRect == null || !_scrollController.hasClients) { return; } diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index c13aecb79da75..4b0226ebb82fe 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -5183,6 +5183,53 @@ void main() { // toolbar. Until we change that, this test should remain skipped. }, skip: kIsWeb); // [intended] + + testWidgets('text selection handle visibility for long text', (WidgetTester tester) async { + // long text which is scrollable based on given box size + const String testText = + 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.'; + final TextEditingController controller = + TextEditingController(text: testText); + final ScrollController scrollController = ScrollController(); + + await tester.pumpWidget(MaterialApp( + home: Align( + alignment: Alignment.topLeft, + child: SizedBox( + width: 100, + height: 100, + child: SingleChildScrollView( + controller: scrollController, + child: EditableText( + controller: controller, + showSelectionHandles: true, + focusNode: FocusNode(), + style: Typography.material2018().black.subtitle1!, + cursorColor: Colors.blue, + backgroundCursorColor: Colors.grey, + selectionControls: materialTextSelectionControls, + keyboardType: TextInputType.multiline, + maxLines: null, + ), + ), + ), + ), + )); + + // scroll to a text that is outside of the inital visible rect + scrollController.jumpTo(151); + await tester.pump(); + + // long press on a word to trigger a select + await tester.longPressAt(const Offset(20, 15)); + // wait for adjustments of scroll area + await tester.pump(); + await tester.pumpAndSettle(); + + // assert not jumped to top + expect(scrollController.offset, equals(151)); + }); + const String testText = 'Now is the time for\n' // 20 'all good people\n' // 20 + 16 => 36 'to come to the aid\n' // 36 + 19 => 55 From a3a9a23e46f32f8ec0b2191cd969188a70a5af5f Mon Sep 17 00:00:00 2001 From: Daniel Cardona Rojas Date: Fri, 22 Apr 2022 17:24:10 -0500 Subject: [PATCH 039/108] Add matcher to find at least a given number of widgets (#102081) (#102342) --- packages/flutter_test/lib/src/matchers.dart | 20 +++++++++++ packages/flutter_test/test/matchers_test.dart | 36 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart index 338e5bcaf1860..5434b0be538fe 100644 --- a/packages/flutter_test/lib/src/matchers.dart +++ b/packages/flutter_test/lib/src/matchers.dart @@ -37,6 +37,7 @@ import 'widget_tester.dart' show WidgetTester; /// * [findsWidgets], when you want the finder to find one or more widgets. /// * [findsOneWidget], when you want the finder to find exactly one widget. /// * [findsNWidgets], when you want the finder to find a specific number of widgets. +/// * [findsAtLeastNWidgets], when you want the finder to find at least a specific number of widgets. const Matcher findsNothing = _FindsWidgetMatcher(null, 0); /// Asserts that the [Finder] locates at least one widget in the widget tree. @@ -52,6 +53,7 @@ const Matcher findsNothing = _FindsWidgetMatcher(null, 0); /// * [findsNothing], when you want the finder to not find anything. /// * [findsOneWidget], when you want the finder to find exactly one widget. /// * [findsNWidgets], when you want the finder to find a specific number of widgets. +/// * [findsAtLeastNWidgets], when you want the finder to find at least a specific number of widgets. const Matcher findsWidgets = _FindsWidgetMatcher(1, null); /// Asserts that the [Finder] locates at exactly one widget in the widget tree. @@ -67,6 +69,7 @@ const Matcher findsWidgets = _FindsWidgetMatcher(1, null); /// * [findsNothing], when you want the finder to not find anything. /// * [findsWidgets], when you want the finder to find one or more widgets. /// * [findsNWidgets], when you want the finder to find a specific number of widgets. +/// * [findsAtLeastNWidgets], when you want the finder to find at least a specific number of widgets. const Matcher findsOneWidget = _FindsWidgetMatcher(1, 1); /// Asserts that the [Finder] locates the specified number of widgets in the widget tree. @@ -82,8 +85,25 @@ const Matcher findsOneWidget = _FindsWidgetMatcher(1, 1); /// * [findsNothing], when you want the finder to not find anything. /// * [findsWidgets], when you want the finder to find one or more widgets. /// * [findsOneWidget], when you want the finder to find exactly one widget. +/// * [findsAtLeastNWidgets], when you want the finder to find at least a specific number of widgets. Matcher findsNWidgets(int n) => _FindsWidgetMatcher(n, n); +/// Asserts that the [Finder] locates at least a number of widgets in the widget tree. +/// +/// ## Sample code +/// +/// ```dart +/// expect(find.text('Save'), findsAtLeastNWidgets(2)); +/// ``` +/// +/// See also: +/// +/// * [findsNothing], when you want the finder to not find anything. +/// * [findsWidgets], when you want the finder to find one or more widgets. +/// * [findsOneWidget], when you want the finder to find exactly one widget. +/// * [findsNWidgets], when you want the finder to find a specific number of widgets. +Matcher findsAtLeastNWidgets(int n) => _FindsWidgetMatcher(n, null); + /// Asserts that the [Finder] locates a single widget that has at /// least one [Offstage] widget ancestor. /// diff --git a/packages/flutter_test/test/matchers_test.dart b/packages/flutter_test/test/matchers_test.dart index 4632aba6fc4ea..2477313a06484 100644 --- a/packages/flutter_test/test/matchers_test.dart +++ b/packages/flutter_test/test/matchers_test.dart @@ -674,6 +674,42 @@ void main() { handle.dispose(); }); }); + + group('findsAtLeastNWidgets', () { + Widget boilerplate(Widget child) { + return Directionality( + textDirection: TextDirection.ltr, + child: child, + ); + } + + testWidgets('succeeds when finds more then the specified count', + (WidgetTester tester) async { + await tester.pumpWidget(boilerplate(Column( + children: const [Text('1'), Text('2'), Text('3')], + ))); + + expect(find.byType(Text), findsAtLeastNWidgets(2)); + }); + + testWidgets('succeeds when finds the exact specified count', + (WidgetTester tester) async { + await tester.pumpWidget(boilerplate(Column( + children: const [Text('1'), Text('2')], + ))); + + expect(find.byType(Text), findsAtLeastNWidgets(2)); + }); + + testWidgets('fails when finds less then specified count', + (WidgetTester tester) async { + await tester.pumpWidget(boilerplate(Column( + children: const [Text('1'), Text('2')], + ))); + + expect(find.byType(Text), isNot(findsAtLeastNWidgets(3))); + }); + }); } enum _ComparatorBehavior { From 5a3e10047f841d910cd078d75040b16a44cf4fa1 Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Fri, 22 Apr 2022 15:29:07 -0700 Subject: [PATCH 040/108] [flutter_tools] Add test that "Unresolve URI" warnings from DWDS are filtered from logs (#102399) --- .../lib/src/isolated/devfs_web.dart | 5 ++-- .../general.shard/web/devfs_web_test.dart | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index 8a833129bba9e..7539977abd3ed 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -275,7 +275,7 @@ class WebAssetServer implements AssetReader { } logging.Logger.root.level = logging.Level.ALL; - logging.Logger.root.onRecord.listen(_log); + logging.Logger.root.onRecord.listen(log); // In debug builds, spin up DWDS and the full asset server. final Dwds dwds = await dwdsLauncher( @@ -1004,7 +1004,8 @@ class ReleaseAssetServer { } } -void _log(logging.LogRecord event) { +@visibleForTesting +void log(logging.LogRecord event) { final String error = event.error == null? '': 'Error: ${event.error}'; if (event.level >= logging.Level.SEVERE) { globals.printError('${event.loggerName}: ${event.message}$error', stackTrace: event.stackTrace); diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index 909258801c6ae..cc0f158caecc7 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -8,6 +8,7 @@ import 'dart:io' hide Directory, File; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/targets/web.dart'; @@ -16,6 +17,7 @@ import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/isolated/devfs_web.dart'; import 'package:flutter_tools/src/web/compile.dart'; +import 'package:logging/logging.dart' as logging; import 'package:package_config/package_config.dart'; import 'package:shelf/shelf.dart'; import 'package:test/fake.dart'; @@ -39,6 +41,7 @@ void main() { PackageConfig packages; Platform windows; FakeHttpServer httpServer; + BufferLogger logger; setUpAll(() async { packages = PackageConfig([ @@ -50,6 +53,7 @@ void main() { httpServer = FakeHttpServer(); linux = FakePlatform(environment: {}); windows = FakePlatform(operatingSystem: 'windows', environment: {}); + logger = BufferLogger.test(); testbed = Testbed(setup: () { webAssetServer = WebAssetServer( httpServer, @@ -67,9 +71,35 @@ void main() { webBuildDirectory: null, basePath: null, ); + }, overrides: { + Logger: () => logger, }); }); + test('.log() filters events', () => testbed.run(() { + // harmless warning that should be filtered out + const String harmlessMessage = 'Unresolved uri: dart:ui'; + // serious warning + const String seriousMessage = 'Something bad happened'; + + final List events = [ + logging.LogRecord( + logging.Level.WARNING, + harmlessMessage, + 'DartUri', + ), + logging.LogRecord( + logging.Level.WARNING, + seriousMessage, + 'DartUri', + ), + ]; + + events.forEach(log); + expect(logger.warningText, contains(seriousMessage)); + expect(logger.warningText, isNot(contains(harmlessMessage))); + })); + test('Handles against malformed manifest', () => testbed.run(() async { final File source = globals.fs.file('source') ..writeAsStringSync('main() {}'); From 2c60d2c9152d6a64ff0383bf97e31d6e8b8e6a37 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 18:54:08 -0400 Subject: [PATCH 041/108] Roll Engine from 0da451d25cf8 to 7cb80a7964ef (2 revisions) (#102409) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 0d7243973c386..87e01678018ee 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0da451d25cf84a1336ad32028427873bc3e87c70 +7cb80a7964ef5653330117ac1d78a2966833f5b3 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index b730a98fb7298..cf04203131f41 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -sTvRmqTst61TllIcWosYZZBa5b7Qa9aFlu65kBU-FSkC +yRFArCwDi-2UHUxwQl6rk0ISTua4FobB84XwaUZFC7cC From e32dbbab43001166a05ab4fe65a939b9cbf205d0 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 19:59:04 -0400 Subject: [PATCH 042/108] Roll Engine from 7cb80a7964ef to 819ca4ec8cd5 (3 revisions) (#102411) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 87e01678018ee..91df8e962c837 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -7cb80a7964ef5653330117ac1d78a2966833f5b3 +819ca4ec8cd5cd4ad491f99b11418139a554ed5d From d25116921eb7fbccea74937abae0096fb92bfd04 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 22 Apr 2022 23:14:07 -0400 Subject: [PATCH 043/108] Roll Engine from 819ca4ec8cd5 to e9ebbb5575fb (4 revisions) (#102425) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 91df8e962c837..c8f88b72424b8 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -819ca4ec8cd5cd4ad491f99b11418139a554ed5d +e9ebbb5575fbd051835d3b5aaa1cb3017061bbc5 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index e061e1f5d8a25..da77eae70092d 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -2URwvdZiLGMKsnYKqGCtPo6Vw4fiUnRuEp4OayAc0PQC +OOBEL73yb3wgbPPtZ_n599QLfJdr2snywov8_9Z39xUC From 751d9041fdb9973ab70db5e4c3668bb05d2475b6 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 23 Apr 2022 01:04:05 -0400 Subject: [PATCH 044/108] Roll Engine from e9ebbb5575fb to 49fe29e373d6 (2 revisions) (#102428) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index c8f88b72424b8..628c24cdd4ce1 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -e9ebbb5575fbd051835d3b5aaa1cb3017061bbc5 +49fe29e373d60e88e0931a96a3c0d307b007dcab From e3ec5a4843f2a6920b32aaa0c8d22da9cc801932 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 23 Apr 2022 07:09:06 -0400 Subject: [PATCH 045/108] Roll Engine from 49fe29e373d6 to f6725544f45e (1 revision) (#102437) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 628c24cdd4ce1..989df848d9c38 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -49fe29e373d60e88e0931a96a3c0d307b007dcab +f6725544f45eaacd9afc6893e1a6131f933ef17e diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index cf04203131f41..af4e48006f4c2 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -yRFArCwDi-2UHUxwQl6rk0ISTua4FobB84XwaUZFC7cC +uetob3LZ0XpTHKVP2YC9_9qv7AGxeV4vzHZS97O3HuwC From b3584f58fdeec971be9762d3dfe892ddb373a577 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 23 Apr 2022 08:14:04 -0400 Subject: [PATCH 046/108] Roll Engine from f6725544f45e to b4cc382cb26b (1 revision) (#102438) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 989df848d9c38..9a6a0868af8a7 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -f6725544f45eaacd9afc6893e1a6131f933ef17e +b4cc382cb26b3cf045a9b65e1c1e4178c47c77c1 From 02f081a708b74d94cd55ba2d9dc480256a8b0cc2 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 23 Apr 2022 14:14:03 -0400 Subject: [PATCH 047/108] Roll Engine from b4cc382cb26b to dbe5a764d952 (1 revision) (#102444) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 9a6a0868af8a7..56da0a4f2035a 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -b4cc382cb26b3cf045a9b65e1c1e4178c47c77c1 +dbe5a764d952269f3cb6fa417df8ddcde5371b4b From 6e3016952e0bb6a404848967fb0e27340360c920 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 23 Apr 2022 20:19:05 -0400 Subject: [PATCH 048/108] Roll Engine from dbe5a764d952 to cf3445791f6d (1 revision) (#102448) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 56da0a4f2035a..ab09f4d7dd92b 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -dbe5a764d952269f3cb6fa417df8ddcde5371b4b +cf3445791f6dfe933de80dcd9b1a0f84507fa479 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index af4e48006f4c2..d96abea865cb7 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -uetob3LZ0XpTHKVP2YC9_9qv7AGxeV4vzHZS97O3HuwC +evOcilNU5vxsBmRd76GJmsc242eCvpreR2laiQqcyWEC From 32ddd039a19d4170b9e12448d865c350f0d8bbe7 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 03:09:06 -0400 Subject: [PATCH 049/108] Roll Engine from cf3445791f6d to f23d31c4755e (1 revision) (#102456) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index ab09f4d7dd92b..9a022aeafe5b7 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -cf3445791f6dfe933de80dcd9b1a0f84507fa479 +f23d31c4755e011f09fbf10f9dfe36659177b405 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index da77eae70092d..e28798ca88b3e 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -OOBEL73yb3wgbPPtZ_n599QLfJdr2snywov8_9Z39xUC +O69VeGryOb6EViFsMEkeU7N55-TySLesPbOiWxqYvt8C From 641d6cd0b7665fd06b4fe8da02716c9f077fb56c Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 07:44:06 -0400 Subject: [PATCH 050/108] Roll Engine from f23d31c4755e to 0a924011e2f0 (1 revision) (#102461) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 9a022aeafe5b7..080210ca44f48 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -f23d31c4755e011f09fbf10f9dfe36659177b405 +0a924011e2f0e164ee09c3cc788869f3ece56493 From c654d04f119f9ff742170967c773c180b63a8d5f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 09:19:05 -0400 Subject: [PATCH 051/108] Roll Engine from 0a924011e2f0 to 984b5b332bb2 (1 revision) (#102463) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 080210ca44f48..4c37debd0ca07 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0a924011e2f0e164ee09c3cc788869f3ece56493 +984b5b332bb2afe50bd9654fc5b2a444e1c40771 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index d96abea865cb7..c746e0630cd3b 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -evOcilNU5vxsBmRd76GJmsc242eCvpreR2laiQqcyWEC +UrnPgfhOYsXIu2DdQqzbUvLhk4ndYXYWo5rC63CLH3sC From dca58a289b0e8d1e8d118a55123329fd2e9d04ff Mon Sep 17 00:00:00 2001 From: Alex Li Date: Mon, 25 Apr 2022 02:04:06 +0800 Subject: [PATCH 052/108] [gen_l10n] Throw a specified exception when the language code is invalid (#102431) --- .../localizations/localizations_utils.dart | 12 +++++-- .../generate_localizations_test.dart | 33 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart index 3f482cf69c955..a8e413526670e 100644 --- a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart +++ b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart @@ -7,6 +7,7 @@ import 'package:yaml/yaml.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; +import 'gen_l10n_types.dart'; import 'language_subtag_registry.dart'; typedef HeaderGenerator = String Function(String regenerateInstructions); @@ -215,8 +216,15 @@ void precacheLanguageAndRegionTags() { String describeLocale(String tag) { final List subtags = tag.split('_'); assert(subtags.isNotEmpty); - assert(_languages.containsKey(subtags[0])); - final String language = _languages[subtags[0]]!; + final String languageCode = subtags[0]; + if (!_languages.containsKey(languageCode)) { + throw L10nException( + '"$languageCode" is not a supported language code.\n' + 'See https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry ' + 'for the supported list.', + ); + } + final String language = _languages[languageCode]!; String output = language; String? region; String? script; diff --git a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart index e850ca3fb4630..286c051d0f206 100644 --- a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart +++ b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart @@ -2595,6 +2595,39 @@ import 'output-localization-file_en.dart' deferred as output-localization-file_e ); }); }); + + testWithoutContext('throws when the language code is not supported', () { + const String arbFileWithInvalidCode = ''' +{ + "@@locale": "invalid", + "title": "invalid" +}'''; + + final Directory l10nDirectory = fs.currentDirectory.childDirectory('lib').childDirectory('l10n') + ..createSync(recursive: true); + l10nDirectory.childFile('app_invalid.arb') + .writeAsStringSync(arbFileWithInvalidCode); + + expect( + () { + LocalizationsGenerator( + fileSystem: fs, + inputPathString: defaultL10nPathString, + outputPathString: defaultL10nPathString, + templateArbFileName: 'app_invalid.arb', + outputFileString: defaultOutputFileString, + classNameString: defaultClassNameString, + ) + ..loadResources() + ..writeOutputFiles(BufferLogger.test()); + }, + throwsA(isA().having( + (L10nException e) => e.message, + 'message', + contains('"invalid" is not a supported language code.'), + )), + ); + }); }); testWithoutContext('should generate a valid pubspec.yaml file when using synthetic package if it does not already exist', () { From 2a9aa79843b45af01e3bc852ed7641177e3d7f8e Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 16:29:06 -0400 Subject: [PATCH 053/108] Roll Engine from 984b5b332bb2 to e31251e55fd9 (1 revision) (#102470) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 4c37debd0ca07..be409a3a17c64 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -984b5b332bb2afe50bd9654fc5b2a444e1c40771 +e31251e55fd95607bd636dfced066ad74f22175d diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index e28798ca88b3e..b39c5f1d6d3e3 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -O69VeGryOb6EViFsMEkeU7N55-TySLesPbOiWxqYvt8C +u23mb8xy8Dxs6J3Quw5UvYpn2l2ixuKRmifIGYDg9acC From 399b866431c833374d0d6b2223a17cb02b784d76 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 22:24:06 -0400 Subject: [PATCH 054/108] Roll Engine from e31251e55fd9 to 3200b99d99f3 (1 revision) (#102475) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index be409a3a17c64..3a260f9ff8c79 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -e31251e55fd95607bd636dfced066ad74f22175d +3200b99d99f366f9b0b7805de61702622916dd30 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index c746e0630cd3b..29d43f1b8b2df 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -UrnPgfhOYsXIu2DdQqzbUvLhk4ndYXYWo5rC63CLH3sC +ZRKEPPWM6cOHhhmKT45cICE7QDKDiSy7g6ieguBmk6sC From 4fec2ee0ed9849ad94bf89d7c560d188f3d01763 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sun, 24 Apr 2022 23:29:06 -0400 Subject: [PATCH 055/108] Roll Engine from 3200b99d99f3 to 20b5b8604c3e (1 revision) (#102477) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 3a260f9ff8c79..1c2d56e0a3c29 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -3200b99d99f366f9b0b7805de61702622916dd30 +20b5b8604c3e3b860f89c320991f5bb7eabacd0a From ce3d1af64723a910c5d4f670235b4b20fa3e3e51 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 02:29:07 -0400 Subject: [PATCH 056/108] Roll Engine from 20b5b8604c3e to 93de17f347fe (1 revision) (#102480) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 1c2d56e0a3c29..e27338485f760 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -20b5b8604c3e3b860f89c320991f5bb7eabacd0a +93de17f347fec7ea92c6d410e5d6ce65e0de7903 From 8c22f5648a07b9e22230fce1183c9579e6674f17 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 05:34:07 -0400 Subject: [PATCH 057/108] Roll Engine from 93de17f347fe to 10efa195bf1c (2 revisions) (#102488) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index e27338485f760..6f888ca74c616 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -93de17f347fec7ea92c6d410e5d6ce65e0de7903 +10efa195bf1ceea25d2a5a377bbe54234787fdda From d69cff97cdbcceb7339be91e55e9123c9dea13ff Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 06:39:06 -0400 Subject: [PATCH 058/108] Roll Engine from 10efa195bf1c to c901936d4f6c (1 revision) (#102493) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 6f888ca74c616..5b24f0a4ff103 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -10efa195bf1ceea25d2a5a377bbe54234787fdda +c901936d4f6c882891cbb3b965aa4027269e7760 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index b39c5f1d6d3e3..0d44851a49b42 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -u23mb8xy8Dxs6J3Quw5UvYpn2l2ixuKRmifIGYDg9acC +MbA1RtjV4CJorJFQIR2Ueo6zQWyA00GExqKIWj3bYcEC From e1ec377321e8043aa7c41505fcdc4fc05c2f239f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 11:29:04 -0400 Subject: [PATCH 059/108] Roll Engine from c901936d4f6c to 5451e88a09c0 (1 revision) (#102509) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 5b24f0a4ff103..0973af4a0d473 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -c901936d4f6c882891cbb3b965aa4027269e7760 +5451e88a09c006b3f4d33facc9e7daa99402a6ea diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 29d43f1b8b2df..d4df5be730842 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -ZRKEPPWM6cOHhhmKT45cICE7QDKDiSy7g6ieguBmk6sC +JVNKiIJWP2nsg080g4dtv3nbXCEU_BKeBv23bgWC9IUC From e3e75ff909fb237282b0a4ee0d97e5c118fdad99 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 12:04:07 -0400 Subject: [PATCH 060/108] Roll Plugins from ca63d964d9fd to 4ff0157340ea (3 revisions) (#102511) --- bin/internal/flutter_plugins.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/flutter_plugins.version b/bin/internal/flutter_plugins.version index 8915d67171ac0..8fcea5085fea7 100644 --- a/bin/internal/flutter_plugins.version +++ b/bin/internal/flutter_plugins.version @@ -1 +1 @@ -ca63d964d9fdfff9be36533ea4248d0d0ca28fd0 +4ff0157340ea1874ca753bf921807e62c1943099 From f6feb8f8b6dc3e2771acda5fc38a4ef434d3af87 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 12:34:06 -0400 Subject: [PATCH 061/108] Roll Engine from 5451e88a09c0 to 966812846313 (2 revisions) (#102513) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 0973af4a0d473..e7fa1fb3e3b3f 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -5451e88a09c006b3f4d33facc9e7daa99402a6ea +966812846313c06b5371f777c7a53a38ed47f793 From 899548c48ae68eacadab3749ab9a0c46a1ffef93 Mon Sep 17 00:00:00 2001 From: wangying Date: Tue, 26 Apr 2022 01:04:07 +0800 Subject: [PATCH 062/108] Assign debugCreator for more layers (#101899) --- .../flutter/lib/src/rendering/proxy_box.dart | 29 +++++++- .../lib/src/rendering/proxy_sliver.dart | 4 + .../flutter/lib/src/widgets/color_filter.dart | 4 + .../flutter/lib/src/widgets/image_filter.dart | 5 +- packages/flutter/test/widgets/debug_test.dart | 74 ++++++++++++++++++- 5 files changed, 113 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 32fb58e9433ba..2b62dafa78d2c 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -899,6 +899,10 @@ class RenderOpacity extends RenderProxyBox { } assert(needsCompositing); layer = context.pushOpacity(offset, _alpha, super.paint, oldLayer: layer as OpacityLayer?); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } @@ -1006,6 +1010,10 @@ mixin RenderAnimatedOpacityMixin on RenderObjectWithChil } assert(needsCompositing); layer = context.pushOpacity(offset, _alpha!, super.paint, oldLayer: layer as OpacityLayer?); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } @@ -1115,6 +1123,10 @@ class RenderShaderMask extends RenderProxyBox { ..maskRect = offset & size ..blendMode = _blendMode; context.pushLayer(layer!, super.paint, offset); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } else { layer = null; } @@ -1181,6 +1193,10 @@ class RenderBackdropFilter extends RenderProxyBox { layer!.filter = _filter; layer!.blendMode = _blendMode; context.pushLayer(layer!, super.paint, offset); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } else { layer = null; } @@ -2426,6 +2442,10 @@ class RenderTransform extends RenderProxyBox { layer = ImageFilterLayer(imageFilter: filter); } context.pushLayer(layer!, super.paint, offset); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } } @@ -5212,7 +5232,10 @@ class RenderLeaderLayer extends RenderProxyBox { ..offset = offset; } context.pushLayer(layer!, super.paint, Offset.zero); - assert(layer != null); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } @override @@ -5424,6 +5447,10 @@ class RenderFollowerLayer extends RenderProxyBox { double.infinity, ), ); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } @override diff --git a/packages/flutter/lib/src/rendering/proxy_sliver.dart b/packages/flutter/lib/src/rendering/proxy_sliver.dart index 520e0d1bba2bc..3328aac677862 100644 --- a/packages/flutter/lib/src/rendering/proxy_sliver.dart +++ b/packages/flutter/lib/src/rendering/proxy_sliver.dart @@ -173,6 +173,10 @@ class RenderSliverOpacity extends RenderProxySliver { super.paint, oldLayer: layer as OpacityLayer?, ); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } diff --git a/packages/flutter/lib/src/widgets/color_filter.dart b/packages/flutter/lib/src/widgets/color_filter.dart index b8d5c27367e1b..b604a908bf3ea 100644 --- a/packages/flutter/lib/src/widgets/color_filter.dart +++ b/packages/flutter/lib/src/widgets/color_filter.dart @@ -74,5 +74,9 @@ class _ColorFilterRenderObject extends RenderProxyBox { @override void paint(PaintingContext context, Offset offset) { layer = context.pushColorFilter(offset, colorFilter, super.paint, oldLayer: layer as ColorFilterLayer?); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } diff --git a/packages/flutter/lib/src/widgets/image_filter.dart b/packages/flutter/lib/src/widgets/image_filter.dart index 8546ea969f015..935d401789ac1 100644 --- a/packages/flutter/lib/src/widgets/image_filter.dart +++ b/packages/flutter/lib/src/widgets/image_filter.dart @@ -73,6 +73,9 @@ class _ImageFilterRenderObject extends RenderProxyBox { filterLayer.imageFilter = imageFilter; } context.pushLayer(layer!, super.paint, offset); - assert(layer != null); + assert(() { + layer!.debugCreator = debugCreator; + return true; + }()); } } diff --git a/packages/flutter/test/widgets/debug_test.dart b/packages/flutter/test/widgets/debug_test.dart index 47e3cffabc95e..ce1eabb770fb9 100644 --- a/packages/flutter/test/widgets/debug_test.dart +++ b/packages/flutter/test/widgets/debug_test.dart @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:ui'; + import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -269,4 +271,74 @@ void main() { } debugHighlightDeprecatedWidgets = false; }); + + testWidgets('debugCreator of layers should not be null', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: Material( + child: Stack( + children: [ + const ColorFiltered( + colorFilter: ColorFilter.mode(Color(0xFFFF0000), BlendMode.color), + child: Placeholder(), + ), + const Opacity( + opacity: 1.0, + child: Placeholder(), + ), + ImageFiltered( + imageFilter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: const Placeholder(), + ), + BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: const Placeholder(), + ), + ShaderMask( + shaderCallback: (Rect bounds) => const RadialGradient( + radius: 0.05, + colors: [Color(0xFFFF0000), Color(0xFF00FF00)], + tileMode: TileMode.mirror, + ).createShader(bounds), + child: const Placeholder(), + ), + RangeSlider( + values: const RangeValues(0.3, 0.7), + onChanged: (RangeValues newValues) {}, + ), + CompositedTransformFollower( + link: LayerLink(), + ), + ], + ), + ), + ), + ), + ); + + RenderObject renderObject; + + renderObject = tester.firstRenderObject(find.byType(Opacity)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(ColorFiltered)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(ImageFiltered)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(BackdropFilter)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(ShaderMask)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(RangeSlider)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + + renderObject = tester.firstRenderObject(find.byType(CompositedTransformFollower)); + expect(renderObject.debugLayer?.debugCreator, isNotNull); + }); } From 46cb9ede2f02f03e2151fda38f2e47805f503590 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Mon, 25 Apr 2022 10:30:40 -0700 Subject: [PATCH 063/108] Reduce Gradle log level in verbose output (#102422) --- packages/flutter_tools/lib/src/android/gradle.dart | 4 ++-- .../general.shard/android/android_gradle_builder_test.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index 19948c57b6384..d5caca41af480 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -269,7 +269,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ]; if (_logger.isVerbose) { command.add('--full-stacktrace'); - command.add('--debug'); + command.add('--info'); command.add('-Pverbose=true'); } else { command.add('-q'); @@ -593,7 +593,7 @@ class AndroidGradleBuilder implements AndroidBuilder { ]; if (_logger.isVerbose) { command.add('--full-stacktrace'); - command.add('--debug'); + command.add('--info'); command.add('-Pverbose=true'); } else { command.add('-q'); diff --git a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart index b0d0636bed699..bd90fa1730346 100644 --- a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart @@ -142,7 +142,7 @@ void main() { command: [ 'gradlew', '--full-stacktrace', - '--debug', + '--info', '-Pverbose=true', '-Ptarget-platform=android-arm,android-arm64,android-x64', '-Ptarget=lib/main.dart', @@ -782,7 +782,7 @@ void main() { '-Pis-plugin=false', '-PbuildNumber=1.0', '--full-stacktrace', - '--debug', + '--info', '-Pverbose=true', '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', From 7b580fd5df9442bd37e7327e35060a1efa6b2c68 Mon Sep 17 00:00:00 2001 From: Sai Sandeep Mutyala Date: Mon, 25 Apr 2022 23:14:07 +0530 Subject: [PATCH 064/108] Enable TestDefaultBinaryMessenger to intercept all platform channels. (#100049) --- .../src/test_default_binary_messenger.dart | 13 ++++++- .../test_default_binary_messenger_test.dart | 39 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/flutter_test/lib/src/test_default_binary_messenger.dart b/packages/flutter_test/lib/src/test_default_binary_messenger.dart index ba227d6e40f71..0907209e7e616 100644 --- a/packages/flutter_test/lib/src/test_default_binary_messenger.dart +++ b/packages/flutter_test/lib/src/test_default_binary_messenger.dart @@ -8,6 +8,11 @@ import 'dart:ui' as ui; import 'package:fake_async/fake_async.dart'; import 'package:flutter/services.dart'; +/// A function which takes the name of the method channel, it's handler, +/// platform message and asynchronously returns an encoded response. +typedef AllMessagesHandler = Future? Function( + String channel, MessageHandler? handler, ByteData? message); + /// A [BinaryMessenger] subclass that is used as the default binary messenger /// under testing environment. /// @@ -116,11 +121,17 @@ class TestDefaultBinaryMessenger extends BinaryMessenger { // can implement the [checkMockMessageHandler] method. final Map _outboundHandlerIdentities = {}; + /// Handler that intercepts and responds to outgoing messages, pretending + /// to be the platform, for all channels. + AllMessagesHandler? allMessagesHandler; + @override Future? send(String channel, ByteData? message) { final Future? resultFuture; final MessageHandler? handler = _outboundHandlers[channel]; - if (handler != null) { + if (allMessagesHandler != null) { + resultFuture = allMessagesHandler!(channel, handler, message); + } else if (handler != null) { resultFuture = handler(message); } else { resultFuture = delegate.send(channel, message); diff --git a/packages/flutter_test/test/test_default_binary_messenger_test.dart b/packages/flutter_test/test/test_default_binary_messenger_test.dart index 5052882682f52..30ed9e686bd46 100644 --- a/packages/flutter_test/test/test_default_binary_messenger_test.dart +++ b/packages/flutter_test/test/test_default_binary_messenger_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/services.dart'; @@ -26,6 +27,19 @@ class TestDelegate extends BinaryMessenger { void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); } +class WorkingTestDelegate extends BinaryMessenger { + @override + Future? send(String channel, ByteData? message) async { + return ByteData.sublistView(Uint8List.fromList([1, 2, 3])); + } + + // Rest of the API isn't needed for this test. + @override + Future handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback) => throw UnimplementedError(); + @override + void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); +} + void main() { testWidgets('Caught exceptions are caught by the test framework', (WidgetTester tester) async { final BinaryMessenger delegate = TestDelegate(); @@ -39,4 +53,29 @@ void main() { expect(error, const RecognizableTestException()); } }); + + testWidgets('Mock MessageHandler is set correctly', + (WidgetTester tester) async { + final TestDefaultBinaryMessenger binaryMessenger = + TestDefaultBinaryMessenger(WorkingTestDelegate()); + binaryMessenger.setMockMessageHandler( + '', + (ByteData? message) async => + ByteData.sublistView(Uint8List.fromList([2, 3, 4]))); + + final ByteData? result = await binaryMessenger.send('', null); + expect(result?.buffer.asUint8List(), Uint8List.fromList([2, 3, 4])); + }); + + testWidgets('Mock AllMessagesHandler is set correctly', + (WidgetTester tester) async { + final TestDefaultBinaryMessenger binaryMessenger = + TestDefaultBinaryMessenger(WorkingTestDelegate()); + binaryMessenger.allMessagesHandler = + (String channel, MessageHandler? handler, ByteData? message) async => + ByteData.sublistView(Uint8List.fromList([2, 3, 4])); + + final ByteData? result = await binaryMessenger.send('', null); + expect(result?.buffer.asUint8List(), Uint8List.fromList([2, 3, 4])); + }); } From 0095feeadee672f8bf68cd75ad557921ae090ffe Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 13:49:07 -0400 Subject: [PATCH 065/108] Roll Engine from 966812846313 to c4184728a9ad (1 revision) (#102515) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index e7fa1fb3e3b3f..d76c58decd2a7 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -966812846313c06b5371f777c7a53a38ed47f793 +c4184728a9ad486ed900a705800db3f7d1e61215 From d46979648693f41a84b5e3011b9b81d519e8581b Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 14:54:06 -0400 Subject: [PATCH 066/108] Roll Engine from c4184728a9ad to f1bb8f421135 (1 revision) (#102519) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index d76c58decd2a7..ef891fb884d84 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -c4184728a9ad486ed900a705800db3f7d1e61215 +f1bb8f4211351cfdeb267cf4aba2bb57abdd3d77 From 3bd19f22970d7800ffc0ae0da2a8d7cc3877bc68 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 16:34:07 -0400 Subject: [PATCH 067/108] Roll Engine from f1bb8f421135 to 0f47c7a68811 (1 revision) (#102523) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index ef891fb884d84..8ff7d5ba428f2 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -f1bb8f4211351cfdeb267cf4aba2bb57abdd3d77 +0f47c7a68811f0436adf942fefb64a6e379a8371 From 558016455afea6613fd467fe4e50df45c063e852 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Mon, 25 Apr 2022 15:54:05 -0500 Subject: [PATCH 068/108] Re-land reverse case for AppBar scrolled under (#102343) --- .../flutter/lib/src/material/app_bar.dart | 34 +- .../widgets/scroll_notification_observer.dart | 32 +- .../flutter/test/material/app_bar_test.dart | 706 +++++++++++------- .../flutter/test/material/debug_test.dart | 1 + .../flutter/test/material/scaffold_test.dart | 1 + 5 files changed, 479 insertions(+), 295 deletions(-) diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 39c7bd39c339c..045d9d8325ac4 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -767,17 +767,33 @@ class _AppBarState extends State { } void _handleScrollNotification(ScrollNotification notification) { - if (notification is ScrollUpdateNotification) { - final bool oldScrolledUnder = _scrolledUnder; - _scrolledUnder = notification.depth == 0 - && notification.metrics.extentBefore > 0 - && notification.metrics.axis == Axis.vertical; - if (_scrolledUnder != oldScrolledUnder) { - setState(() { - // React to a change in MaterialState.scrolledUnder - }); + final bool oldScrolledUnder = _scrolledUnder; + final ScrollMetrics metrics = notification.metrics; + + if (notification.depth != 0) { + _scrolledUnder = false; + } else { + switch (metrics.axisDirection) { + case AxisDirection.up: + // Scroll view is reversed + _scrolledUnder = metrics.extentAfter > 0; + break; + case AxisDirection.down: + _scrolledUnder = metrics.extentBefore > 0; + break; + case AxisDirection.right: + case AxisDirection.left: + // Scrolled under is only supported in the vertical axis. + _scrolledUnder = false; + break; } } + + if (_scrolledUnder != oldScrolledUnder) { + setState(() { + // React to a change in MaterialState.scrolledUnder + }); + } } Color _resolveColor(Set states, Color? widgetColor, Color? themeColor, Color defaultColor) { diff --git a/packages/flutter/lib/src/widgets/scroll_notification_observer.dart b/packages/flutter/lib/src/widgets/scroll_notification_observer.dart index bc151190f1d5d..6fa7ffaa15b7c 100644 --- a/packages/flutter/lib/src/widgets/scroll_notification_observer.dart +++ b/packages/flutter/lib/src/widgets/scroll_notification_observer.dart @@ -9,6 +9,7 @@ import 'package:flutter/foundation.dart'; import 'framework.dart'; import 'notification_listener.dart'; import 'scroll_notification.dart'; +import 'scroll_position.dart'; /// A [ScrollNotification] listener for [ScrollNotificationObserver]. /// @@ -151,14 +152,26 @@ class ScrollNotificationObserverState extends State @override Widget build(BuildContext context) { - return NotificationListener( - onNotification: (ScrollNotification notification) { - _notifyListeners(notification); + // A ScrollMetricsNotification allows listeners to be notified for an + // initial state, as well as if the content dimensions change without + // scrolling. + return NotificationListener( + onNotification: (ScrollMetricsNotification notification) { + _notifyListeners(_ConvertedScrollMetricsNotification( + metrics: notification.metrics, + context: notification.context, + )); return false; }, - child: _ScrollNotificationObserverScope( - scrollNotificationObserverState: this, - child: widget.child, + child: NotificationListener( + onNotification: (ScrollNotification notification) { + _notifyListeners(notification); + return false; + }, + child: _ScrollNotificationObserverScope( + scrollNotificationObserverState: this, + child: widget.child, + ), ), ); } @@ -170,3 +183,10 @@ class ScrollNotificationObserverState extends State super.dispose(); } } + +class _ConvertedScrollMetricsNotification extends ScrollNotification { + _ConvertedScrollMetricsNotification({ + required super.metrics, + required super.context, + }); +} diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart index 88b6963f68aab..1b08520ea620f 100644 --- a/packages/flutter/test/material/app_bar_test.dart +++ b/packages/flutter/test/material/app_bar_test.dart @@ -2567,311 +2567,457 @@ void main() { expect(actionIconTheme.color, foregroundColor); }); - testWidgets('SliverAppBar.backgroundColor MaterialStateColor scrolledUnder', (WidgetTester tester) async { + group('MaterialStateColor scrolledUnder', () { const double collapsedHeight = kToolbarHeight; const double expandedHeight = 200.0; const Color scrolledColor = Color(0xff00ff00); const Color defaultColor = Color(0xff0000ff); - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; - }), - expandedHeight: expandedHeight, - pinned: true, - ), - SliverList( - delegate: SliverChildListDelegate( - [ - Container(height: 1200.0, color: Colors.teal), - ], - ), - ), - ], - ), - ), - ), - ); - Finder findAppBarMaterial() { - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; } - Color? getAppBarBackgroundColor() { + Color? getAppBarBackgroundColor(WidgetTester tester) { return tester.widget(findAppBarMaterial()).color; } - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('SliverAppBar.backgroundColor with FlexibleSpace MaterialStateColor scrolledUnder', (WidgetTester tester) async { - const double collapsedHeight = kToolbarHeight; - const double expandedHeight = 200.0; - const Color scrolledColor = Color(0xff00ff00); - const Color defaultColor = Color(0xff0000ff); - - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: CustomScrollView( - slivers: [ - SliverAppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; - }), - expandedHeight: expandedHeight, - pinned: true, - flexibleSpace: const FlexibleSpaceBar( - title: Text('SliverAppBar'), + group('SliverAppBar', () { + Widget _buildSliverApp({ + required double contentHeight, + bool reverse = false, + bool includeFlexibleSpace = false, + }) { + return MaterialApp( + home: Scaffold( + body: CustomScrollView( + reverse: reverse, + slivers: [ + SliverAppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) + ? scrolledColor + : defaultColor; + }), + expandedHeight: expandedHeight, + pinned: true, + flexibleSpace: includeFlexibleSpace + ? const FlexibleSpaceBar(title: Text('SliverAppBar')) + : null, ), - ), - SliverList( - delegate: SliverChildListDelegate( + SliverList( + delegate: SliverChildListDelegate( [ - Container(height: 1200.0, color: Colors.teal), + Container(height: contentHeight, color: Colors.teal), ], + ), ), - ), - ], - ), - ), - ), - ); - - Finder findAppBarMaterial() { - // There are 2 Material widgets below AppBar. The second is only added if - // flexibleSpace is non-null. - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; - } - - Color? getAppBarBackgroundColor() { - return tester.widget(findAppBarMaterial()).color; - } - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('AppBar.backgroundColor MaterialStateColor scrolledUnder', (WidgetTester tester) async { - const Color scrolledColor = Color(0xff00ff00); - const Color defaultColor = Color(0xff0000ff); - - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; - }), - title: const Text('AppBar'), - ), - body: ListView( - children: [ - Container(height: 1200.0, color: Colors.teal), - ], - ), - ), - ), - ); - - Finder findAppBarMaterial() { - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); - } - - Color? getAppBarBackgroundColor() { - return tester.widget(findAppBarMaterial()).color; - } - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('AppBar.backgroundColor with FlexibleSpace MaterialStateColor scrolledUnder', (WidgetTester tester) async { - const Color scrolledColor = Color(0xff00ff00); - const Color defaultColor = Color(0xff0000ff); - - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; - }), - title: const Text('AppBar'), - flexibleSpace: const FlexibleSpaceBar( - title: Text('FlexibleSpace'), + ], ), ), - body: ListView( - children: [ - Container(height: 1200.0, color: Colors.teal), - ], - ), - ), - ), - ); - - Finder findAppBarMaterial() { - // There are 2 Material widgets below AppBar. The second is only added if - // flexibleSpace is non-null. - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; - } - - Color? getAppBarBackgroundColor() { - return tester.widget(findAppBarMaterial()).color; - } - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); + ); + } + + testWidgets('backgroundColor', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp(contentHeight: 1200.0) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp(contentHeight: 1200.0, includeFlexibleSpace: true) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('backgroundColor - reverse', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp(contentHeight: 1200.0, reverse: true) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp( + contentHeight: 1200.0, + reverse: true, + includeFlexibleSpace: true, + ) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('backgroundColor - not triggered in reverse for short content', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp(contentHeight: 200, reverse: true) + ); + + // In reverse, the content here is not long enough to scroll under the app + // bar. + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace - not triggered in reverse for short content', (WidgetTester tester) async { + await tester.pumpWidget( + _buildSliverApp( + contentHeight: 200, + reverse: true, + includeFlexibleSpace: true, + ) + ); + + // In reverse, the content here is not long enough to scroll under the app + // bar. + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + }); - testWidgets('AppBar._handleScrollNotification safely calls setState()', (WidgetTester tester) async { - // Regression test for failures found in Google internal issue b/185192049. - final ScrollController controller = ScrollController(initialScrollOffset: 400); - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('AppBar'), - ), - body: Scrollbar( - isAlwaysShown: true, - controller: controller, - child: ListView( - controller: controller, + group('AppBar', () { + Widget _buildAppBar({ + required double contentHeight, + bool reverse = false, + bool includeFlexibleSpace = false + }) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) + ? scrolledColor + : defaultColor; + }), + title: const Text('AppBar'), + flexibleSpace: includeFlexibleSpace + ? const FlexibleSpaceBar(title: Text('FlexibleSpace')) + : null, + ), + body: ListView( + reverse: reverse, children: [ - Container(height: 1200.0, color: Colors.teal), + Container(height: contentHeight, color: Colors.teal), ], ), ), - ), - ), - ); - - expect(tester.takeException(), isNull); - }); - - testWidgets('AppBar scrolledUnder does not trigger on horizontal scroll', (WidgetTester tester) async { - const Color scrolledColor = Color(0xff00ff00); - const Color defaultColor = Color(0xff0000ff); - - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; - }), - title: const Text('AppBar'), - ), - body: ListView( - scrollDirection: Axis.horizontal, - children: [ - Container(height: 600.0, width: 1200.0, color: Colors.teal), - ], + ); + } + + testWidgets('backgroundColor', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar(contentHeight: 1200.0) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar(contentHeight: 1200.0, includeFlexibleSpace: true) + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('backgroundColor - reverse', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar(contentHeight: 1200.0, reverse: true) + ); + await tester.pump(); + + // In this test case, the content always extends under the AppBar, so it + // should always be the scrolledColor. + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar( + contentHeight: 1200.0, + reverse: true, + includeFlexibleSpace: true, + ) + ); + await tester.pump(); + + // In this test case, the content always extends under the AppBar, so it + // should always be the scrolledColor. + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('_handleScrollNotification safely calls setState()', (WidgetTester tester) async { + // Regression test for failures found in Google internal issue b/185192049. + final ScrollController controller = ScrollController(initialScrollOffset: 400); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('AppBar'), + ), + body: Scrollbar( + isAlwaysShown: true, + controller: controller, + child: ListView( + controller: controller, + children: [ + Container(height: 1200.0, color: Colors.teal), + ], + ), + ), + ), ), - ), - ), - ); - - Finder findAppBarMaterial() { - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); - } - - Color? getAppBarBackgroundColor() { - return tester.widget(findAppBarMaterial()).color; - } - - expect(getAppBarBackgroundColor(), defaultColor); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(-100.0, 0.0)); - await gesture.up(); - await tester.pumpAndSettle(); + ); - expect(getAppBarBackgroundColor(), defaultColor); - - gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(100.0, 0.0)); - await gesture.up(); - await tester.pumpAndSettle(); + expect(tester.takeException(), isNull); + }); - expect(getAppBarBackgroundColor(), defaultColor); + testWidgets('does not trigger on horizontal scroll', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) + ? scrolledColor + : defaultColor; + }), + title: const Text('AppBar'), + ), + body: ListView( + scrollDirection: Axis.horizontal, + children: [ + Container(height: 600.0, width: 1200.0, color: Colors.teal), + ], + ), + ), + ), + ); + + expect(getAppBarBackgroundColor(tester), defaultColor); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(-100.0, 0.0)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + + gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(100.0, 0.0)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + }); + + testWidgets('backgroundColor - not triggered in reverse for short content', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar( + contentHeight: 200.0, + reverse: true, + ) + ); + await tester.pump(); + + // In reverse, the content here is not long enough to scroll under the app + // bar. + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('backgroundColor with FlexibleSpace - not triggered in reverse for short content', (WidgetTester tester) async { + await tester.pumpWidget( + _buildAppBar( + contentHeight: 200.0, + reverse: true, + includeFlexibleSpace: true, + ) + ); + await tester.pump(); + + // In reverse, the content here is not long enough to scroll under the app + // bar. + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(tester), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + }); }); testWidgets('AppBar.preferredHeightFor', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/debug_test.dart b/packages/flutter/test/material/debug_test.dart index 46f9e61b37fd9..21492e972bc01 100644 --- a/packages/flutter/test/material/debug_test.dart +++ b/packages/flutter/test/material/debug_test.dart @@ -349,6 +349,7 @@ void main() { ' Material\n' ' _ScrollNotificationObserverScope\n' ' NotificationListener\n' + ' NotificationListener\n' ' ScrollNotificationObserver\n' ' _ScaffoldScope\n' ' Scaffold-[LabeledGlobalKey#00000]\n' diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 3a10ba8c08fb3..7aeee33dc42ec 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -2339,6 +2339,7 @@ void main() { ' Material\n' ' _ScrollNotificationObserverScope\n' ' NotificationListener\n' + ' NotificationListener\n' ' ScrollNotificationObserver\n' ' _ScaffoldScope\n' ' Scaffold\n' From 4537391ac2b1c5d219d2a65580c716fbe8ccf7bb Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 17:44:07 -0400 Subject: [PATCH 069/108] Roll Engine from 0f47c7a68811 to 5fdfbe3010bb (1 revision) (#102526) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 8ff7d5ba428f2..ab406e980e26b 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0f47c7a68811f0436adf942fefb64a6e379a8371 +5fdfbe3010bb55f163fc2f2d27f0ca914663e367 From 1c80e29b8e0a793ae582e8f4ccf7099c7f316d85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:29:08 -0700 Subject: [PATCH 070/108] Bump debian from bullseye-20220328-slim to bullseye-20220418-slim in /dev/ci/docker_linux (#102528) --- dev/ci/docker_linux/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ci/docker_linux/Dockerfile b/dev/ci/docker_linux/Dockerfile index 9263abdbacc7c..d6a930ab5e00b 100644 --- a/dev/ci/docker_linux/Dockerfile +++ b/dev/ci/docker_linux/Dockerfile @@ -12,7 +12,7 @@ # Last manual update 2021-09-24 (changing this comment will re-build image) -FROM debian@sha256:78fd65998de7a59a001d792fe2d3a6d2ea25b6f3f068e5c84881250373577414 +FROM debian@sha256:f75d8a3ac10acdaa9be6052ea5f28bcfa56015ff02298831994bd3e6d66f7e57 MAINTAINER Flutter Developers RUN apt-get update -y && \ From 18713e0c5d44ed2e991e94595e1ff2900f97a7ef Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:39:05 -0700 Subject: [PATCH 071/108] Made Directionality forego dependency tracking for better performance. (#102336) --- packages/flutter/lib/src/widgets/basic.dart | 59 ++++++++++++++++++- .../flutter/lib/src/widgets/framework.dart | 5 ++ .../flutter/test/widgets/framework_test.dart | 24 ++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart index f565db3598e2e..0d6b956a6f962 100644 --- a/packages/flutter/lib/src/widgets/basic.dart +++ b/packages/flutter/lib/src/widgets/basic.dart @@ -80,12 +80,69 @@ export 'package:flutter/services.dart' show // BIDIRECTIONAL TEXT SUPPORT +/// An [InheritedElement] that has hundreds of dependencies but will +/// infrequently change. This provides a performance tradeoff where building +/// the [Widget]s is faster but performing updates is slower. +/// +/// | | _UbiquitiousInheritedElement | InheritedElement | +/// |---------------------|------------------------------|------------------| +/// | insert (best case) | O(1) | O(1) | +/// | insert (worst case) | O(1) | O(n) | +/// | search (best case) | O(n) | O(1) | +/// | search (worst case) | O(n) | O(n) | +/// +/// Insert happens when building the [Widget] tree, search happens when updating +/// [Widget]s. +class _UbiquitousInheritedElement extends InheritedElement { + /// Creates an element that uses the given widget as its configuration. + _UbiquitousInheritedElement(super.widget); + + @override + void setDependencies(Element dependent, Object? value) { + // This is where the cost of [InheritedElement] is incurred during build + // time of the widget tree. Omitting this bookkeeping is where the + // performance savings come from. + assert(value == null); + } + + @override + Object? getDependencies(Element dependent) { + return null; + } + + @override + void notifyClients(InheritedWidget oldWidget) { + _recurseChildren(this, (Element element) { + if (element.doesDependOnInheritedElement(this)) { + notifyDependent(oldWidget, element); + } + }); + } + + static void _recurseChildren(Element element, ElementVisitor visitor) { + element.visitChildren((Element child) { + _recurseChildren(child, visitor); + }); + visitor(element); + } +} + +/// See also: +/// +/// * [_UbiquitousInheritedElement], the [Element] for [_UbiquitousInheritedWidget]. +abstract class _UbiquitousInheritedWidget extends InheritedWidget { + const _UbiquitousInheritedWidget({super.key, required super.child}); + + @override + InheritedElement createElement() => _UbiquitousInheritedElement(this); +} + /// A widget that determines the ambient directionality of text and /// text-direction-sensitive render objects. /// /// For example, [Padding] depends on the [Directionality] to resolve /// [EdgeInsetsDirectional] objects into absolute [EdgeInsets] objects. -class Directionality extends InheritedWidget { +class Directionality extends _UbiquitousInheritedWidget { /// Creates a widget that determines the directionality of text and /// text-direction-sensitive render objects. /// diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart index 654c83f6a1181..cc42fc59f63df 100644 --- a/packages/flutter/lib/src/widgets/framework.dart +++ b/packages/flutter/lib/src/widgets/framework.dart @@ -4197,6 +4197,11 @@ abstract class Element extends DiagnosticableTree implements BuildContext { return true; } + /// Returns `true` if [dependOnInheritedElement] was previously called with [ancestor]. + @protected + bool doesDependOnInheritedElement(InheritedElement ancestor) => + _dependencies != null && _dependencies!.contains(ancestor); + @override InheritedWidget dependOnInheritedElement(InheritedElement ancestor, { Object? aspect }) { assert(ancestor != null); diff --git a/packages/flutter/test/widgets/framework_test.dart b/packages/flutter/test/widgets/framework_test.dart index ca2a57fba2c25..b754a442863f6 100644 --- a/packages/flutter/test/widgets/framework_test.dart +++ b/packages/flutter/test/widgets/framework_test.dart @@ -1694,6 +1694,30 @@ The findRenderObject() method was called for the following element: expect(inheritedElement.hashCode, identityHashCode(inheritedElement)); }); + + testWidgets('doesDependOnInheritedElement', (WidgetTester tester) async { + final _TestInheritedElement ancestor = + _TestInheritedElement(const Directionality( + textDirection: TextDirection.ltr, + child: Placeholder(), + )); + final _TestInheritedElement child = + _TestInheritedElement(const Directionality( + textDirection: TextDirection.ltr, + child: Placeholder(), + )); + expect(child.doesDependOnInheritedElement(ancestor), isFalse); + child.dependOnInheritedElement(ancestor); + expect(child.doesDependOnInheritedElement(ancestor), isTrue); + }); +} + +class _TestInheritedElement extends InheritedElement { + _TestInheritedElement(super.widget); + @override + bool doesDependOnInheritedElement(InheritedElement element) { + return super.doesDependOnInheritedElement(element); + } } class _WidgetWithNoVisitChildren extends StatelessWidget { From 92bc78371beee9a788491ed5dfaf252e4635f186 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Mon, 25 Apr 2022 18:49:06 -0400 Subject: [PATCH 072/108] Roll Engine from 5fdfbe3010bb to 4df9cf27052b (1 revision) (#102529) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index ab406e980e26b..3648a52ab4f87 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -5fdfbe3010bb55f163fc2f2d27f0ca914663e367 +4df9cf27052bbb6c6acdeab17db1bac0bf79a372 From 0411a6f8a3bb6c44aaa69555984cc6e7112374a5 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Mon, 25 Apr 2022 16:14:03 -0700 Subject: [PATCH 073/108] Enable M1 mac/ios tests in prod as bringup: false (#102530) --- .ci.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.ci.yaml b/.ci.yaml index 41ec45cd947fa..47ecaac5d6fea 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -2447,7 +2447,6 @@ targets: - name: Mac_arm64_ios build_ios_framework_module_test recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3309,7 +3308,6 @@ targets: - name: Mac_arm64_ios flutter_gallery_ios__compile recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3349,7 +3347,6 @@ targets: - name: Mac_arm64_ios hello_world_ios__compile recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3372,7 +3369,6 @@ targets: - name: Mac_arm64_ios hot_mode_dev_cycle_macos_target__benchmark recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3455,7 +3451,6 @@ targets: - name: Mac_arm64_ios ios_app_with_extensions_test recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3476,7 +3471,6 @@ targets: - name: Mac_arm64_ios ios_content_validation_test recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3527,7 +3521,6 @@ targets: - name: Mac_arm64_ios macos_chrome_dev_mode recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3687,7 +3680,6 @@ targets: - name: Mac_arm64_ios native_ui_tests_ios recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > @@ -3736,7 +3728,6 @@ targets: - name: Mac_arm64_ios run_release_test_macos recipe: devicelab/devicelab_drone presubmit: false - bringup: true # https://github.com/flutter/flutter/issues/87508 timeout: 60 properties: tags: > From f15295cc91dfa1b9705d318edca27cf9605e1f73 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 25 Apr 2022 17:44:07 -0700 Subject: [PATCH 074/108] [framework] allow disabling image filter layer (#102085) --- .../flutter/lib/src/widgets/image_filter.dart | 46 +++++++++++++++++-- .../test/widgets/image_filter_test.dart | 21 +++++++++ 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/packages/flutter/lib/src/widgets/image_filter.dart b/packages/flutter/lib/src/widgets/image_filter.dart index 935d401789ac1..67f9ae459fecc 100644 --- a/packages/flutter/lib/src/widgets/image_filter.dart +++ b/packages/flutter/lib/src/widgets/image_filter.dart @@ -11,6 +11,19 @@ import 'framework.dart'; /// Applies an [ImageFilter] to its child. /// +/// An image filter will always apply its filter operation to the child widget, +/// even if said filter is conceptually a "no-op", such as an ImageFilter.blur +/// with a radius of 0 or an ImageFilter.matrix with an identity matrix. Setting +/// [ImageFiltered.enabled] to `false` is a more efficient manner of disabling +/// an image filter. +/// +/// The framework does not attempt to optimize out "no-op" filters because it +/// cannot tell the difference between an intentional no-op and a filter that is +/// only incidentally a no-op. Consider an ImageFilter.matrix that is animated +/// and happens to pass through the identity matrix. If the framework identified it +/// as a no-op it would drop and then recreate the layer during the animation which +/// would be more expensive than keeping it around. +/// /// {@youtube 560 315 https://www.youtube.com/watch?v=7Lftorq4i2o} /// /// See also: @@ -27,17 +40,27 @@ class ImageFiltered extends SingleChildRenderObjectWidget { super.key, required this.imageFilter, super.child, + this.enabled = true, }) : assert(imageFilter != null); /// The image filter to apply to the child of this widget. final ImageFilter imageFilter; + /// Whether or not to apply the image filter opation to the child of this + /// widget. + /// + /// Prefer setting enabled to `false` instead of creating a "no-op" filter + /// type for performance reasons. + final bool enabled; + @override - RenderObject createRenderObject(BuildContext context) => _ImageFilterRenderObject(imageFilter); + RenderObject createRenderObject(BuildContext context) => _ImageFilterRenderObject(imageFilter, enabled); @override void updateRenderObject(BuildContext context, RenderObject renderObject) { - (renderObject as _ImageFilterRenderObject).imageFilter = imageFilter; + (renderObject as _ImageFilterRenderObject) + ..enabled = enabled + ..imageFilter = imageFilter; } @override @@ -48,7 +71,17 @@ class ImageFiltered extends SingleChildRenderObjectWidget { } class _ImageFilterRenderObject extends RenderProxyBox { - _ImageFilterRenderObject(this._imageFilter); + _ImageFilterRenderObject(this._imageFilter, this._enabled); + + bool get enabled => _enabled; + bool _enabled; + set enabled(bool value) { + if (enabled == value) { + return; + } + _enabled = value; + markNeedsPaint(); + } ImageFilter get imageFilter => _imageFilter; ImageFilter _imageFilter; @@ -61,11 +94,16 @@ class _ImageFilterRenderObject extends RenderProxyBox { } @override - bool get alwaysNeedsCompositing => child != null; + bool get alwaysNeedsCompositing => child != null && enabled; @override void paint(PaintingContext context, Offset offset) { assert(imageFilter != null); + if (!enabled) { + layer = null; + return super.paint(context, offset); + } + if (layer == null) { layer = ImageFilterLayer(imageFilter: imageFilter); } else { diff --git a/packages/flutter/test/widgets/image_filter_test.dart b/packages/flutter/test/widgets/image_filter_test.dart index 38d949860baa1..6395cb044edca 100644 --- a/packages/flutter/test/widgets/image_filter_test.dart +++ b/packages/flutter/test/widgets/image_filter_test.dart @@ -86,4 +86,25 @@ void main() { await pumpWithSigma(10.0); expect(renderObject.debugLayer, same(originalLayer)); }); + + testWidgets('Image filter - enabled and disabled', (WidgetTester tester) async { + Future pumpWithEnabledStaet(bool enabled) async { + await tester.pumpWidget( + RepaintBoundary( + child: ImageFiltered( + enabled: enabled, + imageFilter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: const Placeholder(), + ), + ), + ); + } + + await pumpWithEnabledStaet(false); + expect(tester.layers, isNot(contains(isA()))); + + + await pumpWithEnabledStaet(true); + expect(tester.layers, contains(isA())); + }); } From 63574cf76ab021877d14be5c39fb77ea8116bab4 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 25 Apr 2022 18:14:06 -0700 Subject: [PATCH 075/108] add benchmark for animated complex opacity (#102532) --- .ci.yaml | 11 ++++ TESTOWNERS | 1 + .../android/app/src/main/AndroidManifest.xml | 1 + .../macrobenchmarks/lib/common.dart | 1 + dev/benchmarks/macrobenchmarks/lib/main.dart | 9 +++ .../lib/src/animated_complex_opacity.dart | 59 +++++++++++++++++++ ...ted_complex_opacity_perf__e2e_summary.dart | 14 +++++ dev/devicelab/lib/tasks/perf_tests.dart | 7 +++ 8 files changed, 103 insertions(+) create mode 100644 dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart create mode 100644 dev/devicelab/bin/tasks/animated_complex_opacity_perf__e2e_summary.dart diff --git a/.ci.yaml b/.ci.yaml index 47ecaac5d6fea..8322c8c8b45d2 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -1453,6 +1453,17 @@ targets: task_name: animated_image_gc_perf scheduler: luci + - name: Linux_android animated_complex_opacity_perf__e2e_summary + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true + timeout: 60 + properties: + tags: > + ["devicelab","android","linux"] + task_name: animated_complex_opacity_perf__e2e_summary + scheduler: luci + - name: Linux_android animated_placeholder_perf__e2e_summary recipe: devicelab/devicelab_drone presubmit: false diff --git a/TESTOWNERS b/TESTOWNERS index d48ef1a5494c3..9706dde1c5154 100644 --- a/TESTOWNERS +++ b/TESTOWNERS @@ -78,6 +78,7 @@ /dev/devicelab/bin/tasks/gradient_consistent_perf__e2e_summary.dart @flar @flutter/engine /dev/devicelab/bin/tasks/gradient_dynamic_perf__e2e_summary.dart @flar @flutter/engine /dev/devicelab/bin/tasks/gradient_static_perf__e2e_summary.dart @flar @flutter/engine +/dev/devicelab/bin/tasks/animated_complex_opacity_perf__e2e_summary.dart @jonahwilliams @flutter/engine ## Windows Android DeviceLab tests /dev/devicelab/bin/tasks/basic_material_app_win__compile.dart @zanderso @flutter/tool diff --git a/dev/benchmarks/macrobenchmarks/android/app/src/main/AndroidManifest.xml b/dev/benchmarks/macrobenchmarks/android/app/src/main/AndroidManifest.xml index c0f2c6be78295..6453a039057a8 100644 --- a/dev/benchmarks/macrobenchmarks/android/app/src/main/AndroidManifest.xml +++ b/dev/benchmarks/macrobenchmarks/android/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ found in the LICENSE file. --> android:label="macrobenchmarks" android:icon="@mipmap/ic_launcher"> const GradientPerfHomePage(), ...gradientPerfRoutes, + kAnimatedComplexOpacityPerfRouteName: (BuildContext context) => const AnimatedComplexOpacity(), }, ); } @@ -257,6 +259,13 @@ class HomePage extends StatelessWidget { Navigator.pushNamed(context, kGradientPerfRouteName); }, ), + ElevatedButton( + key: const Key(kAnimatedComplexOpacityPerfRouteName), + child: const Text('Animated complex opacity perf'), + onPressed: () { + Navigator.pushNamed(context, kAnimatedComplexOpacityPerfRouteName); + }, + ), ], ), ); diff --git a/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart b/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart new file mode 100644 index 0000000000000..90b2276e343bc --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart @@ -0,0 +1,59 @@ +// 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. + +import 'package:flutter/material.dart'; + +// Various tests to verify that Aniamted opacity layers (i.e. FadeTransition) do not +// dirty children even without explicit repaint boundaries. These intentionally use +// text to ensure we don't measure the opacity peephole case. +class AnimatedComplexOpacity extends StatefulWidget { + const AnimatedComplexOpacity({ super.key }); + + @override + State createState() => _AnimatedComplexOpacityState(); +} + +class _AnimatedComplexOpacityState extends State with SingleTickerProviderStateMixin { + late final AnimationController controller = AnimationController(vsync: this, duration: const Duration(milliseconds: 5000)); + late final Animation animation = controller.drive(Tween(begin: 0.0, end: 1.0)); + + @override + void initState() { + super.initState(); + controller.forward(from: 0.0); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: ListView( + children: [ + for (int i = 0; i < 20; i++) + FadeTransition(opacity: animation, child: Center( + child: Transform.scale(scale: 1.01, child: const ModeratelyComplexWidget()), + )) + ], + ), + ), + ); + } +} + +class ModeratelyComplexWidget extends StatelessWidget { + const ModeratelyComplexWidget({ super.key }); + + @override + Widget build(BuildContext context) { + return const Material( + elevation: 10, + clipBehavior: Clip.hardEdge, + child: ListTile( + leading: Icon(Icons.abc, size: 24), + title: DecoratedBox(decoration: BoxDecoration(color: Colors.red), child: Text('Hello World')), + trailing: FlutterLogo(), + ), + ); + } +} diff --git a/dev/devicelab/bin/tasks/animated_complex_opacity_perf__e2e_summary.dart b/dev/devicelab/bin/tasks/animated_complex_opacity_perf__e2e_summary.dart new file mode 100644 index 0000000000000..64f073714bde0 --- /dev/null +++ b/dev/devicelab/bin/tasks/animated_complex_opacity_perf__e2e_summary.dart @@ -0,0 +1,14 @@ +// 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. + +import 'dart:async'; + +import 'package:flutter_devicelab/framework/devices.dart'; +import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/perf_tests.dart'; + +Future main() async { + deviceOperatingSystem = DeviceOperatingSystem.android; + await task(createAnimatedComplexOpacityPerfE2ETest()); +} diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index a004d8580d8d5..5618cc84613a7 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart @@ -577,6 +577,13 @@ TaskFunction createGradientStaticPerfE2ETest() { ).run; } +TaskFunction createAnimatedComplexOpacityPerfE2ETest() { + return PerfTest.e2e( + '${flutterDirectory.path}/dev/benchmarks/macrobenchmarks', + 'test/animated_complex_opacity_perf_e2e.dart', + ).run; +} + Map _average(List> results, int iterations) { final Map tally = {}; for (final Map item in results) { From 2381657394ae95d56bebf121759694d9a0ae258c Mon Sep 17 00:00:00 2001 From: xubaolin Date: Tue, 26 Apr 2022 09:24:07 +0800 Subject: [PATCH 076/108] Fix a `Slider` widget accessibility bug (#102129) --- .../lib/src/material/range_slider.dart | 9 ++- packages/flutter/lib/src/material/slider.dart | 5 +- .../test/material/range_slider_test.dart | 59 ++++++++++++++++++ .../flutter/test/material/slider_test.dart | 60 +++++++++++++++++++ 4 files changed, 126 insertions(+), 7 deletions(-) diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart index eff3119b3e87b..bb86fde4859cf 100644 --- a/packages/flutter/lib/src/material/range_slider.dart +++ b/packages/flutter/lib/src/material/range_slider.dart @@ -285,7 +285,9 @@ class RangeSlider extends StatefulWidget { /// If null, the slider is continuous. final int? divisions; - /// Labels to show as text in the [SliderThemeData.rangeValueIndicatorShape]. + /// Labels to show as text in the [SliderThemeData.rangeValueIndicatorShape] + /// when the slider is active and [SliderThemeData.showValueIndicator] + /// is satisfied. /// /// There are two labels: one for the start thumb and one for the end thumb. /// @@ -1491,7 +1493,6 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix double value, double increasedValue, double decreasedValue, - String? label, VoidCallback increaseAction, VoidCallback decreaseAction, ) { @@ -1503,7 +1504,7 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix config.onIncrease = increaseAction; config.onDecrease = decreaseAction; } - config.label = label ?? ''; + if (semanticFormatterCallback != null) { config.value = semanticFormatterCallback!(_state._lerp(value)); config.increasedValue = semanticFormatterCallback!(_state._lerp(increasedValue)); @@ -1529,7 +1530,6 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix values.start, _increasedStartValue, _decreasedStartValue, - labels?.start, _increaseStartAction, _decreaseStartAction, ); @@ -1537,7 +1537,6 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix values.end, _increasedEndValue, _decreasedEndValue, - labels?.end, _increaseEndAction, _decreaseEndAction, ); diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index 3110d05c3f5b6..5cb0ee675dc42 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -317,7 +317,8 @@ class Slider extends StatefulWidget { /// If null, the slider is continuous. final int? divisions; - /// A label to show above the slider when the slider is active. + /// A label to show above the slider when the slider is active and + /// [SliderThemeData.showValueIndicator] is satisfied. /// /// It is used to display the value of a discrete slider, and it is displayed /// as part of the value indicator shape. @@ -1506,7 +1507,7 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin { config.onIncrease = increaseAction; config.onDecrease = decreaseAction; } - config.label = _label ?? ''; + if (semanticFormatterCallback != null) { config.value = semanticFormatterCallback!(_state._lerp(value)); config.increasedValue = semanticFormatterCallback!(_state._lerp((value + _semanticActionUnit).clamp(0.0, 1.0))); diff --git a/packages/flutter/test/material/range_slider_test.dart b/packages/flutter/test/material/range_slider_test.dart index 621c3da740c7c..6e8595bf0d87e 100644 --- a/packages/flutter/test/material/range_slider_test.dart +++ b/packages/flutter/test/material/range_slider_test.dart @@ -1681,6 +1681,65 @@ void main() { ); }); + // Regression test for https://github.com/flutter/flutter/issues/101868 + testWidgets('RangeSlider.label info should not write to semantic node', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Theme( + data: ThemeData.light(), + child: Directionality( + textDirection: TextDirection.ltr, + child: Material( + child: RangeSlider( + values: const RangeValues(10.0, 12.0), + max: 100.0, + onChanged: (RangeValues v) { }, + labels: const RangeLabels('Begin', 'End'), + ), + ), + ), + ), + ), + ); + + await tester.pumpAndSettle(); + + expect( + tester.getSemantics(find.byType(RangeSlider)), + matchesSemantics( + scopesRoute: true, + children:[ + matchesSemantics( + children: [ + matchesSemantics( + isEnabled: true, + isSlider: true, + hasEnabledState: true, + hasIncreaseAction: true, + hasDecreaseAction: true, + value: '10%', + increasedValue: '10%', + decreasedValue: '5%', + label: '' + ), + matchesSemantics( + isEnabled: true, + isSlider: true, + hasEnabledState: true, + hasIncreaseAction: true, + hasDecreaseAction: true, + value: '12%', + increasedValue: '17%', + decreasedValue: '12%', + label: '' + ), + ], + ), + ], + ), + ); + }); + testWidgets('Range Slider Semantics', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart index 354ddde960265..543831055c32f 100644 --- a/packages/flutter/test/material/slider_test.dart +++ b/packages/flutter/test/material/slider_test.dart @@ -1816,6 +1816,66 @@ void main() { semantics.dispose(); }); + // Regression test for https://github.com/flutter/flutter/issues/101868 + testWidgets('Slider.label info should not write to semantic node', (WidgetTester tester) async { + final SemanticsTester semantics = SemanticsTester(tester); + + await tester.pumpWidget(MaterialApp( + home: Directionality( + textDirection: TextDirection.ltr, + child: Material( + child: Slider( + value: 40.0, + max: 200.0, + divisions: 10, + semanticFormatterCallback: (double value) => value.round().toString(), + onChanged: (double v) { }, + label: 'Bingo', + ), + ), + ), + )); + + expect( + semantics, + hasSemantics( + TestSemantics.root( + children: [ + TestSemantics( + id: 1, + textDirection: TextDirection.ltr, + children: [ + TestSemantics( + id: 2, + children: [ + TestSemantics( + id: 3, + flags: [SemanticsFlag.scopesRoute], + children: [ + TestSemantics( + id: 4, + flags: [SemanticsFlag.hasEnabledState, SemanticsFlag.isEnabled, SemanticsFlag.isFocusable, SemanticsFlag.isSlider], + actions: [SemanticsAction.increase, SemanticsAction.decrease], + value: '40', + increasedValue: '60', + decreasedValue: '20', + textDirection: TextDirection.ltr, + ), + ], + ), + ], + ), + ], + ), + ], + ), + ignoreRect: true, + ignoreTransform: true, + ), + ); + semantics.dispose(); + }); + testWidgets('Slider is focusable and has correct focus color', (WidgetTester tester) async { final FocusNode focusNode = FocusNode(debugLabel: 'Slider'); tester.binding.focusManager.highlightStrategy = FocusHighlightStrategy.alwaysTraditional; From fa96ddd42789cf42ea1aa9c2f3635e32b505fd78 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 25 Apr 2022 21:39:07 -0700 Subject: [PATCH 077/108] add missing benchmark test file fromhttps://github.com/flutter/flutter/pull/102532 (#102544) --- .../test/animated_complex_opacity_perf_e2e.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 dev/benchmarks/macrobenchmarks/test/animated_complex_opacity_perf_e2e.dart diff --git a/dev/benchmarks/macrobenchmarks/test/animated_complex_opacity_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/animated_complex_opacity_perf_e2e.dart new file mode 100644 index 0000000000000..cd6e4f92f5c77 --- /dev/null +++ b/dev/benchmarks/macrobenchmarks/test/animated_complex_opacity_perf_e2e.dart @@ -0,0 +1,16 @@ +// 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. + +import 'package:macrobenchmarks/common.dart'; + +import 'util.dart'; + +void main() { + macroPerfTestE2E( + 'animated_complex_opacity_perf', + kAnimatedComplexOpacityPerfRouteName, + pageDelay: const Duration(seconds: 1), + duration: const Duration(seconds: 5), + ); +} From de6689aaa32ec32d738884850d0df6caab1290cf Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 01:02:38 -0400 Subject: [PATCH 078/108] Roll Engine from 4df9cf27052b to 79152137a94c (8 revisions) (#102551) * b2ca1ce53 [web] Migrate Flutter Web to JS static interop - 14. (flutter/engine#32683) * d3886d6c5 Roll Fuchsia Linux SDK from MbA1RtjV4... to YyokSAVV4... (flutter/engine#32907) * 0aca7c0a1 Roll Skia from 4f33f5bef8eb to f8e52b27aa70 (4 revisions) (flutter/engine#32911) * ccf075470 Roll Skia from f8e52b27aa70 to 74742130b08d (2 revisions) (flutter/engine#32913) * a2d8df99e Roll Skia from 74742130b08d to 82146a7fcde2 (1 revision) (flutter/engine#32914) * 1e19613db Roll Fuchsia Mac SDK from JVNKiIJWP... to Jki3kG8_P... (flutter/engine#32916) * 65bc7e348 Roll Dart SDK from 865c2ff0940e to e89b629ed91d (1 revision) (flutter/engine#32917) * 79152137a Revert "[web] Migrate Flutter Web to JS static interop - 14. (#32683)" (flutter/engine#32919) * Add impellerc to conductor codesigning list * Update coductor codesigning for libtessellator.dylib Co-authored-by: Zachary Anderson --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- dev/conductor/core/lib/src/codesign.dart | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 3648a52ab4f87..648830f1b1802 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -4df9cf27052bbb6c6acdeab17db1bac0bf79a372 +79152137a94cf2c0efd84d783531c8b3839593c3 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 0d44851a49b42..8fe2d423b387a 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -MbA1RtjV4CJorJFQIR2Ueo6zQWyA00GExqKIWj3bYcEC +YyokSAVV4CDbCsZkAKj1Qiony-m4sjI-Pvwb1wX18ZkC diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index d4df5be730842..1bcedb32f599e 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -JVNKiIJWP2nsg080g4dtv3nbXCEU_BKeBv23bgWC9IUC +Jki3kG8_PI7MxcaiJMq3S_hlIs_wVuqBMOWOnuEHaw0C diff --git a/dev/conductor/core/lib/src/codesign.dart b/dev/conductor/core/lib/src/codesign.dart index 271a5bcd1823c..32b3b7f0efe36 100644 --- a/dev/conductor/core/lib/src/codesign.dart +++ b/dev/conductor/core/lib/src/codesign.dart @@ -189,6 +189,8 @@ class CodesignCommand extends Command { 'artifacts/engine/darwin-x64-release/FlutterMacOS.framework/Versions/A/FlutterMacOS', 'artifacts/engine/darwin-x64/FlutterMacOS.framework/Versions/A/FlutterMacOS', 'artifacts/engine/darwin-x64/font-subset', + 'artifacts/engine/darwin-x64/impellerc', + 'artifacts/engine/darwin-x64/libtessellator.dylib', 'artifacts/engine/ios-profile/Flutter.xcframework/ios-arm64/Flutter.framework/Flutter', 'artifacts/engine/ios-profile/Flutter.xcframework/ios-arm64_x86_64-simulator/Flutter.framework/Flutter', 'artifacts/engine/ios-release/Flutter.xcframework/ios-arm64/Flutter.framework/Flutter', From 719a3816b172adf3304878ecd14df0f38c03b4a8 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 02:09:07 -0400 Subject: [PATCH 079/108] Roll Engine from 79152137a94c to df21738974e3 (1 revision) (#102553) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 648830f1b1802..5ebbd77102d6b 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -79152137a94cf2c0efd84d783531c8b3839593c3 +df21738974e335897a23a764b992b14a1fc13766 From c593903eee813d57d2a6138043d83dd6238d1244 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 03:14:06 -0400 Subject: [PATCH 080/108] Roll Engine from df21738974e3 to 8aace64d19fc (1 revision) (#102555) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 5ebbd77102d6b..b9b5db1343a2c 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -df21738974e335897a23a764b992b14a1fc13766 +8aace64d19fcf6330ceccdc6f4a2a2726064c47a From 646b910c9cefa394dd1e906444ed1cbb75255b08 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 05:14:04 -0400 Subject: [PATCH 081/108] Roll Engine from 8aace64d19fc to cd78221a88ae (1 revision) (#102562) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index b9b5db1343a2c..d13baebf32373 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -8aace64d19fcf6330ceccdc6f4a2a2726064c47a +cd78221a88ae704ae94323344cc793d6ecc20e9c From bc7d3bbc65b3786800d1a8ad137d80e1bd7e3fd7 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Tue, 26 Apr 2022 11:24:05 +0200 Subject: [PATCH 082/108] Fix DraggableScrollableController.animateTo leaks Ticker (#102504) --- .../src/widgets/draggable_scrollable_sheet.dart | 17 +++++++++++++++++ .../draggable_scrollable_sheet_test.dart | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart b/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart index 0ccae36798f3d..a53437444a3ca 100644 --- a/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart +++ b/packages/flutter/lib/src/widgets/draggable_scrollable_sheet.dart @@ -52,6 +52,7 @@ typedef ScrollableWidgetBuilder = Widget Function( /// constraints provided to an attached sheet change. class DraggableScrollableController extends ChangeNotifier { _DraggableScrollableSheetScrollController? _attachedController; + final Set _animationControllers = {}; /// Get the current size (as a fraction of the parent height) of the attached sheet. double get size { @@ -115,6 +116,7 @@ class DraggableScrollableController extends ChangeNotifier { vsync: _attachedController!.position.context.vsync, value: _attachedController!.extent.currentSize, ); + _animationControllers.add(animationController); _attachedController!.position.goIdle(); // This disables any snapping until the next user interaction with the sheet. _attachedController!.extent.hasDragged = false; @@ -175,6 +177,7 @@ class DraggableScrollableController extends ChangeNotifier { assert(_attachedController == null, 'Draggable scrollable controller is already attached to a sheet.'); _attachedController = scrollController; _attachedController!.extent._currentSize.addListener(notifyListeners); + _attachedController!.onPositionDetached = _disposeAnimationControllers; } void _onExtentReplaced(_DraggableSheetExtent previousExtent) { @@ -193,6 +196,13 @@ class DraggableScrollableController extends ChangeNotifier { _attachedController?.extent._currentSize.removeListener(notifyListeners); _attachedController = null; } + + void _disposeAnimationControllers() { + for (final AnimationController animationController in _animationControllers) { + animationController.dispose(); + } + _animationControllers.clear(); + } } /// A container for a [Scrollable] that responds to drag gestures by resizing @@ -724,6 +734,7 @@ class _DraggableScrollableSheetScrollController extends ScrollController { }) : assert(extent != null); _DraggableSheetExtent extent; + VoidCallback? onPositionDetached; @override _DraggableScrollableSheetScrollPosition createScrollPosition( @@ -764,6 +775,12 @@ class _DraggableScrollableSheetScrollController extends ScrollController { } extent.updateSize(extent.initialSize, position.context.notificationContext!); } + + @override + void detach(ScrollPosition position) { + onPositionDetached?.call(); + super.detach(position); + } } /// A scroll position that manages scroll activities for diff --git a/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart b/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart index bfd65190b9dc9..28375d25328c2 100644 --- a/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart +++ b/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart @@ -1209,4 +1209,19 @@ void main() { expect(controller.isAttached, true); expect(controller.size, isNotNull); }); + + testWidgets('DraggableScrollableController.animateTo should not leak Ticker', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/102483 + final DraggableScrollableController controller = DraggableScrollableController(); + await tester.pumpWidget(_boilerplate(() {}, controller: controller)); + + controller.animateTo(0.0, curve: Curves.linear, duration: const Duration(milliseconds: 200)); + await tester.pump(); + + // Dispose the DraggableScrollableSheet + await tester.pumpWidget(const SizedBox.shrink()); + // Controller should be detached and no exception should be thrown + expect(controller.isAttached, false); + expect(tester.takeException(), isNull); + }); } From 34d84209cf7ece5fb82ac6a114f86a2291754824 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 26 Apr 2022 08:44:09 -0700 Subject: [PATCH 083/108] Avoid scheduling a forced frame when there is no child to the renderView (#102556) --- .../flutter/lib/src/rendering/binding.dart | 5 ++++- .../flutter/test/rendering/binding_test.dart | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 packages/flutter/test/rendering/binding_test.dart diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index 2e59a4055faf2..ed1a0e28f5dd0 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -235,10 +235,13 @@ mixin RendererBinding on BindingBase, ServicesBinding, SchedulerBinding, Gesture /// /// See [dart:ui.PlatformDispatcher.onMetricsChanged]. @protected + @visibleForTesting void handleMetricsChanged() { assert(renderView != null); renderView.configuration = createViewConfiguration(); - scheduleForcedFrame(); + if (renderView.child != null) { + scheduleForcedFrame(); + } } /// Called when the platform text scale factor changes. diff --git a/packages/flutter/test/rendering/binding_test.dart b/packages/flutter/test/rendering/binding_test.dart new file mode 100644 index 0000000000000..c10df12b05f41 --- /dev/null +++ b/packages/flutter/test/rendering/binding_test.dart @@ -0,0 +1,22 @@ +// 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. + +import 'package:flutter/rendering.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + test('handleMetricsChanged does not scheduleForcedFrame unless there is a child to the renderView', () async { + expect(SchedulerBinding.instance.hasScheduledFrame, false); + RendererBinding.instance.handleMetricsChanged(); + expect(SchedulerBinding.instance.hasScheduledFrame, false); + + RendererBinding.instance.renderView.child = RenderLimitedBox(); + RendererBinding.instance.handleMetricsChanged(); + expect(SchedulerBinding.instance.hasScheduledFrame, true); + }); +} From 14c5787cc3e9d1c30064009e3945b2b95742c11f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 12:14:05 -0400 Subject: [PATCH 084/108] Roll Engine from cd78221a88ae to 6d60b810d747 (1 revision) (#102575) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index d13baebf32373..9bf7bbe047aee 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -cd78221a88ae704ae94323344cc793d6ecc20e9c +6d60b810d74766f533640f11a57843135cf55b14 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 8fe2d423b387a..7099c48b4dcac 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -YyokSAVV4CDbCsZkAKj1Qiony-m4sjI-Pvwb1wX18ZkC +GPkj69-XiXEkbjYX9L7LD42YJVhQq51Tlt8Fjs3GXtsC From 61bbaaa44a1aed51c3dbf1ccf36b21dcdb6cf30a Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 12:19:08 -0400 Subject: [PATCH 085/108] Roll Plugins from 4ff0157340ea to e55659835427 (1 revision) (#102576) --- bin/internal/flutter_plugins.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/flutter_plugins.version b/bin/internal/flutter_plugins.version index 8fcea5085fea7..14e754218556d 100644 --- a/bin/internal/flutter_plugins.version +++ b/bin/internal/flutter_plugins.version @@ -1 +1 @@ -4ff0157340ea1874ca753bf921807e62c1943099 +e55659835427fdc2b3c838548ce7e49267f100fd From 0cb5772e73cb7641c77ddbb5662333d43b02ef9c Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Apr 2022 10:19:09 -0700 Subject: [PATCH 086/108] [framework] allow other RenderObjects to behave like repaint boundaries (#101952) --- .../flutter/lib/src/rendering/object.dart | 205 +++++++++++-- .../flutter/lib/src/rendering/proxy_box.dart | 64 ++-- packages/flutter/lib/src/widgets/heroes.dart | 8 +- .../flutter/test/rendering/debug_test.dart | 3 +- .../test/rendering/proxy_box_test.dart | 207 +++++++++++++ .../animated_opacity_repaint_test.dart | 90 ++++++ .../test/widgets/opacity_repaint_test.dart | 275 ++++++++++++++++++ 7 files changed, 794 insertions(+), 58 deletions(-) create mode 100644 packages/flutter/test/widgets/animated_opacity_repaint_test.dart create mode 100644 packages/flutter/test/widgets/opacity_repaint_test.dart diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 50ad60b44da61..c517ae1a64c61 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -121,22 +121,38 @@ class PaintingContext extends ClipContext { if (childLayer == null) { assert(debugAlsoPaintedParent); assert(child._layerHandle.layer == null); + // Not using the `layer` setter because the setter asserts that we not // replace the layer for repaint boundaries. That assertion does not // apply here because this is exactly the place designed to create a // layer for repaint boundaries. - final OffsetLayer layer = OffsetLayer(); + final OffsetLayer layer = child.updateCompositedLayer(oldLayer: null); child._layerHandle.layer = childLayer = layer; } else { assert(debugAlsoPaintedParent || childLayer.attached); + Offset? debugOldOffset; + assert(() { + debugOldOffset = childLayer!.offset; + return true; + }()); childLayer.removeAllChildren(); + final OffsetLayer updatedLayer = child.updateCompositedLayer(oldLayer: childLayer); + assert(identical(updatedLayer, childLayer), + '$child created a new layer instance $updatedLayer instead of reusing the ' + 'existing layer $childLayer. See the documentation of RenderObject.updateCompositedLayer ' + 'for more information on how to correctly implement this method.' + ); + assert(debugOldOffset == updatedLayer.offset); } + child._needsCompositedLayerUpdate = false; + assert(identical(childLayer, child._layerHandle.layer)); assert(child._layerHandle.layer is OffsetLayer); assert(() { childLayer!.debugCreator = child.debugCreator ?? child.runtimeType; return true; }()); + childContext ??= PaintingContext(childLayer, child.paintBounds); child._paintWithContext(childContext, Offset.zero); @@ -146,6 +162,38 @@ class PaintingContext extends ClipContext { childContext.stopRecordingIfNeeded(); } + /// Update the composited layer of [child] without repainting its children. + /// + /// The render object must be attached to a [PipelineOwner], must have a + /// composited layer, and must be in need of a composited layer update but + /// not in need of painting. The render object's layer is re-used, and none + /// of its children are repaint or their layers updated. + /// + /// See also: + /// + /// * [RenderObject.isRepaintBoundary], which determines if a [RenderObject] + /// has a composited layer. + static void updateLayerProperties(RenderObject child) { + assert(child.isRepaintBoundary && child._wasRepaintBoundary); + assert(!child._needsPaint); + assert(child._layerHandle.layer != null); + + final OffsetLayer childLayer = child._layerHandle.layer! as OffsetLayer; + Offset? debugOldOffset; + assert(() { + debugOldOffset = childLayer.offset; + return true; + }()); + final OffsetLayer updatedLayer = child.updateCompositedLayer(oldLayer: childLayer); + assert(identical(updatedLayer, childLayer), + '$child created a new layer instance $updatedLayer instead of reusing the ' + 'existing layer $childLayer. See the documentation of RenderObject.updateCompositedLayer ' + 'for more information on how to correctly implement this method.' + ); + assert(debugOldOffset == updatedLayer.offset); + child._needsCompositedLayerUpdate = false; + } + /// In debug mode, repaint the given render object using a custom painting /// context that can record the results of the painting operation in addition /// to performing the regular paint of the child. @@ -183,6 +231,12 @@ class PaintingContext extends ClipContext { if (child.isRepaintBoundary) { stopRecordingIfNeeded(); _compositeChild(child, offset); + // If a render object was a repaint boundary but no longer is one, this + // is where the framework managed layer is automatically disposed. + } else if (child._wasRepaintBoundary) { + assert(child._layerHandle.layer is OffsetLayer); + child._layerHandle.layer = null; + child._paintWithContext(this, offset); } else { child._paintWithContext(this, offset); } @@ -194,9 +248,12 @@ class PaintingContext extends ClipContext { assert(_canvas == null || _canvas!.getSaveCount() == 1); // Create a layer for our child, and paint the child into it. - if (child._needsPaint) { + if (child._needsPaint || !child._wasRepaintBoundary) { repaintCompositedChild(child, debugAlsoPaintedParent: true); } else { + if (child._needsCompositedLayerUpdate) { + updateLayerProperties(child); + } assert(() { // register the call for RepaintBoundary metrics child.debugRegisterRepaintBoundaryPaint(); @@ -978,19 +1035,25 @@ class PipelineOwner { arguments: debugTimelineArguments, ); } - assert(() { - _debugDoingPaint = true; - return true; - }()); try { + assert(() { + _debugDoingPaint = true; + return true; + }()); final List dirtyNodes = _nodesNeedingPaint; _nodesNeedingPaint = []; + // Sort the dirty nodes in reverse order (deepest first). for (final RenderObject node in dirtyNodes..sort((RenderObject a, RenderObject b) => b.depth - a.depth)) { assert(node._layerHandle.layer != null); - if (node._needsPaint && node.owner == this) { + if ((node._needsPaint || node._needsCompositedLayerUpdate) && node.owner == this) { if (node._layerHandle.layer!.attached) { - PaintingContext.repaintCompositedChild(node); + assert(node.isRepaintBoundary); + if (node._needsPaint) { + PaintingContext.repaintCompositedChild(node); + } else { + PaintingContext.updateLayerProperties(node); + } } else { node._skippedPaintingOnLayer(); } @@ -1236,6 +1299,7 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im /// Initializes internal fields for subclasses. RenderObject() { _needsCompositing = isRepaintBoundary || alwaysNeedsCompositing; + _wasRepaintBoundary = isRepaintBoundary; } /// Cause the entire subtree rooted at the given [RenderObject] to be marked @@ -2070,12 +2134,13 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im /// to repaint. /// /// If this getter returns true, the [paintBounds] are applied to this object - /// and all descendants. The framework automatically creates an [OffsetLayer] - /// and assigns it to the [layer] field. Render objects that declare - /// themselves as repaint boundaries must not replace the layer created by - /// the framework. + /// and all descendants. The framework invokes [RenderObject.updateCompositedLayer] + /// to create an [OffsetLayer] and assigns it to the [layer] field. + /// Render objects that declare themselves as repaint boundaries must not replace + /// the layer created by the framework. /// - /// Warning: This getter must not change value over the lifetime of this object. + /// If the value of this getter changes, [markNeedsCompositingBitsUpdate] must + /// be called. /// /// See [RepaintBoundary] for more information about how repaint boundaries function. bool get isRepaintBoundary => false; @@ -2098,6 +2163,34 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im @protected bool get alwaysNeedsCompositing => false; + late bool _wasRepaintBoundary; + + /// Update the composited layer owned by this render object. + /// + /// This method is called by the framework when [isRepaintBoundary] is true. + /// + /// If [oldLayer] is `null`, this method must return a new [OffsetLayer] + /// (or subtype thereof). If [oldLayer] is not `null`, then this method must + /// reuse the layer instance that is provided - it is an error to create a new + /// layer in this instance. The layer will be disposed by the framework when + /// either the render object is disposed or if it is no longer a repaint + /// boundary. + /// + /// The [OffsetLayer.offset] property will be managed by the framework and + /// must not be updated by this method. + /// + /// If a property of the composited layer needs to be updated, the render object + /// must call [markNeedsCompositedLayerUpdate] which will schedule this method + /// to be called without repainting children. If this widget was marked as + /// needing to paint and needing a composited layer update, this method is only + /// called once. + // TODO(jonahwilliams): https://github.com/flutter/flutter/issues/102102 revisit the + // contraint that the instance/type of layer cannot be changed at runtime. + OffsetLayer updateCompositedLayer({required covariant OffsetLayer? oldLayer}) { + assert(isRepaintBoundary); + return oldLayer ?? OffsetLayer(); + } + /// The compositing layer that this render object uses to repaint. /// /// If this render object is not a repaint boundary, it is the responsibility @@ -2184,7 +2277,8 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im final RenderObject parent = this.parent! as RenderObject; if (parent._needsCompositingBitsUpdate) return; - if (!isRepaintBoundary && !parent.isRepaintBoundary) { + + if ((!_wasRepaintBoundary || !isRepaintBoundary) && !parent.isRepaintBoundary) { parent.markNeedsCompositingBitsUpdate(); return; } @@ -2225,9 +2319,23 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im }); if (isRepaintBoundary || alwaysNeedsCompositing) _needsCompositing = true; - if (oldNeedsCompositing != _needsCompositing) + // If a node was previously a repaint boundary, but no longer is one, then + // regardless of its compositing state we need to find a new parent to + // paint from. To do this, we mark it clean again so that the traversal + // in markNeedsPaint is not short-circuited. It is removed from _nodesNeedingPaint + // so that we do not attempt to paint from it after locating a parent. + if (!isRepaintBoundary && _wasRepaintBoundary) { + _needsPaint = false; + _needsCompositedLayerUpdate = false; + owner?._nodesNeedingPaint.remove(this); + _needsCompositingBitsUpdate = false; + markNeedsPaint(); + } else if (oldNeedsCompositing != _needsCompositing) { + _needsCompositingBitsUpdate = false; markNeedsPaint(); - _needsCompositingBitsUpdate = false; + } else { + _needsCompositingBitsUpdate = false; + } } /// Whether this render object's paint information is dirty. @@ -2254,6 +2362,24 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im } bool _needsPaint = true; + /// Whether this render object's layer information is dirty. + /// + /// This is only set in debug mode. In general, render objects should not need + /// to condition their runtime behavior on whether they are dirty or not, + /// since they should only be marked dirty immediately prior to being laid + /// out and painted. (In release builds, this throws.) + /// + /// It is intended to be used by tests and asserts. + bool get debugNeedsCompositedLayerUpdate { + late bool result; + assert(() { + result = _needsCompositedLayerUpdate; + return true; + }()); + return result; + } + bool _needsCompositedLayerUpdate = false; + /// Mark this render object as having changed its visual appearance. /// /// Rather than eagerly updating this render object's display list @@ -2280,7 +2406,9 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im if (_needsPaint) return; _needsPaint = true; - if (isRepaintBoundary) { + // If this was not previously a repaint boundary it will not have + // a layer we can paint from. + if (isRepaintBoundary && _wasRepaintBoundary) { assert(() { if (debugPrintMarkNeedsPaintStacks) debugPrintStack(label: 'markNeedsPaint() called for $this'); @@ -2312,6 +2440,45 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im } } + /// Mark this render object as having changed a property on its composited + /// layer. + /// + /// Render objects that have a composited layer have [isRepaintBoundary] equal + /// to true may update the properties of that composited layer without repainting + /// their children. If this render object is a repaint boundary but does + /// not yet have a composited layer created for it, this method will instead + /// mark the nearest repaint boundary parent as needing to be painted. + /// + /// If this method is called on a render object that is not a repaint boundary + /// or is a repaint boundary but hasn't been composited yet, it is equivalent + /// to calling [markNeedsPaint]. + /// + /// See also: + /// + /// * [RenderOpacity], which uses this method when its opacity is updated to + /// update the layer opacity without repainting children. + void markNeedsCompositedLayerUpdate() { + assert(!_debugDisposed); + assert(owner == null || !owner!.debugDoingPaint); + if (_needsCompositedLayerUpdate || _needsPaint) { + return; + } + _needsCompositedLayerUpdate = true; + // If this was not previously a repaint boundary it will not have + // a layer we can paint from. + if (isRepaintBoundary && _wasRepaintBoundary) { + // If we always have our own layer, then we can just repaint + // ourselves without involving any other nodes. + assert(_layerHandle.layer != null); + if (owner != null) { + owner!._nodesNeedingPaint.add(this); + owner!.requestVisualUpdate(); + } + } else { + markNeedsPaint(); + } + } + // Called when flushPaint() tries to make us paint but our layer is detached. // To make sure that our subtree is repainted when it's finally reattached, // even in the case where some ancestor layer is itself never marked dirty, we @@ -2320,7 +2487,7 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im void _skippedPaintingOnLayer() { assert(attached); assert(isRepaintBoundary); - assert(_needsPaint); + assert(_needsPaint || _needsCompositedLayerUpdate); assert(_layerHandle.layer != null); assert(!_layerHandle.layer!.attached); AbstractNode? node = parent; @@ -2475,6 +2642,8 @@ abstract class RenderObject extends AbstractNode with DiagnosticableTreeMixin im return true; }()); _needsPaint = false; + _needsCompositedLayerUpdate = false; + _wasRepaintBoundary = isRepaintBoundary; try { paint(context, offset); assert(!_needsLayout); // check that the paint() method didn't mark us dirty again diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 2b62dafa78d2c..7e45a9d82d606 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -843,7 +843,14 @@ class RenderOpacity extends RenderProxyBox { super(child); @override - bool get alwaysNeedsCompositing => child != null && (_alpha > 0); + bool get isRepaintBoundary => child != null && (_alpha > 0); + + @override + OffsetLayer updateCompositedLayer({required covariant OpacityLayer? oldLayer}) { + final OpacityLayer updatedLayer = oldLayer ?? OpacityLayer(); + updatedLayer.alpha = _alpha; + return updatedLayer; + } int _alpha; @@ -864,13 +871,13 @@ class RenderOpacity extends RenderProxyBox { assert(value >= 0.0 && value <= 1.0); if (_opacity == value) return; - final bool didNeedCompositing = alwaysNeedsCompositing; + final bool wasRepaintBoundary = isRepaintBoundary; final bool wasVisible = _alpha != 0; _opacity = value; _alpha = ui.Color.getAlphaFromOpacity(_opacity); - if (didNeedCompositing != alwaysNeedsCompositing) + if (wasRepaintBoundary != isRepaintBoundary) markNeedsCompositingBitsUpdate(); - markNeedsPaint(); + markNeedsCompositedLayerUpdate(); if (wasVisible != (_alpha != 0) && !alwaysIncludeSemantics) markNeedsSemanticsUpdate(); } @@ -891,19 +898,10 @@ class RenderOpacity extends RenderProxyBox { @override void paint(PaintingContext context, Offset offset) { - if (child != null) { - if (_alpha == 0) { - // No need to keep the layer. We'll create a new one if necessary. - layer = null; - return; - } - assert(needsCompositing); - layer = context.pushOpacity(offset, _alpha, super.paint, oldLayer: layer as OpacityLayer?); - assert(() { - layer!.debugCreator = debugCreator; - return true; - }()); + if (_alpha == 0) { + return; } + super.paint(context, offset); } @override @@ -929,8 +927,15 @@ mixin RenderAnimatedOpacityMixin on RenderObjectWithChil int? _alpha; @override - bool get alwaysNeedsCompositing => child != null && _currentlyNeedsCompositing!; - bool? _currentlyNeedsCompositing; + bool get isRepaintBoundary => child != null && _currentlyIsRepaintBoundary!; + bool? _currentlyIsRepaintBoundary; + + @override + OffsetLayer updateCompositedLayer({required covariant OpacityLayer? oldLayer}) { + final OpacityLayer updatedLayer = oldLayer ?? OpacityLayer(); + updatedLayer.alpha = _alpha; + return updatedLayer; + } /// The animation that drives this render object's opacity. /// @@ -990,11 +995,11 @@ mixin RenderAnimatedOpacityMixin on RenderObjectWithChil final int? oldAlpha = _alpha; _alpha = ui.Color.getAlphaFromOpacity(opacity.value); if (oldAlpha != _alpha) { - final bool? didNeedCompositing = _currentlyNeedsCompositing; - _currentlyNeedsCompositing = _alpha! > 0; - if (child != null && didNeedCompositing != _currentlyNeedsCompositing) + final bool? wasRepaintBoundary = _currentlyIsRepaintBoundary; + _currentlyIsRepaintBoundary = _alpha! > 0; + if (child != null && wasRepaintBoundary != _currentlyIsRepaintBoundary) markNeedsCompositingBitsUpdate(); - markNeedsPaint(); + markNeedsCompositedLayerUpdate(); if (oldAlpha == 0 || _alpha == 0) markNeedsSemanticsUpdate(); } @@ -1002,19 +1007,10 @@ mixin RenderAnimatedOpacityMixin on RenderObjectWithChil @override void paint(PaintingContext context, Offset offset) { - if (child != null) { - if (_alpha == 0) { - // No need to keep the layer. We'll create a new one if necessary. - layer = null; - return; - } - assert(needsCompositing); - layer = context.pushOpacity(offset, _alpha!, super.paint, oldLayer: layer as OpacityLayer?); - assert(() { - layer!.debugCreator = debugCreator; - return true; - }()); + if (_alpha == 0) { + return; } + super.paint(context, offset); } @override diff --git a/packages/flutter/lib/src/widgets/heroes.dart b/packages/flutter/lib/src/widgets/heroes.dart index 8cb222f24fe99..253a487ba1a88 100644 --- a/packages/flutter/lib/src/widgets/heroes.dart +++ b/packages/flutter/lib/src/widgets/heroes.dart @@ -545,11 +545,9 @@ class _HeroFlight { bottom: offsets.bottom, left: offsets.left, child: IgnorePointer( - child: RepaintBoundary( - child: FadeTransition( - opacity: _heroOpacity, - child: child, - ), + child: FadeTransition( + opacity: _heroOpacity, + child: child, ), ), ); diff --git a/packages/flutter/test/rendering/debug_test.dart b/packages/flutter/test/rendering/debug_test.dart index 87c69d7f5e4f7..b31703e6c5e0f 100644 --- a/packages/flutter/test/rendering/debug_test.dart +++ b/packages/flutter/test/rendering/debug_test.dart @@ -231,7 +231,8 @@ void main() { rootLayer, const Rect.fromLTWH(0, 0, 500, 500), ); - root.paint(context, const Offset(40, 40)); + context.paintChild(root, const Offset(40, 40)); + final OpacityLayer opacityLayer = rootLayer.firstChild! as OpacityLayer; expect(opacityLayer.offset, const Offset(40, 40)); debugDisableOpacityLayers = false; diff --git a/packages/flutter/test/rendering/proxy_box_test.dart b/packages/flutter/test/rendering/proxy_box_test.dart index 28b1a0fb640fb..70dfff9df4cff 100644 --- a/packages/flutter/test/rendering/proxy_box_test.dart +++ b/packages/flutter/test/rendering/proxy_box_test.dart @@ -561,6 +561,178 @@ void main() { // The follower is still hit testable because there is a leader layer. expect(follower.hitTest(hitTestResult, position: Offset.zero), isTrue); }); + + test('RenderObject can become a repaint boundary', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + + renderBox.isRepaintBoundary = true; + renderBox.markNeedsCompositingBitsUpdate(); + renderBox.markNeedsCompositedLayerUpdate(); + + pumpFrame(phase: EnginePhase.composite); + + // The first time the render object becomes a repaint boundary + // we must repaint from the parent to allow the layer to be + // created. + expect(childBox.paintCount, 2); + expect(renderBox.paintCount, 2); + expect(renderBox.debugLayer, isA()); + + renderBox.markNeedsCompositedLayerUpdate(); + expect(renderBox.debugNeedsPaint, false); + expect(renderBox.debugNeedsCompositedLayerUpdate, true); + + pumpFrame(phase: EnginePhase.composite); + + // The second time the layer exists and we can skip paint. + expect(childBox.paintCount, 2); + expect(renderBox.paintCount, 2); + expect(renderBox.debugLayer, isA()); + + renderBox.isRepaintBoundary = false; + renderBox.markNeedsCompositingBitsUpdate(); + + pumpFrame(phase: EnginePhase.composite); + + // Once it stops being a repaint boundary we must repaint to + // remove the layer. its required that the render object + // perform this action in paint. + expect(childBox.paintCount, 3); + expect(renderBox.paintCount, 3); + expect(renderBox.debugLayer, null); + + // When the render object is not a repaint boundary, calling + // markNeedsLayerPropertyUpdate is the same as calling + // markNeedsPaint. + + renderBox.markNeedsCompositedLayerUpdate(); + expect(renderBox.debugNeedsPaint, true); + expect(renderBox.debugNeedsCompositedLayerUpdate, true); + }); + + test('RenderObject with repaint boundary asserts when a composited layer is replaced during layer property update', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return TestOffsetLayerA(); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + + renderBox.markNeedsCompositedLayerUpdate(); + + pumpFrame(phase: EnginePhase.composite, onErrors: expectAssertionError); + }, skip: kIsWeb); // https://github.com/flutter/flutter/issues/102086 + + test('RenderObject with repaint boundary asserts when a composited layer is replaced during painting', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return TestOffsetLayerA(); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + renderBox.markNeedsPaint(); + + pumpFrame(phase: EnginePhase.composite, onErrors: expectAssertionError); + }, skip: kIsWeb); // https://github.com/flutter/flutter/issues/102086 + + test('RenderObject with repaint boundary asserts when a composited layer tries to update its own offset', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return (oldLayer ?? TestOffsetLayerA())..offset = const Offset(2133, 4422); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + renderBox.markNeedsPaint(); + + pumpFrame(phase: EnginePhase.composite, onErrors: expectAssertionError); + }, skip: kIsWeb); // https://github.com/flutter/flutter/issues/102086 + + test('RenderObject markNeedsPaint while repaint boundary, and then updated to no longer be a repaint boundary with ' + 'calling markNeedsCompositingBitsUpdate 1', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return oldLayer ?? TestOffsetLayerA(); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + + childBox.markNeedsPaint(); + childBox.isRepaintBoundary = false; + childBox.markNeedsCompositingBitsUpdate(); + + expect(() => pumpFrame(phase: EnginePhase.composite), returnsNormally); + }); + + test('RenderObject markNeedsPaint while repaint boundary, and then updated to no longer be a repaint boundary with ' + 'calling markNeedsCompositingBitsUpdate 2', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return oldLayer ?? TestOffsetLayerA(); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + + childBox.isRepaintBoundary = false; + childBox.markNeedsCompositingBitsUpdate(); + childBox.markNeedsPaint(); + + expect(() => pumpFrame(phase: EnginePhase.composite), returnsNormally); + }); + + test('RenderObject markNeedsPaint while repaint boundary, and then updated to no longer be a repaint boundary with ' + 'calling markNeedsCompositingBitsUpdate 3', () { + final ConditionalRepaintBoundary childBox = ConditionalRepaintBoundary(isRepaintBoundary: true); + final ConditionalRepaintBoundary renderBox = ConditionalRepaintBoundary(child: childBox); + // Ignore old layer. + childBox.offsetLayerFactory = (OffsetLayer? oldLayer) { + return oldLayer ?? TestOffsetLayerA(); + }; + + layout(renderBox, phase: EnginePhase.composite); + + expect(childBox.paintCount, 1); + expect(renderBox.paintCount, 1); + + childBox.isRepaintBoundary = false; + childBox.markNeedsCompositedLayerUpdate(); + childBox.markNeedsCompositingBitsUpdate(); + + expect(() => pumpFrame(phase: EnginePhase.composite), returnsNormally); + }); } class _TestRectClipper extends CustomClipper { @@ -631,3 +803,38 @@ class _TestSemanticsUpdateRenderFractionalTranslation extends RenderFractionalTr super.markNeedsSemanticsUpdate(); } } + +class ConditionalRepaintBoundary extends RenderProxyBox { + ConditionalRepaintBoundary({this.isRepaintBoundary = false, RenderBox? child}) : super(child); + + @override + bool isRepaintBoundary = false; + + OffsetLayer Function(OffsetLayer?)? offsetLayerFactory; + + int paintCount = 0; + + @override + OffsetLayer updateCompositedLayer({required covariant OffsetLayer? oldLayer}) { + if (offsetLayerFactory != null) { + return offsetLayerFactory!.call(oldLayer); + } + return super.updateCompositedLayer(oldLayer: oldLayer); + } + + @override + void paint(PaintingContext context, Offset offset) { + paintCount += 1; + super.paint(context, offset); + } +} + +class TestOffsetLayerA extends OffsetLayer {} + +void expectAssertionError() { + final FlutterErrorDetails errorDetails = TestRenderingFlutterBinding.instance.takeFlutterErrorDetails()!; + final bool asserted = errorDetails.toString().contains('Failed assertion'); + if (!asserted) { + FlutterError.reportError(errorDetails); + } +} diff --git a/packages/flutter/test/widgets/animated_opacity_repaint_test.dart b/packages/flutter/test/widgets/animated_opacity_repaint_test.dart new file mode 100644 index 0000000000000..664a118df256a --- /dev/null +++ b/packages/flutter/test/widgets/animated_opacity_repaint_test.dart @@ -0,0 +1,90 @@ +// 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. + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('RenderAnimatedOpacityMixin avoids repainting child as it animates', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + final AnimationController controller = AnimationController(vsync: const TestVSync(), duration: const Duration(seconds: 1)); + final Tween opacityTween = Tween(begin: 0, end: 1); + await tester.pumpWidget( + Container( + color: Colors.red, + child: FadeTransition( + opacity: controller.drive(opacityTween), + child: const TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 0); + controller.forward(); + + await tester.pump(); + await tester.pump(const Duration(milliseconds: 500)); + + expect(RenderTestObject.paintCount, 1); + + await tester.pump(); + await tester.pump(const Duration(milliseconds: 500)); + + expect(RenderTestObject.paintCount, 1); + + controller.stop(); + await tester.pump(); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderAnimatedOpacityMixin allows opacity layer to be disposed when animating to 0 opacity', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + final AnimationController controller = AnimationController(vsync: const TestVSync(), duration: const Duration(seconds: 1)); + final Tween opacityTween = Tween(begin: 1, end: 0); + await tester.pumpWidget( + Container( + color: Colors.red, + child: FadeTransition( + opacity: controller.drive(opacityTween), + child: const TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + expect(tester.layers, contains(isA())); + controller.forward(); + + await tester.pump(); + await tester.pump(const Duration(seconds: 2)); + + expect(RenderTestObject.paintCount, 1); + + controller.stop(); + await tester.pump(); + + expect(tester.layers, isNot(contains(isA()))); + }); +} + +class TestWidget extends SingleChildRenderObjectWidget { + const TestWidget({super.key, super.child}); + + @override + RenderObject createRenderObject(BuildContext context) { + return RenderTestObject(); + } +} + +class RenderTestObject extends RenderProxyBox { + static int paintCount = 0; + + @override + void paint(PaintingContext context, Offset offset) { + paintCount += 1; + super.paint(context, offset); + } +} diff --git a/packages/flutter/test/widgets/opacity_repaint_test.dart b/packages/flutter/test/widgets/opacity_repaint_test.dart new file mode 100644 index 0000000000000..00ca2964d3ea7 --- /dev/null +++ b/packages/flutter/test/widgets/opacity_repaint_test.dart @@ -0,0 +1,275 @@ +// 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. + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('RenderOpacity acts as a repaint boundary for changes above the widget when partially opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity acts as a repaint boundary for changes above the widget when fully opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 1, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 1, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity can update its opacity without repainting its child - partially opaque to partially opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0.9, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity can update its opacity without repainting its child - partially opaque to fully opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 1, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity can update its opacity without repainting its child - fully opaque to partially opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 1, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity can update its opacity without repainting its child - fully opaque to fully transparent', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 1, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity must paint child - fully transparent to partially opaque', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 0, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 0); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity allows child to update without updating parent', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + TestWidget( + child: Opacity( + opacity: 0.5, + child: Container( + color: Colors.red, + ), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + + await tester.pumpWidget( + TestWidget( + child: Opacity( + opacity: 0.5, + child: Container( + color: Colors.blue, + ), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + }); + + testWidgets('RenderOpacity disposes of opacity layer when opacity is updated to 0', (WidgetTester tester) async { + RenderTestObject.paintCount = 0; + await tester.pumpWidget( + Container( + color: Colors.red, + child: const Opacity( + opacity: 0.5, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + expect(tester.layers, contains(isA())); + + await tester.pumpWidget( + Container( + color: Colors.blue, + child: const Opacity( + opacity: 0, + child: TestWidget(), + ), + ) + ); + + expect(RenderTestObject.paintCount, 1); + expect(tester.layers, isNot(contains(isA()))); + }); +} + +class TestWidget extends SingleChildRenderObjectWidget { + const TestWidget({super.key, super.child}); + + @override + RenderObject createRenderObject(BuildContext context) { + return RenderTestObject(); + } +} + +class RenderTestObject extends RenderProxyBox { + static int paintCount = 0; + + @override + void paint(PaintingContext context, Offset offset) { + paintCount += 1; + super.paint(context, offset); + } +} From 6132b86d240055cacd842dc8961bf272bfaf1cc0 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 13:24:07 -0400 Subject: [PATCH 087/108] Roll Engine from 6d60b810d747 to d5b381c2e56d (1 revision) (#102581) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 9bf7bbe047aee..0fd5076e42244 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -6d60b810d74766f533640f11a57843135cf55b14 +d5b381c2e56d76ff56f4fcd4d53c84325c186182 From a75743e80ed4d8c4791178772be5f155f20d8bce Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Tue, 26 Apr 2022 13:14:06 -0500 Subject: [PATCH 088/108] Revert "Re-land reverse case for AppBar scrolled under" (#102580) --- .../flutter/lib/src/material/app_bar.dart | 34 +- .../widgets/scroll_notification_observer.dart | 32 +- .../flutter/test/material/app_bar_test.dart | 706 +++++++----------- .../flutter/test/material/debug_test.dart | 1 - .../flutter/test/material/scaffold_test.dart | 1 - 5 files changed, 295 insertions(+), 479 deletions(-) diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 045d9d8325ac4..39c7bd39c339c 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -767,33 +767,17 @@ class _AppBarState extends State { } void _handleScrollNotification(ScrollNotification notification) { - final bool oldScrolledUnder = _scrolledUnder; - final ScrollMetrics metrics = notification.metrics; - - if (notification.depth != 0) { - _scrolledUnder = false; - } else { - switch (metrics.axisDirection) { - case AxisDirection.up: - // Scroll view is reversed - _scrolledUnder = metrics.extentAfter > 0; - break; - case AxisDirection.down: - _scrolledUnder = metrics.extentBefore > 0; - break; - case AxisDirection.right: - case AxisDirection.left: - // Scrolled under is only supported in the vertical axis. - _scrolledUnder = false; - break; + if (notification is ScrollUpdateNotification) { + final bool oldScrolledUnder = _scrolledUnder; + _scrolledUnder = notification.depth == 0 + && notification.metrics.extentBefore > 0 + && notification.metrics.axis == Axis.vertical; + if (_scrolledUnder != oldScrolledUnder) { + setState(() { + // React to a change in MaterialState.scrolledUnder + }); } } - - if (_scrolledUnder != oldScrolledUnder) { - setState(() { - // React to a change in MaterialState.scrolledUnder - }); - } } Color _resolveColor(Set states, Color? widgetColor, Color? themeColor, Color defaultColor) { diff --git a/packages/flutter/lib/src/widgets/scroll_notification_observer.dart b/packages/flutter/lib/src/widgets/scroll_notification_observer.dart index 6fa7ffaa15b7c..bc151190f1d5d 100644 --- a/packages/flutter/lib/src/widgets/scroll_notification_observer.dart +++ b/packages/flutter/lib/src/widgets/scroll_notification_observer.dart @@ -9,7 +9,6 @@ import 'package:flutter/foundation.dart'; import 'framework.dart'; import 'notification_listener.dart'; import 'scroll_notification.dart'; -import 'scroll_position.dart'; /// A [ScrollNotification] listener for [ScrollNotificationObserver]. /// @@ -152,26 +151,14 @@ class ScrollNotificationObserverState extends State @override Widget build(BuildContext context) { - // A ScrollMetricsNotification allows listeners to be notified for an - // initial state, as well as if the content dimensions change without - // scrolling. - return NotificationListener( - onNotification: (ScrollMetricsNotification notification) { - _notifyListeners(_ConvertedScrollMetricsNotification( - metrics: notification.metrics, - context: notification.context, - )); + return NotificationListener( + onNotification: (ScrollNotification notification) { + _notifyListeners(notification); return false; }, - child: NotificationListener( - onNotification: (ScrollNotification notification) { - _notifyListeners(notification); - return false; - }, - child: _ScrollNotificationObserverScope( - scrollNotificationObserverState: this, - child: widget.child, - ), + child: _ScrollNotificationObserverScope( + scrollNotificationObserverState: this, + child: widget.child, ), ); } @@ -183,10 +170,3 @@ class ScrollNotificationObserverState extends State super.dispose(); } } - -class _ConvertedScrollMetricsNotification extends ScrollNotification { - _ConvertedScrollMetricsNotification({ - required super.metrics, - required super.context, - }); -} diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart index 1b08520ea620f..88b6963f68aab 100644 --- a/packages/flutter/test/material/app_bar_test.dart +++ b/packages/flutter/test/material/app_bar_test.dart @@ -2567,457 +2567,311 @@ void main() { expect(actionIconTheme.color, foregroundColor); }); - group('MaterialStateColor scrolledUnder', () { + testWidgets('SliverAppBar.backgroundColor MaterialStateColor scrolledUnder', (WidgetTester tester) async { const double collapsedHeight = kToolbarHeight; const double expandedHeight = 200.0; const Color scrolledColor = Color(0xff00ff00); const Color defaultColor = Color(0xff0000ff); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; + }), + expandedHeight: expandedHeight, + pinned: true, + ), + SliverList( + delegate: SliverChildListDelegate( + [ + Container(height: 1200.0, color: Colors.teal), + ], + ), + ), + ], + ), + ), + ), + ); + Finder findAppBarMaterial() { - return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); } - Color? getAppBarBackgroundColor(WidgetTester tester) { + Color? getAppBarBackgroundColor() { return tester.widget(findAppBarMaterial()).color; } - group('SliverAppBar', () { - Widget _buildSliverApp({ - required double contentHeight, - bool reverse = false, - bool includeFlexibleSpace = false, - }) { - return MaterialApp( - home: Scaffold( - body: CustomScrollView( - reverse: reverse, - slivers: [ - SliverAppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) - ? scrolledColor - : defaultColor; - }), - expandedHeight: expandedHeight, - pinned: true, - flexibleSpace: includeFlexibleSpace - ? const FlexibleSpaceBar(title: Text('SliverAppBar')) - : null, + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('SliverAppBar.backgroundColor with FlexibleSpace MaterialStateColor scrolledUnder', (WidgetTester tester) async { + const double collapsedHeight = kToolbarHeight; + const double expandedHeight = 200.0; + const Color scrolledColor = Color(0xff00ff00); + const Color defaultColor = Color(0xff0000ff); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; + }), + expandedHeight: expandedHeight, + pinned: true, + flexibleSpace: const FlexibleSpaceBar( + title: Text('SliverAppBar'), ), - SliverList( - delegate: SliverChildListDelegate( + ), + SliverList( + delegate: SliverChildListDelegate( [ - Container(height: contentHeight, color: Colors.teal), + Container(height: 1200.0, color: Colors.teal), ], - ), ), - ], - ), + ), + ], ), - ); - } - - testWidgets('backgroundColor', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp(contentHeight: 1200.0) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp(contentHeight: 1200.0, includeFlexibleSpace: true) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('backgroundColor - reverse', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp(contentHeight: 1200.0, reverse: true) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp( - contentHeight: 1200.0, - reverse: true, - includeFlexibleSpace: true, - ) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, -expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('backgroundColor - not triggered in reverse for short content', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp(contentHeight: 200, reverse: true) - ); - - // In reverse, the content here is not long enough to scroll under the app - // bar. - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace - not triggered in reverse for short content', (WidgetTester tester) async { - await tester.pumpWidget( - _buildSliverApp( - contentHeight: 200, - reverse: true, - includeFlexibleSpace: true, - ) - ); - - // In reverse, the content here is not long enough to scroll under the app - // bar. - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - - final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, expandedHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); - }); - }); + ), + ), + ); - group('AppBar', () { - Widget _buildAppBar({ - required double contentHeight, - bool reverse = false, - bool includeFlexibleSpace = false - }) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) - ? scrolledColor - : defaultColor; - }), - title: const Text('AppBar'), - flexibleSpace: includeFlexibleSpace - ? const FlexibleSpaceBar(title: Text('FlexibleSpace')) - : null, + Finder findAppBarMaterial() { + // There are 2 Material widgets below AppBar. The second is only added if + // flexibleSpace is non-null. + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; + } + + Color? getAppBarBackgroundColor() { + return tester.widget(findAppBarMaterial()).color; + } + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, collapsedHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, expandedHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, expandedHeight); + }); + + testWidgets('AppBar.backgroundColor MaterialStateColor scrolledUnder', (WidgetTester tester) async { + const Color scrolledColor = Color(0xff00ff00); + const Color defaultColor = Color(0xff0000ff); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; + }), + title: const Text('AppBar'), + ), + body: ListView( + children: [ + Container(height: 1200.0, color: Colors.teal), + ], + ), + ), + ), + ); + + Finder findAppBarMaterial() { + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); + } + + Color? getAppBarBackgroundColor() { + return tester.widget(findAppBarMaterial()).color; + } + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('AppBar.backgroundColor with FlexibleSpace MaterialStateColor scrolledUnder', (WidgetTester tester) async { + const Color scrolledColor = Color(0xff00ff00); + const Color defaultColor = Color(0xff0000ff); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; + }), + title: const Text('AppBar'), + flexibleSpace: const FlexibleSpaceBar( + title: Text('FlexibleSpace'), ), - body: ListView( - reverse: reverse, + ), + body: ListView( + children: [ + Container(height: 1200.0, color: Colors.teal), + ], + ), + ), + ), + ); + + Finder findAppBarMaterial() { + // There are 2 Material widgets below AppBar. The second is only added if + // flexibleSpace is non-null. + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)).first; + } + + Color? getAppBarBackgroundColor() { + return tester.widget(findAppBarMaterial()).color; + } + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), scrolledColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + + gesture = await tester.startGesture(const Offset(50.0, 300.0)); + await gesture.moveBy(const Offset(0.0, kToolbarHeight)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); + expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); + }); + + testWidgets('AppBar._handleScrollNotification safely calls setState()', (WidgetTester tester) async { + // Regression test for failures found in Google internal issue b/185192049. + final ScrollController controller = ScrollController(initialScrollOffset: 400); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('AppBar'), + ), + body: Scrollbar( + isAlwaysShown: true, + controller: controller, + child: ListView( + controller: controller, children: [ - Container(height: contentHeight, color: Colors.teal), + Container(height: 1200.0, color: Colors.teal), ], ), ), - ); - } - - testWidgets('backgroundColor', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar(contentHeight: 1200.0) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar(contentHeight: 1200.0, includeFlexibleSpace: true) - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('backgroundColor - reverse', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar(contentHeight: 1200.0, reverse: true) - ); - await tester.pump(); - - // In this test case, the content always extends under the AppBar, so it - // should always be the scrolledColor. - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace - reverse', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar( - contentHeight: 1200.0, - reverse: true, - includeFlexibleSpace: true, - ) - ); - await tester.pump(); - - // In this test case, the content always extends under the AppBar, so it - // should always be the scrolledColor. - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - gesture = await tester.startGesture(const Offset(50.0, 300.0)); - await gesture.moveBy(const Offset(0.0, -kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), scrolledColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('_handleScrollNotification safely calls setState()', (WidgetTester tester) async { - // Regression test for failures found in Google internal issue b/185192049. - final ScrollController controller = ScrollController(initialScrollOffset: 400); - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('AppBar'), - ), - body: Scrollbar( - isAlwaysShown: true, - controller: controller, - child: ListView( - controller: controller, - children: [ - Container(height: 1200.0, color: Colors.teal), - ], - ), - ), - ), - ), - ); + ), + ), + ); - expect(tester.takeException(), isNull); - }); + expect(tester.takeException(), isNull); + }); - testWidgets('does not trigger on horizontal scroll', (WidgetTester tester) async { - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: MaterialStateColor.resolveWith((Set states) { - return states.contains(MaterialState.scrolledUnder) - ? scrolledColor - : defaultColor; - }), - title: const Text('AppBar'), - ), - body: ListView( - scrollDirection: Axis.horizontal, - children: [ - Container(height: 600.0, width: 1200.0, color: Colors.teal), - ], - ), - ), + testWidgets('AppBar scrolledUnder does not trigger on horizontal scroll', (WidgetTester tester) async { + const Color scrolledColor = Color(0xff00ff00); + const Color defaultColor = Color(0xff0000ff); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: MaterialStateColor.resolveWith((Set states) { + return states.contains(MaterialState.scrolledUnder) ? scrolledColor : defaultColor; + }), + title: const Text('AppBar'), ), - ); - - expect(getAppBarBackgroundColor(tester), defaultColor); - - TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(-100.0, 0.0)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - - gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(100.0, 0.0)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - }); - - testWidgets('backgroundColor - not triggered in reverse for short content', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar( - contentHeight: 200.0, - reverse: true, - ) - ); - await tester.pump(); - - // In reverse, the content here is not long enough to scroll under the app - // bar. - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - - testWidgets('backgroundColor with FlexibleSpace - not triggered in reverse for short content', (WidgetTester tester) async { - await tester.pumpWidget( - _buildAppBar( - contentHeight: 200.0, - reverse: true, - includeFlexibleSpace: true, - ) - ); - await tester.pump(); - - // In reverse, the content here is not long enough to scroll under the app - // bar. - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - - final TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); - await gesture.moveBy(const Offset(0.0, kToolbarHeight)); - await gesture.up(); - await tester.pumpAndSettle(); - - expect(getAppBarBackgroundColor(tester), defaultColor); - expect(tester.getSize(findAppBarMaterial()).height, kToolbarHeight); - }); - }); + body: ListView( + scrollDirection: Axis.horizontal, + children: [ + Container(height: 600.0, width: 1200.0, color: Colors.teal), + ], + ), + ), + ), + ); + + Finder findAppBarMaterial() { + return find.descendant(of: find.byType(AppBar), matching: find.byType(Material)); + } + + Color? getAppBarBackgroundColor() { + return tester.widget(findAppBarMaterial()).color; + } + + expect(getAppBarBackgroundColor(), defaultColor); + + TestGesture gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(-100.0, 0.0)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); + + gesture = await tester.startGesture(const Offset(50.0, 400.0)); + await gesture.moveBy(const Offset(100.0, 0.0)); + await gesture.up(); + await tester.pumpAndSettle(); + + expect(getAppBarBackgroundColor(), defaultColor); }); testWidgets('AppBar.preferredHeightFor', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/debug_test.dart b/packages/flutter/test/material/debug_test.dart index 21492e972bc01..46f9e61b37fd9 100644 --- a/packages/flutter/test/material/debug_test.dart +++ b/packages/flutter/test/material/debug_test.dart @@ -349,7 +349,6 @@ void main() { ' Material\n' ' _ScrollNotificationObserverScope\n' ' NotificationListener\n' - ' NotificationListener\n' ' ScrollNotificationObserver\n' ' _ScaffoldScope\n' ' Scaffold-[LabeledGlobalKey#00000]\n' diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 7aeee33dc42ec..3a10ba8c08fb3 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -2339,7 +2339,6 @@ void main() { ' Material\n' ' _ScrollNotificationObserverScope\n' ' NotificationListener\n' - ' NotificationListener\n' ' ScrollNotificationObserver\n' ' _ScaffoldScope\n' ' Scaffold\n' From 944fcda67f294981dfe2b57991c32afc724f34c2 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Apr 2022 11:19:07 -0700 Subject: [PATCH 089/108] [flutter_tools] remove UWP tooling (#102174) --- .../flutter_tools/bin/getaumidfromname.ps1 | 13 - packages/flutter_tools/bin/tool_backend.dart | 3 +- .../lib/src/android/android_device.dart | 2 - packages/flutter_tools/lib/src/artifacts.dart | 40 +- .../flutter_tools/lib/src/base/build.dart | 1 - .../flutter_tools/lib/src/build_info.dart | 12 - .../lib/src/build_system/targets/common.dart | 1 - .../lib/src/build_system/targets/windows.dart | 207 +--------- packages/flutter_tools/lib/src/cache.dart | 4 - .../flutter_tools/lib/src/cmake_project.dart | 44 -- .../lib/src/commands/assemble.dart | 4 - .../flutter_tools/lib/src/commands/build.dart | 2 - .../lib/src/commands/build_bundle.dart | 1 - .../lib/src/commands/build_winuwp.dart | 62 --- .../lib/src/commands/create.dart | 1 - .../lib/src/commands/create_base.dart | 13 - .../lib/src/commands/precache.dart | 2 - .../flutter_tools/lib/src/context_runner.dart | 6 - packages/flutter_tools/lib/src/features.dart | 14 - .../lib/src/flutter_application_package.dart | 2 - .../flutter_tools/lib/src/flutter_cache.dart | 35 -- .../lib/src/flutter_device_manager.dart | 5 +- .../lib/src/flutter_features.dart | 3 - .../lib/src/flutter_plugins.dart | 30 -- .../flutter_tools/lib/src/mdns_discovery.dart | 1 - .../lib/src/platform_plugins.dart | 4 - packages/flutter_tools/lib/src/project.dart | 13 - .../lib/src/resident_runner.dart | 1 - .../lib/src/runner/flutter_command.dart | 4 - .../lib/src/runner/local_engine.dart | 4 - .../flutter_tools/lib/src/sksl_writer.dart | 1 - packages/flutter_tools/lib/src/template.dart | 5 - .../lib/src/windows/application_package.dart | 11 - .../lib/src/windows/build_windows.dart | 130 ------ .../lib/src/windows/install_manifest.dart | 50 --- .../lib/src/windows/uwptool.dart | 161 -------- .../lib/src/windows/windows_device.dart | 347 +--------------- .../templates/app/winuwp.tmpl/.gitignore | 17 - .../winuwp.tmpl/CMakeLists.txt.tmpl | 64 --- .../winuwp.tmpl/flutter/CMakeLists.txt | 92 ----- .../app_shared/winuwp.tmpl/project_version | 1 - .../Assets/LargeTile.scale-100.png.img.tmpl | 0 .../Assets/LargeTile.scale-125.png.img.tmpl | 0 .../Assets/LargeTile.scale-150.png.img.tmpl | 0 .../Assets/LargeTile.scale-200.png.img.tmpl | 0 .../Assets/LargeTile.scale-400.png.img.tmpl | 0 .../LockScreenLogo.scale-200.png.img.tmpl | 0 .../Assets/SmallTile.scale-100.png.img.tmpl | 0 .../Assets/SmallTile.scale-125.png.img.tmpl | 0 .../Assets/SmallTile.scale-150.png.img.tmpl | 0 .../Assets/SmallTile.scale-200.png.img.tmpl | 0 .../Assets/SmallTile.scale-400.png.img.tmpl | 0 .../SplashScreen.scale-100.png.img.tmpl | 0 .../SplashScreen.scale-125.png.img.tmpl | 0 .../SplashScreen.scale-150.png.img.tmpl | 0 .../SplashScreen.scale-200.png.img.tmpl | 0 .../SplashScreen.scale-400.png.img.tmpl | 0 .../Square150x150Logo.scale-100.png.img.tmpl | 0 .../Square150x150Logo.scale-125.png.img.tmpl | 0 .../Square150x150Logo.scale-150.png.img.tmpl | 0 .../Square150x150Logo.scale-200.png.img.tmpl | 0 .../Square150x150Logo.scale-400.png.img.tmpl | 0 ...ltform-unplated_targetsize-16.png.img.tmpl | 0 ...tform-unplated_targetsize-256.png.img.tmpl | 0 ...ltform-unplated_targetsize-32.png.img.tmpl | 0 ...ltform-unplated_targetsize-48.png.img.tmpl | 0 .../Square44x44Logo.scale-100.png.img.tmpl | 0 .../Square44x44Logo.scale-125.png.img.tmpl | 0 .../Square44x44Logo.scale-150.png.img.tmpl | 0 .../Square44x44Logo.scale-200.png.img.tmpl | 0 .../Square44x44Logo.scale-400.png.img.tmpl | 0 ...Square44x44Logo.targetsize-16.png.img.tmpl | 0 ...Square44x44Logo.targetsize-24.png.img.tmpl | 0 ...argetsize-24_altform-unplated.png.img.tmpl | 0 ...quare44x44Logo.targetsize-256.png.img.tmpl | 0 ...Square44x44Logo.targetsize-32.png.img.tmpl | 0 ...Square44x44Logo.targetsize-48.png.img.tmpl | 0 .../runner_uwp/Assets/StoreLogo.png.img.tmpl | 0 .../Assets/StoreLogo.scale-100.png.img.tmpl | 0 .../Assets/StoreLogo.scale-125.png.img.tmpl | 0 .../Assets/StoreLogo.scale-150.png.img.tmpl | 0 .../Assets/StoreLogo.scale-200.png.img.tmpl | 0 .../Assets/StoreLogo.scale-400.png.img.tmpl | 0 .../Wide310x150Logo.scale-200.png.img.tmpl | 0 .../Assets/WideTile.scale-100.png.img.tmpl | 0 .../Assets/WideTile.scale-125.png.img.tmpl | 0 .../Assets/WideTile.scale-150.png.img.tmpl | 0 .../Assets/WideTile.scale-200.png.img.tmpl | 0 .../Assets/WideTile.scale-400.png.img.tmpl | 0 .../runner_uwp/CMakeLists.txt.tmpl | 141 ------- .../winuwp.tmpl/runner_uwp/CMakeSettings.json | 27 -- .../Windows_TemporaryKey.pfx.img.tmpl | 0 .../winuwp.tmpl/runner_uwp/appxmanifest.in | 42 -- .../runner_uwp/flutter_frameworkview.cpp | 155 ------- .../winuwp.tmpl/runner_uwp/main.cpp | 30 -- .../runner_uwp/resources.pri.img.tmpl | 0 .../templates/template_manifest.json | 59 --- .../hermetic/build_windows_test.dart | 146 +------ .../commands.shard/permeable/create_test.dart | 30 -- .../test/general.shard/artifacts_test.dart | 26 -- .../targets/dart_plugin_registrant_test.dart | 1 - .../build_system/targets/windows_test.dart | 159 +------ .../test/general.shard/cache_test.dart | 14 - .../test/general.shard/dart_plugin_test.dart | 3 - .../test/general.shard/features_test.dart | 32 -- .../general.shard/plugin_parsing_test.dart | 11 +- .../test/general.shard/plugins_test.dart | 3 - .../runner/local_engine_test.dart | 25 -- .../windows/install_manifest_test.dart | 144 ------- .../general.shard/windows/plugins_test.dart | 87 ---- .../general.shard/windows/project_test.dart | 138 ------- .../windows/windows_device_test.dart | 387 ------------------ packages/flutter_tools/test/src/fakes.dart | 6 - 113 files changed, 19 insertions(+), 3060 deletions(-) delete mode 100644 packages/flutter_tools/bin/getaumidfromname.ps1 delete mode 100644 packages/flutter_tools/lib/src/commands/build_winuwp.dart delete mode 100644 packages/flutter_tools/lib/src/windows/install_manifest.dart delete mode 100644 packages/flutter_tools/lib/src/windows/uwptool.dart delete mode 100644 packages/flutter_tools/templates/app/winuwp.tmpl/.gitignore delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/CMakeLists.txt.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/flutter/CMakeLists.txt delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/project_version delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeLists.txt.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeSettings.json delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx.img.tmpl delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/appxmanifest.in delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/flutter_frameworkview.cpp delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/main.cpp delete mode 100644 packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri.img.tmpl delete mode 100644 packages/flutter_tools/test/general.shard/windows/install_manifest_test.dart delete mode 100644 packages/flutter_tools/test/general.shard/windows/project_test.dart diff --git a/packages/flutter_tools/bin/getaumidfromname.ps1 b/packages/flutter_tools/bin/getaumidfromname.ps1 deleted file mode 100644 index d5873e33e812a..0000000000000 --- a/packages/flutter_tools/bin/getaumidfromname.ps1 +++ /dev/null @@ -1,13 +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. - -# Retrieves the AMUID from a given application name -[CmdletBinding()] -param( - [Parameter()] - [string]$Name -) -$foo = get-appxpackage | Where-Object { $_.Name -like $name } -$aumid = $foo.packagefamilyname + "!" + (Get-AppxPackageManifest $foo).package.applications.application.id -Write-Output $aumid diff --git a/packages/flutter_tools/bin/tool_backend.dart b/packages/flutter_tools/bin/tool_backend.dart index 754df1ac1d41e..5b4b66585356a 100644 --- a/packages/flutter_tools/bin/tool_backend.dart +++ b/packages/flutter_tools/bin/tool_backend.dart @@ -61,9 +61,8 @@ or else 'flutter' ]); - final bool uwp = targetPlatform.contains('uwp'); final String bundlePlatform = targetPlatform.startsWith('windows') ? 'windows' : targetPlatform; - final String target = '${buildMode}_bundle_${bundlePlatform}_assets${uwp ? '_uwp' : ''}'; + final String target = '${buildMode}_bundle_${bundlePlatform}_assets'; final Process assembleProcess = await Process.start( flutterExecutable, [ diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index 3a750cafdb4a6..49345ccea72a5 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -227,7 +227,6 @@ class AndroidDevice extends Device { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: throw UnsupportedError('Invalid target platform for Android'); } @@ -565,7 +564,6 @@ class AndroidDevice extends Device { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: _logger.printError('Android platforms are only supported.'); return LaunchResult.failed(); diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index 2aac9686e822d..b53bca9ca5860 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -38,10 +38,7 @@ enum Artifact { windowsDesktopPath, /// The root of the cpp client code for Windows desktop. windowsCppClientWrapper, - /// The root of the cpp client code for Windows UWP desktop. - windowsUwpCppClientWrapper, - /// The root of the Windows UWP desktop sources. - windowsUwpDesktopPath, + /// The root of the sky_engine package. skyEnginePath, /// The location of the macOS engine podspec file. @@ -54,9 +51,6 @@ enum Artifact { /// Tools related to subsetting or icon font files. fontSubset, constFinder, - - // Windows UWP app management tool. - uwptool, } /// A subset of [Artifact]s that are platform and build mode independent @@ -120,7 +114,6 @@ TargetPlatform? _mapTargetPlatform(TargetPlatform? targetPlatform) { case TargetPlatform.linux_x64: case TargetPlatform.linux_arm64: case TargetPlatform.windows_x64: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_x64: case TargetPlatform.tester: @@ -137,7 +130,6 @@ TargetPlatform? _mapTargetPlatform(TargetPlatform? targetPlatform) { bool _isWindows(TargetPlatform? platform) { switch (platform) { case TargetPlatform.windows_x64: - case TargetPlatform.windows_uwp_x64: return true; case TargetPlatform.android: case TargetPlatform.android_arm: @@ -190,9 +182,7 @@ String? _artifactToFileName(Artifact artifact, [ TargetPlatform? platform, Build case Artifact.linuxHeaders: return 'flutter_linux'; case Artifact.windowsCppClientWrapper: - case Artifact.windowsUwpCppClientWrapper: return 'cpp_client_wrapper'; - case Artifact.windowsUwpDesktopPath: case Artifact.windowsDesktopPath: return ''; case Artifact.skyEnginePath: @@ -209,8 +199,6 @@ String? _artifactToFileName(Artifact artifact, [ TargetPlatform? platform, Build return 'font-subset$exe'; case Artifact.constFinder: return 'const_finder.dart.snapshot'; - case Artifact.uwptool: - return 'uwptool$exe'; } } @@ -431,7 +419,6 @@ class CachedArtifacts implements Artifacts { case TargetPlatform.linux_x64: case TargetPlatform.linux_arm64: case TargetPlatform.windows_x64: - case TargetPlatform.windows_uwp_x64: return _getDesktopArtifactPath(artifact, platform, mode); case TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_x64: @@ -483,12 +470,9 @@ class CachedArtifacts implements Artifacts { case Artifact.platformKernelDill: case Artifact.platformLibrariesJson: case Artifact.skyEnginePath: - case Artifact.uwptool: case Artifact.vmSnapshotData: case Artifact.windowsCppClientWrapper: case Artifact.windowsDesktopPath: - case Artifact.windowsUwpCppClientWrapper: - case Artifact.windowsUwpDesktopPath: return _getHostArtifactPath(artifact, platform, mode); } } @@ -519,12 +503,9 @@ class CachedArtifacts implements Artifacts { case Artifact.platformKernelDill: case Artifact.platformLibrariesJson: case Artifact.skyEnginePath: - case Artifact.uwptool: case Artifact.vmSnapshotData: case Artifact.windowsCppClientWrapper: case Artifact.windowsDesktopPath: - case Artifact.windowsUwpCppClientWrapper: - case Artifact.windowsUwpDesktopPath: return _getHostArtifactPath(artifact, platform, mode); } } @@ -567,12 +548,9 @@ class CachedArtifacts implements Artifacts { case Artifact.linuxHeaders: case Artifact.platformLibrariesJson: case Artifact.skyEnginePath: - case Artifact.uwptool: case Artifact.vmSnapshotData: case Artifact.windowsCppClientWrapper: case Artifact.windowsDesktopPath: - case Artifact.windowsUwpCppClientWrapper: - case Artifact.windowsUwpDesktopPath: return _getHostArtifactPath(artifact, platform, mode); } } @@ -626,15 +604,9 @@ class CachedArtifacts implements Artifacts { } final String engineArtifactsPath = _cache.getArtifactDirectory('engine').path; return _fileSystem.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode)); - case Artifact.windowsUwpDesktopPath: - final String engineArtifactsPath = _cache.getArtifactDirectory('engine').path; - return _fileSystem.path.join(engineArtifactsPath, 'windows-uwp-x64-${getNameForBuildMode(mode!)}', _artifactToFileName(artifact, platform, mode)); case Artifact.windowsCppClientWrapper: final String engineArtifactsPath = _cache.getArtifactDirectory('engine').path; return _fileSystem.path.join(engineArtifactsPath, 'windows-x64', _artifactToFileName(artifact, platform, mode)); - case Artifact.windowsUwpCppClientWrapper: - final String engineArtifactsPath = _cache.getArtifactDirectory('engine').path; - return _fileSystem.path.join(engineArtifactsPath, 'windows-uwp-x64-debug', _artifactToFileName(artifact, platform, mode)); case Artifact.skyEnginePath: final Directory dartPackageDirectory = _cache.getCacheDir('pkg'); return _fileSystem.path.join(dartPackageDirectory.path, _artifactToFileName(artifact)); @@ -644,11 +616,6 @@ class CachedArtifacts implements Artifacts { .childDirectory(_enginePlatformDirectoryName(platform)) .childFile(_artifactToFileName(artifact, platform, mode)!) .path; - case Artifact.uwptool: - return _cache.getArtifactDirectory('engine') - .childDirectory('windows-uwp-x64-${getNameForBuildMode(mode ?? BuildMode.debug)}') - .childFile(_artifactToFileName(artifact, platform, mode)!) - .path; case Artifact.flutterFramework: case Artifact.flutterXcframework: case Artifact.fuchsiaFlutterRunner: @@ -684,7 +651,6 @@ class CachedArtifacts implements Artifacts { case TargetPlatform.android_arm64: case TargetPlatform.android_x64: case TargetPlatform.android_x86: - case TargetPlatform.windows_uwp_x64: assert(mode != null, 'Need to specify a build mode for platform $platform.'); final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode!), '-')}' : ''; return _fileSystem.path.join(engineDir, platformName + suffix); @@ -914,19 +880,15 @@ class CachedLocalEngineArtifacts implements LocalEngineArtifacts { return _fileSystem.path.join(_hostEngineOutPath, artifactFileName); case Artifact.constFinder: return _fileSystem.path.join(_hostEngineOutPath, 'gen', artifactFileName); - case Artifact.windowsUwpDesktopPath: case Artifact.linuxDesktopPath: case Artifact.linuxHeaders: case Artifact.windowsDesktopPath: case Artifact.windowsCppClientWrapper: - case Artifact.windowsUwpCppClientWrapper: return _fileSystem.path.join(_hostEngineOutPath, artifactFileName); case Artifact.frontendServerSnapshotForEngineDartSdk: return _fileSystem.path.join( _hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', artifactFileName, ); - case Artifact.uwptool: - return _fileSystem.path.join(_hostEngineOutPath, artifactFileName); } } diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index 79d5b6090462c..92bf17d27f8d3 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -314,7 +314,6 @@ class AOTSnapshotter { TargetPlatform.linux_x64, TargetPlatform.linux_arm64, TargetPlatform.windows_x64, - TargetPlatform.windows_uwp_x64, ].contains(platform); } } diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index c12e7c201ffb1..954e678716b10 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -527,7 +527,6 @@ enum TargetPlatform { linux_x64, linux_arm64, windows_x64, - windows_uwp_x64, fuchsia_arm64, fuchsia_x64, tester, @@ -660,8 +659,6 @@ String getNameForTargetPlatform(TargetPlatform platform, {DarwinArch? darwinArch return 'linux-arm64'; case TargetPlatform.windows_x64: return 'windows-x64'; - case TargetPlatform.windows_uwp_x64: - return 'windows-uwp-x64'; case TargetPlatform.fuchsia_arm64: return 'fuchsia-arm64'; case TargetPlatform.fuchsia_x64: @@ -705,8 +702,6 @@ TargetPlatform getTargetPlatformForName(String platform) { return TargetPlatform.linux_arm64; case 'windows-x64': return TargetPlatform.windows_x64; - case 'windows-uwp-x64': - return TargetPlatform.windows_uwp_x64; case 'web-javascript': return TargetPlatform.web_javascript; } @@ -770,7 +765,6 @@ String fuchsiaArchForTargetPlatform(TargetPlatform targetPlatform) { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: throw UnsupportedError('Unexpected Fuchsia platform $targetPlatform'); } @@ -859,11 +853,6 @@ String getWindowsBuildDirectory() { return globals.fs.path.join(getBuildDirectory(), 'windows'); } -/// Returns the Windows UWP build output directory. -String getWindowsBuildUwpDirectory() { - return globals.fs.path.join(getBuildDirectory(), 'winuwp'); -} - /// Returns the Fuchsia build output directory. String getFuchsiaBuildDirectory() { return globals.fs.path.join(getBuildDirectory(), 'fuchsia'); @@ -1030,7 +1019,6 @@ String getNameForTargetPlatformArch(TargetPlatform platform) { case TargetPlatform.ios: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: throw UnsupportedError('Unexpected target platform $platform'); } } diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart index c0e78b7398579..9c00dce02342a 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/common.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart @@ -204,7 +204,6 @@ class KernelSnapshot extends Target { case TargetPlatform.linux_arm64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: forceLinkPlatform = false; break; } diff --git a/packages/flutter_tools/lib/src/build_system/targets/windows.dart b/packages/flutter_tools/lib/src/build_system/targets/windows.dart index 4eed095b1ca09..b5f80a331e2c3 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/windows.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/windows.dart @@ -26,20 +26,7 @@ const List _kWindowsArtifacts = [ 'flutter_windows.h', ]; -const List _kWindowsUwpArtifacts = [ - 'flutter_windows_winuwp.dll', - 'flutter_windows_winuwp.dll.exp', - 'flutter_windows_winuwp.dll.lib', - 'flutter_windows_winuwp.dll.pdb', - 'flutter_export.h', - 'flutter_messenger.h', - 'flutter_plugin_registrar.h', - 'flutter_texture_registrar.h', - 'flutter_windows.h', -]; - const String _kWindowsDepfile = 'windows_engine_sources.d'; -const String _kWindowsUwpDepfile = 'windows_uwp_engine_sources.d'; /// Copies the Windows desktop embedding files to the copy directory. class UnpackWindows extends Target { @@ -111,84 +98,6 @@ class UnpackWindows extends Target { } } - -/// Copies the Windows desktop embedding files to the copy directory. -class UnpackWindowsUwp extends Target { - const UnpackWindowsUwp(); - - @override - String get name => 'unpack_windows_uwp'; - - @override - List get inputs => const [ - Source.pattern('{FLUTTER_ROOT}/packages/flutter_tools/lib/src/build_system/targets/windows.dart'), - ]; - - @override - List get outputs => const []; - - @override - List get depfiles => const [_kWindowsUwpDepfile]; - - @override - List get dependencies => const []; - - @override - Future build(Environment environment) async { - final String? buildModeEnvironment = environment.defines[kBuildMode]; - if (buildModeEnvironment == null) { - throw MissingDefineException(kBuildMode, name); - } - final BuildMode buildMode = getBuildModeForName(buildModeEnvironment); - final String engineSourcePath = environment.artifacts - .getArtifactPath( - Artifact.windowsUwpDesktopPath, - platform: TargetPlatform.windows_x64, - mode: buildMode, - ); - final String clientSourcePath = environment.artifacts - .getArtifactPath( - Artifact.windowsUwpCppClientWrapper, - platform: TargetPlatform.windows_x64, - mode: buildMode, - ); - final Directory outputDirectory = environment.fileSystem.directory( - environment.fileSystem.path.join( - environment.projectDir.path, - 'winuwp', - 'flutter', - 'ephemeral', - ), - ); - final Depfile depfile = unpackDesktopArtifacts( - fileSystem: environment.fileSystem, - artifacts: _kWindowsUwpArtifacts, - engineSourcePath: engineSourcePath, - outputDirectory: outputDirectory, - clientSourcePaths: [clientSourcePath], - icuDataPath: environment.artifacts.getArtifactPath( - Artifact.icuData, - platform: TargetPlatform.windows_x64 - ) - ); - // Copy flutter_windows.h into flutter directory as well. - final File flutterWindows = outputDirectory.childFile('flutter_windows.h'); - final File flutterWindowsDest = flutterWindows.parent.parent.childFile('flutter_windows.h'); - flutterWindows.copySync(flutterWindowsDest.path); - depfile.outputs.add(flutterWindowsDest); - // - - final DepfileService depfileService = DepfileService( - fileSystem: environment.fileSystem, - logger: environment.logger, - ); - depfileService.writeToFile( - depfile, - environment.buildDir.childFile(_kWindowsUwpDepfile), - ); - } -} - /// Creates a bundle for the Windows desktop target. abstract class BundleWindowsAssets extends Target { const BundleWindowsAssets(); @@ -245,31 +154,16 @@ abstract class BundleWindowsAssets extends Target { } } - -/// Creates a bundle for the Windows desktop target. -abstract class BundleWindowsAssetsUwp extends BundleWindowsAssets { - const BundleWindowsAssetsUwp(); - - @override - List get dependencies => const [ - KernelSnapshot(), - UnpackWindowsUwp(), - ]; -} - /// A wrapper for AOT compilation that copies app.so into the output directory. class WindowsAotBundle extends Target { /// Create a [WindowsAotBundle] wrapper for [aotTarget]. - const WindowsAotBundle(this.aotTarget, {required this.uwp}); + const WindowsAotBundle(this.aotTarget); /// The [AotElfBase] subclass that produces the app.so. final AotElfBase aotTarget; - /// Whether this is the UWP target. - final bool uwp; - @override - String get name => uwp ? 'windows_uwp_aot_bundle' : 'windows_aot_bundle'; + String get name => 'windows_aot_bundle'; @override List get inputs => const [ @@ -277,10 +171,7 @@ class WindowsAotBundle extends Target { ]; @override - List get outputs => uwp ? - const [ - Source.pattern('{OUTPUT_DIR}/winuwp/app.so'), - ] : + List get outputs => const [ Source.pattern('{OUTPUT_DIR}/windows/app.so'), ]; @@ -293,44 +184,7 @@ class WindowsAotBundle extends Target { @override Future build(Environment environment) async { final File outputFile = environment.buildDir.childFile('app.so'); - final Directory outputDirectory = environment.outputDir.childDirectory(uwp ? 'winuwp' : 'windows'); - if (!outputDirectory.existsSync()) { - outputDirectory.createSync(recursive: true); - } - outputFile.copySync(outputDirectory.childFile('app.so').path); - } -} - -/// A wrapper for AOT compilation that copies app.so into the output directory. -class WindowsUwpAotBundle extends Target { - /// Create a [WindowsAotBundle] wrapper for [aotTarget]. - const WindowsUwpAotBundle(this.aotTarget); - - /// The [AotElfBase] subclass that produces the app.so. - final AotElfBase aotTarget; - - @override - String get name => 'windows_uwp_aot_bundle'; - - @override - List get inputs => const [ - Source.pattern('{BUILD_DIR}/app.so'), - ]; - - @override - List get outputs => const [ - Source.pattern('{OUTPUT_DIR}/winuwp/app.so'), - ]; - - @override - List get dependencies => [ - aotTarget, - ]; - - @override - Future build(Environment environment) async { - final File outputFile = environment.buildDir.childFile('app.so'); - final Directory outputDirectory = environment.outputDir.childDirectory('winuwp'); + final Directory outputDirectory = environment.outputDir.childDirectory('windows'); if (!outputDirectory.existsSync()) { outputDirectory.createSync(recursive: true); } @@ -350,7 +204,7 @@ class ReleaseBundleWindowsAssets extends BundleWindowsAssets { @override List get dependencies => [ ...super.dependencies, - const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64), uwp: false), + const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64)), ]; } @@ -366,7 +220,7 @@ class ProfileBundleWindowsAssets extends BundleWindowsAssets { @override List get dependencies => [ ...super.dependencies, - const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64), uwp: false), + const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64)), ]; } @@ -386,52 +240,3 @@ class DebugBundleWindowsAssets extends BundleWindowsAssets { const Source.pattern('{OUTPUT_DIR}/flutter_assets/kernel_blob.bin'), ]; } - -class ReleaseBundleWindowsAssetsUwp extends BundleWindowsAssetsUwp { - const ReleaseBundleWindowsAssetsUwp(); - - @override - String get name => 'release_bundle_windows_assets_uwp'; - - @override - List get outputs => const []; - - @override - List get dependencies => [ - ...super.dependencies, - const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_uwp_x64), uwp: true), - ]; -} - -class ProfileBundleWindowsAssetsUwp extends BundleWindowsAssetsUwp { - const ProfileBundleWindowsAssetsUwp(); - - @override - String get name => 'profile_bundle_windows_assets_uwp'; - - @override - List get outputs => const []; - - @override - List get dependencies => [ - ...super.dependencies, - const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_uwp_x64), uwp: true), - ]; -} - -class DebugBundleWindowsAssetsUwp extends BundleWindowsAssetsUwp { - const DebugBundleWindowsAssetsUwp(); - - @override - String get name => 'debug_bundle_windows_assets_uwp'; - - @override - List get inputs => [ - const Source.pattern('{BUILD_DIR}/app.dill'), - ]; - - @override - List get outputs => [ - const Source.pattern('{OUTPUT_DIR}/flutter_assets/kernel_blob.bin'), - ]; -} diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart index 701a898f33922..6fe426a5601f8 100644 --- a/packages/flutter_tools/lib/src/cache.dart +++ b/packages/flutter_tools/lib/src/cache.dart @@ -70,9 +70,6 @@ class DevelopmentArtifact { /// Artifacts required for the Flutter Runner. static const DevelopmentArtifact flutterRunner = DevelopmentArtifact._('flutter_runner', feature: flutterFuchsiaFeature); - /// Artifacts required for desktop Windows UWP. - static const DevelopmentArtifact windowsUwp = DevelopmentArtifact._('winuwp', feature: windowsUwpEmbedding); - /// Artifacts required for any development platform. /// /// This does not need to be explicitly returned from requiredArtifacts as @@ -92,7 +89,6 @@ class DevelopmentArtifact { fuchsia, universal, flutterRunner, - windowsUwp, ]; @override diff --git a/packages/flutter_tools/lib/src/cmake_project.dart b/packages/flutter_tools/lib/src/cmake_project.dart index d30b43e7986fd..bb707840d2d42 100644 --- a/packages/flutter_tools/lib/src/cmake_project.dart +++ b/packages/flutter_tools/lib/src/cmake_project.dart @@ -2,13 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:meta/meta.dart'; -import 'package:xml/xml.dart'; - -import 'base/common.dart'; import 'base/file_system.dart'; import 'base/utils.dart'; -import 'cmake.dart'; import 'platform_plugins.dart'; import 'project.dart'; @@ -84,45 +79,6 @@ class WindowsProject extends FlutterProjectPlatform implements CmakeBasedProject Future ensureReadyForPlatformSpecificTooling() async {} } -/// The Windows UWP version of the Windows project. -class WindowsUwpProject extends WindowsProject { - WindowsUwpProject.fromFlutter(super.parent) : super.fromFlutter(); - - @override - String get _childDirectory => 'winuwp'; - - File get runnerCmakeFile => _editableDirectory.childDirectory('runner_uwp').childFile('CMakeLists.txt'); - - /// Eventually this will be used to check if the user's unstable project needs to be regenerated. - int? get projectVersion => int.tryParse(_editableDirectory.childFile('project_version').readAsStringSync()); - - /// Retrieve the GUID of the UWP package. - late final String? packageGuid = getCmakePackageGuid(runnerCmakeFile); - - File get appManifest => _editableDirectory.childDirectory('runner_uwp').childFile('appxmanifest.in'); - - late final String? packageVersion = parseAppVersion(this); -} - -@visibleForTesting -String? parseAppVersion(WindowsUwpProject project) { - final File appManifestFile = project.appManifest; - if (!appManifestFile.existsSync()) { - return null; - } - - XmlDocument document; - try { - document = XmlDocument.parse(appManifestFile.readAsStringSync()); - } on XmlParserException { - throwToolExit('Error parsing $appManifestFile. Please ensure that the appx manifest is a valid XML document and try again.'); - } - for (final XmlElement metaData in document.findAllElements('Identity')) { - return metaData.getAttribute('Version'); - } - return null; -} - /// The Linux sub project. class LinuxProject extends FlutterProjectPlatform implements CmakeBasedProject { LinuxProject.fromFlutter(this.parent); diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart index 928181d31f65f..4f7d9c01cb7bb 100644 --- a/packages/flutter_tools/lib/src/commands/assemble.dart +++ b/packages/flutter_tools/lib/src/commands/assemble.dart @@ -79,10 +79,6 @@ List _kDefaultTargets = [ const DebugBundleWindowsAssets(), const ProfileBundleWindowsAssets(), const ReleaseBundleWindowsAssets(), - // Windows UWP targets - const DebugBundleWindowsAssetsUwp(), - const ProfileBundleWindowsAssetsUwp(), - const ReleaseBundleWindowsAssetsUwp(), ]; /// Assemble provides a low level API to interact with the flutter tool build diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 5cfaa11c5dc97..9a332a2753479 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -18,7 +18,6 @@ import 'build_fuchsia.dart'; import 'build_ios.dart'; import 'build_ios_framework.dart'; import 'build_web.dart'; -import 'build_winuwp.dart'; class BuildCommand extends FlutterCommand { BuildCommand({ bool verboseHelp = false }) { @@ -39,7 +38,6 @@ class BuildCommand extends FlutterCommand { verboseHelp: verboseHelp )); _addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp)); } diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart index f7f90453edc00..327097e7be687 100644 --- a/packages/flutter_tools/lib/src/commands/build_bundle.dart +++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart @@ -108,7 +108,6 @@ class BuildBundleCommand extends BuildSubCommand { } break; case TargetPlatform.windows_x64: - case TargetPlatform.windows_uwp_x64: if (!featureFlags.isWindowsEnabled) { throwToolExit('Windows is not a supported target platform.'); } diff --git a/packages/flutter_tools/lib/src/commands/build_winuwp.dart b/packages/flutter_tools/lib/src/commands/build_winuwp.dart deleted file mode 100644 index 7fb6eb9617775..0000000000000 --- a/packages/flutter_tools/lib/src/commands/build_winuwp.dart +++ /dev/null @@ -1,62 +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. - -import 'package:meta/meta.dart'; - -import '../base/common.dart'; -import '../build_info.dart'; -import '../cache.dart'; -import '../features.dart'; -import '../globals.dart' as globals; -import '../project.dart'; -import '../runner/flutter_command.dart' show FlutterCommandResult; -import '../windows/build_windows.dart'; -import '../windows/visual_studio.dart'; -import 'build.dart'; - -/// A command to build a Windows UWP desktop target. -class BuildWindowsUwpCommand extends BuildSubCommand { - BuildWindowsUwpCommand({ - bool verboseHelp = false, - }) : super(verboseHelp: verboseHelp) { - addCommonDesktopBuildOptions(verboseHelp: verboseHelp); - } - - @override - final String name = 'winuwp'; - - @override - bool get hidden => !featureFlags.isWindowsUwpEnabled || !globals.platform.isWindows; - - @override - Future> get requiredArtifacts async => { - DevelopmentArtifact.windowsUwp, - }; - - @override - String get description => 'Build a Windows UWP desktop application.'; - - @visibleForTesting - VisualStudio? visualStudioOverride; - - @override - Future runCommand() async { - final FlutterProject flutterProject = FlutterProject.current(); - final BuildInfo buildInfo = await getBuildInfo(); - if (!featureFlags.isWindowsUwpEnabled) { - throwToolExit('"build winuwp" is not currently supported.'); - } - if (!globals.platform.isWindows) { - throwToolExit('"build winuwp" only supported on Windows hosts.'); - } - displayNullSafetyMode(buildInfo); - await buildWindowsUwp( - flutterProject.windowsUwp, - buildInfo, - target: targetFile, - visualStudioOverride: visualStudioOverride, - ); - return FlutterCommandResult.success(); - } -} diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index cf85a54a70500..ae8b55bf0c2ce 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -289,7 +289,6 @@ class CreateCommand extends CreateBase { linux: featureFlags.isLinuxEnabled && platforms.contains('linux'), macos: featureFlags.isMacOSEnabled && platforms.contains('macos'), windows: featureFlags.isWindowsEnabled && platforms.contains('windows'), - windowsUwp: featureFlags.isWindowsUwpEnabled && platforms.contains('winuwp'), // Enable null safety everywhere. dartSdkVersionBounds: "'>=$dartSdk <3.0.0'", implementationTests: boolArg('implementation-tests'), diff --git a/packages/flutter_tools/lib/src/commands/create_base.dart b/packages/flutter_tools/lib/src/commands/create_base.dart index f1f9856bc8b31..737b3d3c04806 100644 --- a/packages/flutter_tools/lib/src/commands/create_base.dart +++ b/packages/flutter_tools/lib/src/commands/create_base.dart @@ -20,7 +20,6 @@ import '../cache.dart'; import '../convert.dart'; import '../dart/generate_synthetic_packages.dart'; import '../dart/pub.dart'; -import '../features.dart'; import '../flutter_project_metadata.dart'; import '../globals.dart' as globals; import '../project.dart'; @@ -45,7 +44,6 @@ const List kAllCreatePlatforms = [ 'linux', 'macos', 'web', - 'winuwp', ]; const String _kDefaultPlatformArgumentHelp = @@ -165,13 +163,9 @@ abstract class CreateBase extends FlutterCommand { aliases: [ 'platform' ], defaultsTo: [ ..._kAvailablePlatforms, - if (featureFlags.isWindowsUwpEnabled) - 'winuwp', ], allowed: [ ..._kAvailablePlatforms, - if (featureFlags.isWindowsUwpEnabled) - 'winuwp', ], ); } @@ -355,7 +349,6 @@ abstract class CreateBase extends FlutterCommand { bool linux = false, bool macos = false, bool windows = false, - bool windowsUwp = false, bool implementationTests = false, }) { final String pluginDartClass = _createPluginClassName(projectName); @@ -418,7 +411,6 @@ abstract class CreateBase extends FlutterCommand { 'linux': linux, 'macos': macos, 'windows': windows, - 'winuwp': windowsUwp, 'year': DateTime.now().year, 'dartSdkVersionBounds': dartSdkVersionBounds, 'implementationTests': implementationTests, @@ -522,7 +514,6 @@ abstract class CreateBase extends FlutterCommand { final bool macOSPlatform = templateContext['macos'] as bool ?? false; final bool windowsPlatform = templateContext['windows'] as bool ?? false; final bool webPlatform = templateContext['web'] as bool ?? false; - final bool winUwpPlatform = templateContext['winuwp'] as bool ?? false; if (boolArg('pub')) { final Environment environment = Environment( @@ -562,7 +553,6 @@ abstract class CreateBase extends FlutterCommand { macOSPlatform: macOSPlatform, windowsPlatform: windowsPlatform, webPlatform: webPlatform, - winUwpPlatform: winUwpPlatform, ); } final List platformsForMigrateConfig = [SupportedPlatform.root]; @@ -585,9 +575,6 @@ abstract class CreateBase extends FlutterCommand { if (windowsPlatform) { platformsForMigrateConfig.add(SupportedPlatform.windows); } - if (winUwpPlatform) { - platformsForMigrateConfig.add(SupportedPlatform.windowsuwp); - } if (templateContext['fuchsia'] == true) { platformsForMigrateConfig.add(SupportedPlatform.fuchsia); } diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index 39de6503826e0..dfab73928d90a 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -50,8 +50,6 @@ class PrecacheCommand extends FlutterCommand { help: 'Precache artifacts for Linux desktop development.'); argParser.addFlag('windows', negatable: true, defaultsTo: false, help: 'Precache artifacts for Windows desktop development.'); - argParser.addFlag('winuwp', negatable: true, defaultsTo: false, - help: 'Precache artifacts for Windows UWP desktop development.'); argParser.addFlag('macos', negatable: true, defaultsTo: false, help: 'Precache artifacts for macOS desktop development.'); argParser.addFlag('fuchsia', negatable: true, defaultsTo: false, diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index aea6b97f89f5b..7dcda5c5e6aa7 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -64,7 +64,6 @@ import 'run_hot.dart'; import 'runner/local_engine.dart'; import 'version.dart'; import 'web/workflow.dart'; -import 'windows/uwptool.dart'; import 'windows/visual_studio.dart'; import 'windows/visual_studio_validator.dart'; import 'windows/windows_workflow.dart'; @@ -207,11 +206,6 @@ Future runInContext( operatingSystemUtils: globals.os, terminal: globals.terminal, customDevicesConfig: globals.customDevicesConfig, - uwptool: UwpTool( - artifacts: globals.artifacts, - logger: globals.logger, - processManager: globals.processManager, - ), ), DevtoolsLauncher: () => DevtoolsServerLauncher( processManager: globals.processManager, diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart index f94f031b6f6cf..a53d3baf3fd07 100644 --- a/packages/flutter_tools/lib/src/features.dart +++ b/packages/flutter_tools/lib/src/features.dart @@ -47,9 +47,6 @@ abstract class FeatureFlags { /// Whether fast single widget reloads are enabled. bool get isSingleWidgetReloadEnabled => false; - /// Whether the windows UWP embedding is enabled. - bool get isWindowsUwpEnabled => false; - /// Whether a particular feature is enabled for the current channel. /// /// Prefer using one of the specific getters above instead of this API. @@ -62,7 +59,6 @@ const List allFeatures = [ flutterLinuxDesktopFeature, flutterMacOSDesktopFeature, flutterWindowsDesktopFeature, - windowsUwpEmbedding, singleWidgetReload, flutterAndroidFeature, flutterIOSFeature, @@ -212,16 +208,6 @@ const Feature singleWidgetReload = Feature( ), ); -/// The feature for enabling the Windows UWP embedding. -const Feature windowsUwpEmbedding = Feature( - name: 'Flutter for Windows UWP', - configSetting: 'enable-windows-uwp-desktop', - extraHelpText: 'Warning: Windows UWP support is obsolete and will be removed.', - master: FeatureChannelSetting( - available: true, - ), -); - /// A [Feature] is a process for conditionally enabling tool features. /// /// All settings are optional, and if not provided will generally default to diff --git a/packages/flutter_tools/lib/src/flutter_application_package.dart b/packages/flutter_tools/lib/src/flutter_application_package.dart index a0f924bef9eb7..c7afa223d372e 100644 --- a/packages/flutter_tools/lib/src/flutter_application_package.dart +++ b/packages/flutter_tools/lib/src/flutter_application_package.dart @@ -105,8 +105,6 @@ class FlutterApplicationPackageFactory extends ApplicationPackageFactory { return applicationBinary == null ? FuchsiaApp.fromFuchsiaProject(FlutterProject.current().fuchsia) : FuchsiaApp.fromPrebuiltApp(applicationBinary); - case TargetPlatform.windows_uwp_x64: - return BuildableUwpApp(project: FlutterProject.current().windowsUwp); } } } diff --git a/packages/flutter_tools/lib/src/flutter_cache.dart b/packages/flutter_tools/lib/src/flutter_cache.dart index 818c10f1082b8..4874af196d45b 100644 --- a/packages/flutter_tools/lib/src/flutter_cache.dart +++ b/packages/flutter_tools/lib/src/flutter_cache.dart @@ -38,7 +38,6 @@ class FlutterCache extends Cache { registerArtifact(FlutterWebSdk(this, platform: platform)); registerArtifact(FlutterSdk(this, platform: platform)); registerArtifact(WindowsEngineArtifacts(this, platform: platform)); - registerArtifact(WindowsUwpEngineArtifacts(this, platform: platform)); registerArtifact(MacOSEngineArtifacts(this, platform: platform)); registerArtifact(LinuxEngineArtifacts(this, platform: platform)); registerArtifact(LinuxFuchsiaSDKArtifacts(this, platform: platform)); @@ -305,33 +304,6 @@ class WindowsEngineArtifacts extends EngineCachedArtifact { List getLicenseDirs() => const []; } -class WindowsUwpEngineArtifacts extends EngineCachedArtifact { - WindowsUwpEngineArtifacts(Cache cache, { - required Platform platform, - }) : _platform = platform, - super( - 'windows-uwp-sdk', - cache, - DevelopmentArtifact.windowsUwp, - ); - - final Platform _platform; - - @override - List getPackageDirs() => const []; - - @override - List> getBinaryDirs() { - if (_platform.isWindows || ignorePlatformFiltering) { - return _windowsUwpDesktopBinaryDirs; - } - return const >[]; - } - - @override - List getLicenseDirs() => const []; -} - /// Artifacts required for desktop Linux builds. class LinuxEngineArtifacts extends EngineCachedArtifact { LinuxEngineArtifacts(Cache cache, { @@ -864,13 +836,6 @@ const List> _windowsDesktopBinaryDirs = >[ ['windows-x64-release', 'windows-x64-release/windows-x64-flutter.zip'], ]; -const List> _windowsUwpDesktopBinaryDirs = >[ - ['windows-uwp-x64-debug', 'windows-x64-debug/windows-uwp-x64-flutter.zip'], - ['windows-uwp-x64-debug', 'windows-x64/flutter-cpp-client-wrapper.zip'], - ['windows-uwp-x64-profile', 'windows-x64-profile/windows-uwp-x64-flutter.zip'], - ['windows-uwp-x64-release', 'windows-x64-release/windows-uwp-x64-flutter.zip'], -]; - const List> _macOSDesktopBinaryDirs = >[ ['darwin-x64', 'darwin-x64/FlutterMacOS.framework.zip'], ['darwin-x64', 'darwin-x64/gen_snapshot.zip'], diff --git a/packages/flutter_tools/lib/src/flutter_device_manager.dart b/packages/flutter_tools/lib/src/flutter_device_manager.dart index 4e394a166f98e..887783b5df426 100644 --- a/packages/flutter_tools/lib/src/flutter_device_manager.dart +++ b/packages/flutter_tools/lib/src/flutter_device_manager.dart @@ -29,7 +29,7 @@ import 'macos/xcdevice.dart'; import 'tester/flutter_tester.dart'; import 'version.dart'; import 'web/web_device.dart'; -import 'windows/uwptool.dart'; + import 'windows/windows_device.dart'; import 'windows/windows_workflow.dart'; @@ -56,7 +56,6 @@ class FlutterDeviceManager extends DeviceManager { required WindowsWorkflow windowsWorkflow, required super.terminal, required CustomDevicesConfig customDevicesConfig, - required UwpTool uwptool, }) : deviceDiscoverers = [ AndroidDevices( logger: logger, @@ -120,8 +119,6 @@ class FlutterDeviceManager extends DeviceManager { logger: logger, fileSystem: fileSystem, windowsWorkflow: windowsWorkflow, - featureFlags: featureFlags, - uwptool: uwptool, ), WebDevices( featureFlags: featureFlags, diff --git a/packages/flutter_tools/lib/src/flutter_features.dart b/packages/flutter_tools/lib/src/flutter_features.dart index d3b1295831b5a..9f4ce259850f8 100644 --- a/packages/flutter_tools/lib/src/flutter_features.dart +++ b/packages/flutter_tools/lib/src/flutter_features.dart @@ -47,9 +47,6 @@ class FlutterFeatureFlags implements FeatureFlags { @override bool get isSingleWidgetReloadEnabled => isEnabled(singleWidgetReload); - @override - bool get isWindowsUwpEnabled => isEnabled(windowsUwpEmbedding); - @override bool isEnabled(Feature feature) { final String currentChannel = _flutterVersion.channel; diff --git a/packages/flutter_tools/lib/src/flutter_plugins.dart b/packages/flutter_tools/lib/src/flutter_plugins.dart index d2f8fbd8092bf..a399c834b49f8 100644 --- a/packages/flutter_tools/lib/src/flutter_plugins.dart +++ b/packages/flutter_tools/lib/src/flutter_plugins.dart @@ -922,25 +922,6 @@ Future writeWindowsPluginFiles(FlutterProject project, List plugin await _writePluginCmakefile(project.windows.generatedPluginCmakeFile, context, templateRenderer); } -/// The tooling currently treats UWP and win32 as identical, other than variant -/// filtering, for the purposes of tooling support and initial UWP bootstrap. -@visibleForTesting -Future writeWindowsUwpPluginFiles(FlutterProject project, List plugins, TemplateRenderer templateRenderer) async { - final List methodChannelPlugins = _filterMethodChannelPlugins(plugins, WindowsPlugin.kConfigKey); - final List uwpPlugins = _filterPluginsByVariant(methodChannelPlugins, WindowsPlugin.kConfigKey, PluginPlatformVariant.winuwp); - final List> windowsMethodChannelPlugins = _extractPlatformMaps(uwpPlugins, WindowsPlugin.kConfigKey); - final List ffiPlugins = _filterFfiPlugins(plugins, WindowsPlugin.kConfigKey)..removeWhere(methodChannelPlugins.contains); - final List> windowsFfiPlugins = _extractPlatformMaps(ffiPlugins, WindowsPlugin.kConfigKey); - final Map context = { - 'os': 'windows', - 'methodChannelPlugins': windowsMethodChannelPlugins, - 'ffiPlugins': windowsFfiPlugins, - 'pluginsDir': _cmakeRelativePluginSymlinkDirectoryPath(project.windowsUwp), - }; - await _writeCppPluginRegistrant(project.windowsUwp.managedDirectory, context, templateRenderer); - await _writePluginCmakefile(project.windowsUwp.generatedPluginCmakeFile, context, templateRenderer); -} - Future _writeCppPluginRegistrant(Directory destination, Map templateContext, TemplateRenderer templateRenderer) async { _renderTemplateToFile( _cppPluginRegistryHeaderTemplate, @@ -1006,13 +987,6 @@ void createPluginSymlinks(FlutterProject project, {bool force = false, @visibleF force: force, ); } - if (localFeatureFlags.isWindowsUwpEnabled && project.windowsUwp.existsSync()) { - _createPlatformPluginSymlinks( - project.windowsUwp.pluginSymlinkDirectory, - platformPlugins[project.windows.pluginConfigKey] as List?, - force: force, - ); - } } /// Handler for symlink failures which provides specific instructions for known @@ -1104,7 +1078,6 @@ Future injectPlugins( bool linuxPlatform = false, bool macOSPlatform = false, bool windowsPlatform = false, - bool winUwpPlatform = false, bool webPlatform = false, }) async { final List plugins = await findPlugins(project); @@ -1125,9 +1098,6 @@ Future injectPlugins( if (windowsPlatform) { await writeWindowsPluginFiles(project, plugins, globals.templateRenderer); } - if (winUwpPlatform) { - await writeWindowsUwpPluginFiles(project, plugins, globals.templateRenderer); - } if (!project.isModule) { final List darwinProjects = [ if (iosPlatform) project.ios, diff --git a/packages/flutter_tools/lib/src/mdns_discovery.dart b/packages/flutter_tools/lib/src/mdns_discovery.dart index b4dee608d76f0..ce7d8c2602b16 100644 --- a/packages/flutter_tools/lib/src/mdns_discovery.dart +++ b/packages/flutter_tools/lib/src/mdns_discovery.dart @@ -217,7 +217,6 @@ class MDnsObservatoryDiscovery { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: _logger.printTrace('No interface with an ipv4 link local address was found.'); break; diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart index 3a9e9744c0ebd..58d5e3cae2700 100644 --- a/packages/flutter_tools/lib/src/platform_plugins.dart +++ b/packages/flutter_tools/lib/src/platform_plugins.dart @@ -26,9 +26,6 @@ const String kSupportedVariants = 'supportedVariants'; enum PluginPlatformVariant { /// Win32 variant of Windows. win32, - - // UWP variant of Windows. - winuwp, } /// Marker interface for all platform specific plugin config implementations. @@ -396,7 +393,6 @@ class WindowsPlugin extends PluginPlatform } else { const Map variantByName = { 'win32': PluginPlatformVariant.win32, - 'uwp': PluginPlatformVariant.winuwp, }; for (final String variantName in variantList.cast()) { final PluginPlatformVariant? variant = variantByName[variantName]; diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 4061987a0305a..c127c3030c4e6 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -35,7 +35,6 @@ enum SupportedPlatform { macos, web, windows, - windowsuwp, fuchsia, root, // Special platform to represent the root project directory } @@ -194,9 +193,6 @@ class FlutterProject { /// The Windows sub project of this project. late final WindowsProject windows = WindowsProject.fromFlutter(this); - /// The Windows UWP sub project of this project. - late final WindowsUwpProject windowsUwp = WindowsUwpProject.fromFlutter(this); - /// The Fuchsia sub project of this project. late final FuchsiaProject fuchsia = FuchsiaProject._(this); @@ -278,9 +274,6 @@ class FlutterProject { if (windows.existsSync()) { platforms.add(SupportedPlatform.windows); } - if (windowsUwp.existsSync()) { - platforms.add(SupportedPlatform.windowsuwp); - } if (fuchsia.existsSync()) { platforms.add(SupportedPlatform.fuchsia); } @@ -336,7 +329,6 @@ class FlutterProject { macOSPlatform: featureFlags.isMacOSEnabled && macos.existsSync(), windowsPlatform: featureFlags.isWindowsEnabled && windows.existsSync(), webPlatform: featureFlags.isWebEnabled && web.existsSync(), - winUwpPlatform: featureFlags.isWindowsUwpEnabled && windowsUwp.existsSync(), deprecationBehavior: deprecationBehavior, ); } @@ -350,7 +342,6 @@ class FlutterProject { bool macOSPlatform = false, bool windowsPlatform = false, bool webPlatform = false, - bool winUwpPlatform = false, DeprecationBehavior deprecationBehavior = DeprecationBehavior.none, }) async { if (!directory.existsSync() || isPlugin) { @@ -375,9 +366,6 @@ class FlutterProject { if (webPlatform) { await web.ensureReadyForPlatformSpecificTooling(); } - if (winUwpPlatform) { - await windowsUwp.ensureReadyForPlatformSpecificTooling(); - } await injectPlugins( this, androidPlatform: androidPlatform, @@ -386,7 +374,6 @@ class FlutterProject { macOSPlatform: macOSPlatform, windowsPlatform: windowsPlatform, webPlatform: webPlatform, - winUwpPlatform: winUwpPlatform, ); } diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index d303e639a60db..b5bbac33c7e16 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -1523,7 +1523,6 @@ Future getMissingPackageHintForPlatform(TargetPlatform platform) async { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: return null; } diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 3d1c55316fa9a..21bab0ccfd9cd 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -1591,10 +1591,6 @@ DevelopmentArtifact? artifactFromTargetPlatform(TargetPlatform targetPlatform) { case TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_x64: case TargetPlatform.tester: - case TargetPlatform.windows_uwp_x64: - if (featureFlags.isWindowsUwpEnabled) { - return DevelopmentArtifact.windowsUwp; - } return null; } } diff --git a/packages/flutter_tools/lib/src/runner/local_engine.dart b/packages/flutter_tools/lib/src/runner/local_engine.dart index e3626024ebbe9..ecdad2fa14908 100644 --- a/packages/flutter_tools/lib/src/runner/local_engine.dart +++ b/packages/flutter_tools/lib/src/runner/local_engine.dart @@ -150,10 +150,6 @@ class LocalEngineLocator { // Determine the host engine directory associated with the local engine: // Strip '_sim_' since there are no host simulator builds. String _getHostEngineBasename(String localEngineBasename) { - // Allow winuwp builds to be treated as host builds. - if (localEngineBasename.startsWith('winuwp')) { - return localEngineBasename; - } String tmpBasename = localEngineBasename.replaceFirst('_sim_', '_'); tmpBasename = tmpBasename.substring(tmpBasename.indexOf('_') + 1); // Strip suffix for various archs. diff --git a/packages/flutter_tools/lib/src/sksl_writer.dart b/packages/flutter_tools/lib/src/sksl_writer.dart index 6ac6e3ddd20f8..aab82c0c8079a 100644 --- a/packages/flutter_tools/lib/src/sksl_writer.dart +++ b/packages/flutter_tools/lib/src/sksl_writer.dart @@ -54,7 +54,6 @@ Future sharedSkSlWriter(Device device, Map data, { case TargetPlatform.linux_x64: case TargetPlatform.tester: case TargetPlatform.web_javascript: - case TargetPlatform.windows_uwp_x64: case TargetPlatform.windows_x64: break; } diff --git a/packages/flutter_tools/lib/src/template.dart b/packages/flutter_tools/lib/src/template.dart index 06ae4e7920aad..9af0106fbd1f8 100644 --- a/packages/flutter_tools/lib/src/template.dart +++ b/packages/flutter_tools/lib/src/template.dart @@ -214,11 +214,6 @@ class Template { if (relativeDestinationPath.startsWith('windows.tmpl') && !windows) { return null; } - // Only build a Windows UWP project if explicitly asked. - final bool windowsUwp = (context['winuwp'] as bool?) ?? false; - if (relativeDestinationPath.startsWith('winuwp.tmpl') && !windowsUwp) { - return null; - } final String? projectName = context['projectName'] as String?; final String? androidIdentifier = context['androidIdentifier'] as String?; diff --git a/packages/flutter_tools/lib/src/windows/application_package.dart b/packages/flutter_tools/lib/src/windows/application_package.dart index 2b1e1939e2529..aeb8c6330f2e4 100644 --- a/packages/flutter_tools/lib/src/windows/application_package.dart +++ b/packages/flutter_tools/lib/src/windows/application_package.dart @@ -71,14 +71,3 @@ class BuildableWindowsApp extends WindowsApp { @override String get name => project.parent.manifest.appName; } - -class BuildableUwpApp extends ApplicationPackage { - BuildableUwpApp({required this.project}) : super(id: project.packageGuid ?? 'com.example.placeholder'); - - final WindowsUwpProject project; - - String? get projectVersion => project.packageVersion; - - @override - String? get name => getCmakeExecutableName(project); -} diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart index 859b97ceb611d..ce4abbb399c88 100644 --- a/packages/flutter_tools/lib/src/windows/build_windows.dart +++ b/packages/flutter_tools/lib/src/windows/build_windows.dart @@ -17,12 +17,8 @@ import '../convert.dart'; import '../flutter_plugins.dart'; import '../globals.dart' as globals; import '../migrations/cmake_custom_command_migration.dart'; -import 'install_manifest.dart'; import 'visual_studio.dart'; -/// Update the string when non-backwards compatible changes are made to the UWP template. -const int kCurrentUwpTemplateVersion = 0; - /// Builds the Windows project using msbuild. Future buildWindows(WindowsProject windowsProject, BuildInfo buildInfo, { String? target, @@ -116,132 +112,6 @@ Future buildWindows(WindowsProject windowsProject, BuildInfo buildInfo, { } } -/// Build the Windows UWP project. -/// -/// Note that this feature is currently unfinished. -Future buildWindowsUwp(WindowsUwpProject windowsProject, BuildInfo buildInfo, { - String? target, - VisualStudio? visualStudioOverride, -}) async { - final Directory buildDirectory = globals.fs.directory(getWindowsBuildUwpDirectory()); - if (!windowsProject.existsSync()) { - throwToolExit( - 'No Windows UWP desktop project configured. See ' - 'https://docs.flutter.dev/desktop#add-desktop-support-to-an-existing-flutter-app ' - 'to learn about adding Windows support to a project.', - ); - } - if (windowsProject.projectVersion != kCurrentUwpTemplateVersion) { - throwToolExit( - 'The Windows UWP project template and build process has changed. In order to build ' - 'you must delete the winuwp directory and re-create the project.', - ); - } - // Ensure that necessary ephemeral files are generated and up to date. - _writeGeneratedFlutterConfig(windowsProject, buildInfo, target); - createPluginSymlinks(windowsProject.parent); - await createManifest( - buildDirectory: buildDirectory, - logger: globals.logger, - platform: globals.platform, - project: windowsProject, - buildInfo: buildInfo, - fileSystem: globals.fs, - ); - - final VisualStudio visualStudio = visualStudioOverride ?? VisualStudio( - fileSystem: globals.fs, - platform: globals.platform, - logger: globals.logger, - processManager: globals.processManager, - ); - final String? cmakePath = visualStudio.cmakePath; - final String? cmakeGenerator = visualStudio.cmakeGenerator; - if (cmakePath == null || cmakeGenerator == null) { - throwToolExit('Unable to find suitable Visual Studio toolchain. ' - 'Please run `flutter doctor` for more details.'); - } - - final String buildModeName = getNameForBuildMode(buildInfo.mode); - final Status status = globals.logger.startProgress( - 'Building Windows UWP application...', - ); - try { - // The Cmake re-entrant build does not work for UWP, so the flutter build is - // run in advance. - await _runFlutterBuild(buildDirectory, buildInfo, target); - await _runCmakeGeneration( - cmakePath: cmakePath, - generator: cmakeGenerator, - buildDir: buildDirectory, - sourceDir: windowsProject.cmakeFile.parent, - ); - await _runBuild(cmakePath, buildDirectory, buildModeName, install: false); - } finally { - status.cancel(); - } -} - -const Map _targets = { - BuildMode.debug: 'debug_bundle_windows_assets_uwp', - BuildMode.profile: 'profile_bundle_windows_assets_uwp', - BuildMode.release: 'release_bundle_windows_assets_uwp', -}; - -Future _runFlutterBuild(Directory buildDirectory, BuildInfo buildInfo, String? targetFile) async { - await buildDirectory.create(recursive: true); - int result; - String? flutterEngine; - String? localEngine; - final Artifacts artifacts = globals.artifacts!; - if (artifacts is LocalEngineArtifacts) { - final String engineOutPath = artifacts.engineOutPath; - flutterEngine = globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath)); - localEngine = globals.fs.path.basename(engineOutPath); - } - try { - final String? buildMode = _targets[buildInfo.mode]; - result = await globals.processUtils.stream( - [ - globals.fs.path.join(Cache.flutterRoot!, 'bin', 'flutter'), - if (globals.logger.isVerbose) - '--verbose', - if (flutterEngine != null) '--local-engine-src-path=$flutterEngine', - if (localEngine != null) '--local-engine=$localEngine', - 'assemble', - '--no-version-check', - '--output=build', - '-dTargetPlatform=windows-uwp-x64', - '-dTrackWidgetCreation=${buildInfo.trackWidgetCreation}', - '-dBuildMode=${getNameForBuildMode(buildInfo.mode)}', - '-dTargetFile=$targetFile', - '-dTreeShakeIcons="${buildInfo.treeShakeIcons}"', - '-dDartObfuscation=${buildInfo.dartObfuscation}', - if (buildInfo.bundleSkSLPath != null) - '-dBundleSkSLPath=${buildInfo.bundleSkSLPath}', - if (buildInfo.codeSizeDirectory != null) - '-dCodeSizeDirectory=${buildInfo.codeSizeDirectory}', - if (buildInfo.splitDebugInfoPath != null) - '-dSplitDebugInfo=${buildInfo.splitDebugInfoPath}', - if (buildInfo.dartDefines != null && buildInfo.dartDefines.isNotEmpty) - '--DartDefines=${encodeDartDefines(buildInfo.dartDefines)}', - if (buildInfo.extraGenSnapshotOptions != null && buildInfo.extraGenSnapshotOptions.isNotEmpty) - '--ExtraGenSnapshotOptions=${buildInfo.extraGenSnapshotOptions}', - if (buildInfo.extraFrontEndOptions != null && buildInfo.extraFrontEndOptions.isNotEmpty) - '--ExtraFrontEndOptions=${buildInfo.extraFrontEndOptions}', - if (buildMode != null) - buildMode, - ], - trace: true, - ); - } on ArgumentError { - throwToolExit("cmake not found. Run 'flutter doctor' for more information."); - } - if (result != 0) { - throwToolExit('Unable to generate build files'); - } -} - Future _runCmakeGeneration({ required String cmakePath, required String generator, diff --git a/packages/flutter_tools/lib/src/windows/install_manifest.dart b/packages/flutter_tools/lib/src/windows/install_manifest.dart deleted file mode 100644 index 783e22ca29099..0000000000000 --- a/packages/flutter_tools/lib/src/windows/install_manifest.dart +++ /dev/null @@ -1,50 +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. - -import '../asset.dart'; -import '../base/common.dart'; -import '../base/file_system.dart'; -import '../base/logger.dart'; -import '../base/platform.dart'; -import '../build_info.dart'; -import '../cmake_project.dart'; - -/// Generate an install manifest that is required for CMAKE on UWP projects. -Future createManifest({ - required Logger logger, - required FileSystem fileSystem, - required Platform platform, - required WindowsUwpProject project, - required BuildInfo buildInfo, - required Directory buildDirectory, -}) async { - final List outputs = []; - final AssetBundle assetBundle = AssetBundleFactory.defaultInstance( - logger: logger, - fileSystem: fileSystem, - platform: platform, - ).createBundle(); - final int resultCode = await assetBundle.build( - packagesPath: buildInfo.packagesPath, - assetDirPath: buildDirectory.childDirectory('flutter_assets').path, - ); - if (resultCode != 0) { - throwToolExit('Failed to build assets.'); - } - - if (buildInfo.mode.isPrecompiled) { - outputs.add(buildDirectory.childFile('app.so')); - } else { - outputs.add(buildDirectory.parent.childDirectory('flutter_assets').childFile('kernel_blob.bin')); - } - for (final String key in assetBundle.entries.keys) { - outputs.add(buildDirectory.parent.childDirectory('flutter_assets').childFile(key)); - } - outputs.add(project.ephemeralDirectory.childFile('flutter_windows_winuwp.dll')); - outputs.add(project.ephemeralDirectory.childFile('flutter_windows_winuwp.dll.pdb')); - outputs.add(project.ephemeralDirectory.childFile('icudtl.dat')); - project.ephemeralDirectory.childFile('install_manifest') - ..createSync(recursive: true) - ..writeAsStringSync(outputs.map((File file) => file.absolute.uri.path.substring(1)).join('\n')); -} diff --git a/packages/flutter_tools/lib/src/windows/uwptool.dart b/packages/flutter_tools/lib/src/windows/uwptool.dart deleted file mode 100644 index f5dbba084d5bb..0000000000000 --- a/packages/flutter_tools/lib/src/windows/uwptool.dart +++ /dev/null @@ -1,161 +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. - -import 'dart:async'; - -import 'package:process/process.dart'; - -import '../artifacts.dart'; -import '../base/logger.dart'; -import '../base/process.dart'; - -/// The uwptool command-line tool. -/// -/// `uwptool` is a host utility command-line tool that supports a variety of -/// actions related to Universal Windows Platform (UWP) applications, including -/// installing and uninstalling apps, querying installed apps, and launching -/// apps. -class UwpTool { - UwpTool({ - required Artifacts artifacts, - required Logger logger, - required ProcessManager processManager, - }) : _artifacts = artifacts, - _logger = logger, - _processUtils = ProcessUtils(processManager: processManager, logger: logger); - - final Artifacts _artifacts; - final Logger _logger; - final ProcessUtils _processUtils; - - String get _binaryPath => _artifacts.getArtifactPath(Artifact.uwptool); - - Future> listApps() async { - final List launchCommand = [ - _binaryPath, - 'listapps', - ]; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printError('Failed to list installed UWP apps: ${result.stderr}'); - return []; - } - final List packageFamilies = []; - for (final String line in result.stdout.split('\n')) { - final String packageFamily = line.trim(); - if (packageFamily.isNotEmpty) { - packageFamilies.add(packageFamily); - } - } - return packageFamilies; - } - - /// Returns the package family name for the specified package name. - /// - /// If no installed application on the system matches the specified package - /// name, returns null. - Future getPackageFamilyName(String packageName) async { - for (final String packageFamily in await listApps()) { - if (packageFamily.startsWith(packageName)) { - return packageFamily; - } - } - return null; - } - - /// Launches the app with the specified package family name. - /// - /// On success, returns the process ID of the launched app, otherwise null. - Future launchApp(String packageFamily, List args) async { - final List launchCommand = [ - _binaryPath, - 'launch', - packageFamily - ] + args; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printError('Failed to launch app $packageFamily: ${result.stderr}'); - return null; - } - // Read the process ID from stdout. - final int? processId = int.tryParse(result.stdout.trim()); - _logger.printTrace('Launched application $packageFamily with process ID $processId'); - return processId; - } - - /// Returns `true` if the specified package signature is valid. - Future isSignatureValid(String packagePath) async { - final List launchCommand = [ - 'powershell.exe', - '-command', - 'if ((Get-AuthenticodeSignature "$packagePath").Status -eq "Valid") { exit 0 } else { exit 1 }' - ]; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printTrace('Invalid signature found for $packagePath'); - return false; - } - _logger.printTrace('Valid signature found for $packagePath'); - return true; - } - - /// Installs a developer signing certificate. - /// - /// Returns `true` on success. - Future installCertificate(String certificatePath) async { - final List launchCommand = [ - 'powershell.exe', - 'start', - 'certutil', - '-argumentlist', - '\'-addstore TrustedPeople "$certificatePath"\'', - '-verb', - 'runas' - ]; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printError('Failed to install certificate $certificatePath'); - return false; - } - _logger.printTrace('Waiting for certificate store update'); - // TODO(cbracken): Determine how we can query for success until some timeout. - // https://github.com/flutter/flutter/issues/82665 - await Future.delayed(const Duration(seconds: 1)); - _logger.printTrace('Installed certificate $certificatePath'); - return true; - } - - /// Installs the app with the specified build directory. - /// - /// Returns `true` on success. - Future installApp(String packageUri, List dependencyUris) async { - final List launchCommand = [ - _binaryPath, - 'install', - packageUri, - ] + dependencyUris; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printError('Failed to install $packageUri'); - return false; - } - _logger.printTrace('Installed application $packageUri'); - return true; - } - - Future uninstallApp(String packageFamily) async { - final List launchCommand = [ - _binaryPath, - 'uninstall', - packageFamily - ]; - final RunResult result = await _processUtils.run(launchCommand); - if (result.exitCode != 0) { - _logger.printError('Failed to uninstall $packageFamily'); - return false; - } - _logger.printTrace('Uninstalled application $packageFamily'); - return true; - } -} diff --git a/packages/flutter_tools/lib/src/windows/windows_device.dart b/packages/flutter_tools/lib/src/windows/windows_device.dart index 08f9f406d1f04..83af4e012dbd4 100644 --- a/packages/flutter_tools/lib/src/windows/windows_device.dart +++ b/packages/flutter_tools/lib/src/windows/windows_device.dart @@ -6,20 +6,15 @@ import 'dart:async'; import 'package:process/process.dart'; -import '../application_package.dart'; import '../base/file_system.dart'; import '../base/logger.dart'; import '../base/os.dart'; -import '../base/utils.dart'; import '../build_info.dart'; import '../desktop_device.dart'; import '../device.dart'; -import '../device_port_forwarder.dart'; -import '../features.dart'; import '../project.dart'; import 'application_package.dart'; import 'build_windows.dart'; -import 'uwptool.dart'; import 'windows_workflow.dart'; /// A device that represents a desktop Windows target. @@ -72,332 +67,6 @@ class WindowsDevice extends DesktopDevice { } } -// A device that represents a desktop Windows UWP target. -class WindowsUWPDevice extends Device { - WindowsUWPDevice({ - required ProcessManager processManager, - required Logger logger, - required FileSystem fileSystem, - required OperatingSystemUtils operatingSystemUtils, - required UwpTool uwptool, - }) : _logger = logger, - _processManager = processManager, - _operatingSystemUtils = operatingSystemUtils, - _fileSystem = fileSystem, - _uwptool = uwptool, - super( - 'winuwp', - platformType: PlatformType.windows, - ephemeral: false, - category: Category.desktop, - ); - - final ProcessManager _processManager; - final Logger _logger; - final FileSystem _fileSystem; - final OperatingSystemUtils _operatingSystemUtils; - final UwpTool _uwptool; - BuildMode? _buildMode; - - int? _processId; - - @override - bool isSupported() => true; - - @override - String get name => 'Windows (UWP)'; - - @override - Future get targetPlatform async => TargetPlatform.windows_uwp_x64; - - @override - bool isSupportedForProject(FlutterProject flutterProject) { - return flutterProject.windowsUwp.existsSync(); - } - - @override - void clearLogs() { } - - @override - Future dispose() async { } - - @override - Future get emulatorId async => null; - - @override - FutureOr getLogReader({covariant BuildableUwpApp? app, bool includePastLogs = false}) { - return NoOpDeviceLogReader('winuwp'); - } - - // Returns `true` if the specified file is a valid package based on file extension. - bool _isValidPackage(String packagePath) { - const List validPackageExtensions = [ - '.appx', '.msix', // Architecture-specific application. - '.appxbundle', '.msixbundle', // Architecture-independent application. - '.eappx', '.emsix', // Encrypted architecture-specific application. - '.eappxbundle', '.emsixbundle', // Encrypted architecture-independent application. - ]; - return validPackageExtensions.any(packagePath.endsWith); - } - - // Walks the build directory for any dependent packages for the specified architecture. - List _getPackagePaths(String directory) { - if (!_fileSystem.isDirectorySync(directory)) { - return []; - } - final List packagePaths = []; - for (final FileSystemEntity entity in _fileSystem.directory(directory).listSync()) { - if (entity.statSync().type != FileSystemEntityType.file) { - continue; - } - final String packagePath = entity.absolute.path; - if (_isValidPackage(packagePath)) { - packagePaths.add(packagePath); - } - } - return packagePaths; - } - - // Walks the build directory for any dependent packages for the specified architecture. - String? _getAppPackagePath(String buildDirectory) { - final List packagePaths = _getPackagePaths(buildDirectory); - return packagePaths.isNotEmpty ? packagePaths.first : null; - } - - // Walks the build directory for any dependent packages for the specified architecture. - List _getDependencyPaths(String buildDirectory, String architecture) { - final String depsDirectory = _fileSystem.path.join(buildDirectory, 'Dependencies', architecture); - return _getPackagePaths(depsDirectory); - } - - String _getPackageName(String binaryName, String version, String config, {String? architecture}) { - final List components = [ - binaryName, - version, - if (architecture != null) architecture, - config, - ]; - return components.join('_'); - } - - @override - Future installApp(covariant BuildableUwpApp app, {String? userIdentifier}) async { - /// The cmake build generates an install powershell script. - /// build\winuwp\runner_uwp\AppPackages\\__\Add-AppDevPackage.ps1 - final String? binaryName = app.name; - final String? packageVersion = app.projectVersion; - if (binaryName == null || packageVersion == null) { - return false; - } - final String binaryDir = _fileSystem.path.absolute( - _fileSystem.path.join('build', 'winuwp', 'runner_uwp', 'AppPackages', binaryName)); - final String config = sentenceCase(getNameForBuildMode(_buildMode ?? BuildMode.debug)); - - // If a multi-architecture package exists, install that; otherwise install - // the single-architecture package. - final List packageNames = [ - // Multi-archtitecture package. - _getPackageName(binaryName, packageVersion, config), - // Single-archtitecture package. - _getPackageName(binaryName, packageVersion, config, architecture: 'x64'), - ]; - String? packageName; - String? buildDirectory; - String? packagePath; - for (final String name in packageNames) { - packageName = name; - buildDirectory = _fileSystem.path.join(binaryDir, '${packageName}_Test'); - if (_fileSystem.isDirectorySync(buildDirectory)) { - packagePath = _getAppPackagePath(buildDirectory); - if (packagePath != null && _fileSystem.isFileSync(packagePath)) { - break; - } - } - } - if (packagePath == null) { - _logger.printError('Failed to locate app package to install'); - return false; - } - - // Verify package signature. - if (!await _uwptool.isSignatureValid(packagePath)) { - // If signature is invalid, install the developer certificate. - final String certificatePath = _fileSystem.path.join(buildDirectory!, '$packageName.cer'); - if (_logger.terminal.stdinHasTerminal) { - final String response = await _logger.terminal.promptForCharInput( - ['Y', 'y', 'N', 'n'], - logger: _logger, - prompt: 'Install developer certificate.\n' - '\n' - 'Windows UWP apps are signed with a developer certificate during the build\n' - 'process. On the first install of an app with a signature from a new\n' - 'certificate, the certificate must be installed.\n' - '\n' - 'If desired, this certificate can later be removed by launching the \n' - '"Manage Computer Certificates" control panel from the Start menu and deleting\n' - 'the "CMake Test Cert" certificate from the "Trusted People" > "Certificates"\n' - 'section.\n' - '\n' - 'Press "Y" to continue, or "N" to cancel.', - displayAcceptedCharacters: false, - ); - if (response == 'N' || response == 'n') { - return false; - } - } - await _uwptool.installCertificate(certificatePath); - } - - // Install the application and dependencies. - final String packageUri = Uri.file(packagePath).toString(); - final List dependencyUris = _getDependencyPaths(buildDirectory!, 'x64') - .map((String path) => Uri.file(path).toString()) - .toList(); - return _uwptool.installApp(packageUri, dependencyUris); - } - - @override - Future isAppInstalled(covariant ApplicationPackage app, {String? userIdentifier}) async { - final String packageName = app.id; - return await _uwptool.getPackageFamilyName(packageName) != null; - } - - @override - Future isLatestBuildInstalled(covariant ApplicationPackage app) async => false; - - @override - Future get isLocalEmulator async => false; - - @override - DevicePortForwarder get portForwarder => const NoOpDevicePortForwarder(); - - @override - Future get sdkNameAndVersion async => ''; - - @override - Future startApp(covariant BuildableUwpApp package, { - String? mainPath, - String? route, - required DebuggingOptions debuggingOptions, - Map platformArgs = const {}, - bool prebuiltApplication = false, - bool ipv6 = false, - String? userIdentifier, - }) async { - _buildMode = debuggingOptions.buildInfo.mode; - if (!prebuiltApplication) { - await buildWindowsUwp( - package.project, - debuggingOptions.buildInfo, - target: mainPath, - ); - } - if (await isAppInstalled(package) && !await uninstallApp(package)) { - _logger.printError('Failed to uninstall previous app package'); - return LaunchResult.failed(); - } - if (!await installApp(package)) { - _logger.printError('Failed to install app package'); - return LaunchResult.failed(); - } - - final String packageName = package.id; - if (packageName == null) { - _logger.printError('Could not find PACKAGE_GUID in ${package.project.runnerCmakeFile.path}'); - return LaunchResult.failed(); - } - - final String? packageFamily = await _uwptool.getPackageFamilyName(packageName); - if (packageFamily == null) { - _logger.printError('Could not find package family name from $packageName'); - return LaunchResult.failed(); - } - - if (debuggingOptions.buildInfo.mode.isRelease) { - _processId = await _uwptool.launchApp(packageFamily, []); - return _processId != null ? LaunchResult.succeeded() : LaunchResult.failed(); - } - - /// If the terminal is attached, prompt the user to open the firewall port. - if (_logger.terminal.stdinHasTerminal) { - final String response = await _logger.terminal.promptForCharInput( - ['Y', 'y', 'N', 'n'], - logger: _logger, - prompt: 'Enable Flutter debugging from localhost.\n' - '\n' - 'Windows UWP apps run in a sandboxed environment. To enable Flutter debugging\n' - 'and hot reload, you will need to enable inbound connections to the app from the\n' - 'Flutter tool running on your machine. To do so:\n' - ' 1. Launch PowerShell as an Administrator\n' - ' 2. Enter the following command:\n' - ' checknetisolation loopbackexempt -is -n=$packageFamily\n' - '\n' - 'Press "Y" once this is complete, or "N" to abort.', - displayAcceptedCharacters: false, - ); - if (response == 'N' || response == 'n') { - return LaunchResult.failed(); - } - } - - /// Currently we do not have a way to discover the VM Service URI. - final int port = debuggingOptions.deviceVmServicePort ?? await _operatingSystemUtils.findFreePort(); - final List args = [ - '--observatory-port=$port', - '--disable-service-auth-codes', - '--enable-dart-profiling', - if (debuggingOptions.startPaused) '--start-paused', - if (debuggingOptions.useTestFonts) '--use-test-fonts', - if (debuggingOptions.debuggingEnabled) ...[ - '--enable-checked-mode', - '--verify-entry-points', - ], - if (debuggingOptions.enableSoftwareRendering) '--enable-software-rendering', - if (debuggingOptions.skiaDeterministicRendering) '--skia-deterministic-rendering', - if (debuggingOptions.traceSkia) '--trace-skia', - if (debuggingOptions.traceAllowlist != null) '--trace-allowlist="${debuggingOptions.traceAllowlist}"', - if (debuggingOptions.traceSkiaAllowlist != null) '--trace-skia-allowlist="${debuggingOptions.traceSkiaAllowlist}"', - if (debuggingOptions.endlessTraceBuffer) '--endless-trace-buffer', - if (debuggingOptions.dumpSkpOnShaderCompilation) '--dump-skp-on-shader-compilation', - if (debuggingOptions.verboseSystemLogs) '--verbose-logging', - if (debuggingOptions.cacheSkSL) '--cache-sksl', - if (debuggingOptions.purgePersistentCache) '--purge-persistent-cache', - if (platformArgs['trace-startup'] as bool? ?? false) '--trace-startup', - ]; - _processId = await _uwptool.launchApp(packageFamily, args); - if (_processId == null) { - return LaunchResult.failed(); - } - return LaunchResult.succeeded(observatoryUri: Uri.parse('http://localhost:$port')); - } - - @override - Future stopApp(covariant BuildableUwpApp app, {String? userIdentifier}) async { - if (_processId != null) { - return _processManager.killPid(_processId!); - } - return false; - } - - @override - Future uninstallApp(covariant BuildableUwpApp app, {String? userIdentifier}) async { - final String packageName = app.id; - if (packageName == null) { - _logger.printError('Could not find PACKAGE_GUID in ${app.project.runnerCmakeFile.path}'); - return false; - } - final String? packageFamily = await _uwptool.getPackageFamilyName(packageName); - if (packageFamily == null) { - // App is not installed. - return true; - } - return _uwptool.uninstallApp(packageFamily); - } - - @override - FutureOr supportsRuntimeMode(BuildMode buildMode) => buildMode != BuildMode.jitRelease; -} - class WindowsDevices extends PollingDeviceDiscovery { WindowsDevices({ required ProcessManager processManager, @@ -405,15 +74,11 @@ class WindowsDevices extends PollingDeviceDiscovery { required FileSystem fileSystem, required OperatingSystemUtils operatingSystemUtils, required WindowsWorkflow windowsWorkflow, - required FeatureFlags featureFlags, - required UwpTool uwptool, }) : _fileSystem = fileSystem, _logger = logger, _processManager = processManager, _operatingSystemUtils = operatingSystemUtils, _windowsWorkflow = windowsWorkflow, - _featureFlags = featureFlags, - _uwptool = uwptool, super('windows devices'); final FileSystem _fileSystem; @@ -421,8 +86,6 @@ class WindowsDevices extends PollingDeviceDiscovery { final ProcessManager _processManager; final OperatingSystemUtils _operatingSystemUtils; final WindowsWorkflow _windowsWorkflow; - final FeatureFlags _featureFlags; - final UwpTool _uwptool; @override bool get supportsPlatform => _windowsWorkflow.appliesToHostPlatform; @@ -442,14 +105,6 @@ class WindowsDevices extends PollingDeviceDiscovery { processManager: _processManager, operatingSystemUtils: _operatingSystemUtils, ), - if (_featureFlags.isWindowsUwpEnabled) - WindowsUWPDevice( - fileSystem: _fileSystem, - logger: _logger, - processManager: _processManager, - operatingSystemUtils: _operatingSystemUtils, - uwptool: _uwptool, - ) ]; } @@ -457,5 +112,5 @@ class WindowsDevices extends PollingDeviceDiscovery { Future> getDiagnostics() async => const []; @override - List get wellKnownIds => const ['windows', 'winuwp']; + List get wellKnownIds => const ['windows']; } diff --git a/packages/flutter_tools/templates/app/winuwp.tmpl/.gitignore b/packages/flutter_tools/templates/app/winuwp.tmpl/.gitignore deleted file mode 100644 index d492d0d98c8fd..0000000000000 --- a/packages/flutter_tools/templates/app/winuwp.tmpl/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/CMakeLists.txt.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/CMakeLists.txt.tmpl deleted file mode 100644 index 9827cf9923178..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/CMakeLists.txt.tmpl +++ /dev/null @@ -1,64 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) -project({{projectName}} LANGUAGES CXX) - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0079 NEW) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "{{projectName}}") - -# Define build configuration options. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100" /await) - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") - target_compile_definitions(${TARGET} PRIVATE WINUWP) - set_target_properties(${TARGET} PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.18362.0) -endfunction() - -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - -# Flutter library and tool build rules. -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner_uwp") - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/flutter/CMakeLists.txt b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/flutter/CMakeLists.txt deleted file mode 100644 index 9adbd9ddb310f..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/flutter/CMakeLists.txt +++ /dev/null @@ -1,92 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -include(CMakePrintHelpers) - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows_winuwp.dll") - -# === Assets === -set(CMAKE_INSTALL_MANIFEST "${EPHEMERAL_DIR}/install_manifest") -file(STRINGS ${CMAKE_INSTALL_MANIFEST} INSTALL_MANIFEST_CONTENT) - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(INSTALL_MANIFEST_CONTENT ${INSTALL_MANIFEST_CONTENT} PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/project_version b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/project_version deleted file mode 100644 index c227083464fb9..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/project_version +++ /dev/null @@ -1 +0,0 @@ -0 \ No newline at end of file diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeLists.txt.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeLists.txt.tmpl deleted file mode 100644 index 8dccdc465b189..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeLists.txt.tmpl +++ /dev/null @@ -1,141 +0,0 @@ -cmake_minimum_required (VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) - -include(CMakePrintHelpers) - -project (runner LANGUAGES CXX) - -# UWP tile and icon assets. -set(ASSET_FILES ${ASSET_FILES} - Assets/LargeTile.scale-100.png - Assets/LargeTile.scale-125.png - Assets/LargeTile.scale-150.png - Assets/LargeTile.scale-200.png - Assets/LargeTile.scale-400.png - Assets/LockScreenLogo.scale-200.png - Assets/SmallTile.scale-100.png - Assets/SmallTile.scale-125.png - Assets/SmallTile.scale-150.png - Assets/SmallTile.scale-200.png - Assets/SmallTile.scale-400.png - Assets/SplashScreen.scale-100.png - Assets/SplashScreen.scale-125.png - Assets/SplashScreen.scale-150.png - Assets/SplashScreen.scale-200.png - Assets/SplashScreen.scale-400.png - Assets/Square44x44Logo.altform-unplated_targetsize-16.png - Assets/Square44x44Logo.altform-unplated_targetsize-32.png - Assets/Square44x44Logo.altform-unplated_targetsize-48.png - Assets/Square44x44Logo.altform-unplated_targetsize-256.png - Assets/Square44x44Logo.scale-100.png - Assets/Square44x44Logo.scale-125.png - Assets/Square44x44Logo.scale-150.png - Assets/Square44x44Logo.scale-200.png - Assets/Square44x44Logo.scale-400.png - Assets/Square44x44Logo.targetsize-16.png - Assets/Square44x44Logo.targetsize-24.png - Assets/Square44x44Logo.targetsize-24_altform-unplated.png - Assets/Square44x44Logo.targetsize-32.png - Assets/Square44x44Logo.targetsize-48.png - Assets/Square44x44Logo.targetsize-256.png - Assets/Square150x150Logo.scale-100.png - Assets/Square150x150Logo.scale-125.png - Assets/Square150x150Logo.scale-150.png - Assets/Square150x150Logo.scale-200.png - Assets/Square150x150Logo.scale-400.png - Assets/StoreLogo.png - Assets/StoreLogo.scale-100.png - Assets/StoreLogo.scale-125.png - Assets/StoreLogo.scale-150.png - Assets/StoreLogo.scale-200.png - Assets/StoreLogo.scale-400.png - Assets/Wide310x150Logo.scale-200.png - Assets/WideTile.scale-100.png - Assets/WideTile.scale-125.png - Assets/WideTile.scale-150.png - Assets/WideTile.scale-200.png - Assets/WideTile.scale-400.png -) - -# Configure package manifest file. -set(APP_MANIFEST_NAME Package.appxmanifest) -set(APP_MANIFEST_TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}) -set(SHORT_NAME ${BINARY_NAME}) -set(PACKAGE_GUID "{{windowsIdentifier}}") - -configure_file( - appxmanifest.in - ${APP_MANIFEST_TARGET_LOCATION} - @ONLY) - -set(CONTENT_FILES ${APP_MANIFEST_TARGET_LOCATION}) - -# Configure package content files. -set_property(SOURCE ${CONTENT_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) - -set(RESOURCE_FILES ${ASSET_FILES} ${CONTENT_FILES} Windows_TemporaryKey.pfx) -set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_CONTENT 1) -set_property(SOURCE ${ASSET_FILES} PROPERTY VS_DEPLOYMENT_LOCATION "Assets") - -set(STRING_FILES Resources.pri) -set_property(SOURCE ${STRING_FILES} PROPERTY VS_TOOL_OVERRIDE "PRIResource") - -source_group("Resource Files" FILES ${RESOURCE_FILES} ${CONTENT_FILES} ${STRING_FILES}) - -# Configure Flutter assets using tool generated install manifest -foreach(ITEM ${INSTALL_MANIFEST_CONTENT}) - get_filename_component(ITEM_REL ${CMAKE_BINARY_DIR} DIRECTORY) - file(RELATIVE_PATH RELPATH ${ITEM_REL} ${ITEM}) - - get_filename_component(RELPATH ${RELPATH} DIRECTORY) - get_filename_component(ITEMEXT ${ITEM} LAST_EXT) - - if("${ITEMEXT}" STREQUAL ".dll" OR "${ITEMEXT}" STREQUAL ".pdb") - string(CONCAT RELPATH "") - elseif ("${ITEMEXT}" STREQUAL ".so") - file(RELATIVE_PATH RELPATH "${ITEM_REL}/winuwp" ${ITEM}) - string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) - string(CONCAT RELPATH "Assets\\Data") - elseif("${ITEMEXT}" STREQUAL ".dat") - string(CONCAT RELPATH "Assets\\Data") - else() - string(REGEX REPLACE "/" "\\\\" RELPATH ${RELPATH}) - string(CONCAT RELPATH "Assets\\Data\\" ${RELPATH}) - endif() - - cmake_print_variables(${RELPATH}) - - set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_CONTENT 1) - set_property(SOURCE ${ITEM} PROPERTY VS_DEPLOYMENT_LOCATION ${RELPATH}) -endforeach() - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable (${BINARY_NAME} WIN32 - main.cpp - flutter_frameworkview.cpp - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - ${RESOURCE_FILES} - ${INSTALL_MANIFEST_CONTENT} -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE WindowsApp flutter flutter_wrapper_app) -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeSettings.json b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeSettings.json deleted file mode 100644 index ba63a530d744e..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/CMakeSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. - "configurations": [ - { - "name": "Debug", - "generator": "Visual Studio 15 2017 Win64", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", - "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "Release", - "generator": "Visual Studio 15 2017 Win64", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", - "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - } - ] -} diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/appxmanifest.in b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/appxmanifest.in deleted file mode 100644 index 570d424ee8228..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/appxmanifest.in +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - @SHORT_NAME@ - CMake Test Cert - Assets/StoreLogo.png - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/flutter_frameworkview.cpp b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/flutter_frameworkview.cpp deleted file mode 100644 index bcdc73adbf667..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/flutter_frameworkview.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "winrt/Windows.ApplicationModel.Core.h" -#include "winrt/Windows.Foundation.h" -#include "winrt/Windows.System.Profile.h" -#include "winrt/Windows.System.Threading.h" -#include "winrt/Windows.UI.Core.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -struct FlutterFrameworkView - : winrt::implements< - FlutterFrameworkView, - winrt::Windows::ApplicationModel::Core::IFrameworkView> { - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void - Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const - &applicationView) { - - // Layout scaling must be disabled in the appinitialization phase in order - // to take effect correctly. - if (winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo() - .DeviceFamily() == L"Windows.Xbox") { - - bool result = winrt::Windows::UI::ViewManagement::ApplicationViewScaling:: - TrySetDisableLayoutScaling(true); - if (!result) { - OutputDebugString(L"Couldn't disable layout scaling"); - } - } - - main_view_ = applicationView; - main_view_.Activated({this, &FlutterFrameworkView::OnActivated}); - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Uninitialize() { - main_view_.Activated(nullptr); - main_view_ = nullptr; - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Load(winrt::hstring const &) {} - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - void Run() { - winrt::Windows::UI::Core::CoreWindow window = - winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread(); - - winrt::Windows::UI::Core::CoreDispatcher dispatcher = window.Dispatcher(); - dispatcher.ProcessEvents( - winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessUntilQuit); - } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkView| - winrt::Windows::Foundation::IAsyncAction - SetWindow(winrt::Windows::UI::Core::CoreWindow const &window) { - - // Capture reference to window. - window_ = window; - - // Lay out the window's content within the region occupied by the - // CoreWindow. - auto appView = winrt::Windows::UI::ViewManagement::ApplicationView:: - GetForCurrentView(); - - appView.SetDesiredBoundsMode(winrt::Windows::UI::ViewManagement:: - ApplicationViewBoundsMode::UseCoreWindow); - - // Configure folder paths. - try { - winrt::Windows::Storage::StorageFolder folder = - winrt::Windows::ApplicationModel::Package::Current() - .InstalledLocation(); - - winrt::Windows::Storage::StorageFolder assets = - co_await folder.GetFolderAsync(L"Assets"); - winrt::Windows::Storage::StorageFolder data = - co_await assets.GetFolderAsync(L"data"); - winrt::Windows::Storage::StorageFolder flutter_assets = - co_await data.GetFolderAsync(L"flutter_assets"); - winrt::Windows::Storage::StorageFile icu_data = - co_await data.GetFileAsync(L"icudtl.dat"); - -#if NDEBUG - winrt::Windows::Storage::StorageFile aot_data = - co_await data.GetFileAsync(L"app.so"); -#endif - - std::wstring flutter_assets_path{flutter_assets.Path()}; - std::wstring icu_data_path{icu_data.Path()}; - std::wstring aot_data_path { -#if NDEBUG - aot_data.Path() -#endif - }; - - flutter::DartProject project(flutter_assets_path, icu_data_path, - aot_data_path); - - // Construct viewcontroller using the Window and project - flutter_view_controller_ = std::make_unique( - static_cast(winrt::get_abi(main_view_)), - static_cast(winrt::get_abi(launch_args_)), - project); - - // If plugins present, register them. - RegisterPlugins(flutter_view_controller_.get()->engine()); - } catch (winrt::hresult_error &err) { - winrt::Windows::UI::Popups::MessageDialog md = - winrt::Windows::UI::Popups::MessageDialog::MessageDialog( - L"There was a problem starting the engine: " + err.message()); - md.ShowAsync(); - } - } - - void OnActivated( - winrt::Windows::ApplicationModel::Core::CoreApplicationView const - &applicationView, - winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const - &args) { - // Activate the application window, making it visible and enabling it to - // receive events. - applicationView.CoreWindow().Activate(); - - // Capture launch args to later pass to Flutter. - launch_args_ = args; - } - - // Current CoreApplicationView. - winrt::Windows::ApplicationModel::Core::CoreApplicationView main_view_{ - nullptr}; - - // Current CoreWindow. - winrt::Windows::UI::Core::CoreWindow window_{nullptr}; - - // Current FlutterViewController. - std::unique_ptr flutter_view_controller_{ - nullptr}; - - // Launch args that were passed in on activation. - winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs - launch_args_; -}; diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/main.cpp b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/main.cpp deleted file mode 100644 index 1ce54b1fc1203..0000000000000 --- a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/main.cpp +++ /dev/null @@ -1,30 +0,0 @@ - -#include - -#include "winrt/Windows.ApplicationModel.Core.h" -#include "winrt/Windows.Foundation.h" -#include -#include -#include - -#include - -#include "flutter_frameworkview.cpp" - -struct App - : winrt::implements< - App, winrt::Windows::ApplicationModel::Core::IFrameworkViewSource> { - App() { view_ = winrt::make_self(); } - - // |winrt::Windows::ApplicationModel::Core::IFrameworkViewSource| - winrt::Windows::ApplicationModel::Core::IFrameworkView CreateView() { - return view_.as(); - } - - winrt::com_ptr view_; -}; - -int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { - winrt::Windows::ApplicationModel::Core::CoreApplication::Run( - winrt::make()); -} diff --git a/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri.img.tmpl b/packages/flutter_tools/templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri.img.tmpl deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/packages/flutter_tools/templates/template_manifest.json b/packages/flutter_tools/templates/template_manifest.json index 44ded214f1e38..fe0c148b1169a 100644 --- a/packages/flutter_tools/templates/template_manifest.json +++ b/packages/flutter_tools/templates/template_manifest.json @@ -5,7 +5,6 @@ "templates/app/lib/main.dart.tmpl", "templates/app/pubspec.yaml.tmpl", "templates/app/README.md.tmpl", - "templates/app/winuwp.tmpl/.gitignore", "templates/app_shared/.gitignore.tmpl", "templates/app_shared/.idea/libraries/Dart_SDK.xml.tmpl", @@ -139,64 +138,6 @@ "templates/app_shared/windows.tmpl/runner/utils.h", "templates/app_shared/windows.tmpl/runner/win32_window.cpp", "templates/app_shared/windows.tmpl/runner/win32_window.h", - "templates/app_shared/winuwp.tmpl/CMakeLists.txt.tmpl", - "templates/app_shared/winuwp.tmpl/flutter/CMakeLists.txt", - "templates/app_shared/winuwp.tmpl/project_version", - "templates/app_shared/winuwp.tmpl/runner_uwp/appxmanifest.in", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LargeTile.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/LockScreenLogo.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SmallTile.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/SplashScreen.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square150x150Logo.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-16.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-256.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-32.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Square44x44Logo.targetsize-48.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/StoreLogo.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/Wide310x150Logo.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-100.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-125.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-150.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-200.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Assets/WideTile.scale-400.png.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/CMakeLists.txt.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/CMakeSettings.json", - "templates/app_shared/winuwp.tmpl/runner_uwp/flutter_frameworkview.cpp", - "templates/app_shared/winuwp.tmpl/runner_uwp/main.cpp", - "templates/app_shared/winuwp.tmpl/runner_uwp/resources.pri.img.tmpl", - "templates/app_shared/winuwp.tmpl/runner_uwp/Windows_TemporaryKey.pfx.img.tmpl", "templates/app_test_widget/test/widget_test.dart.tmpl", diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index eec556b9c359f..db1f92c49ba82 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -10,7 +10,6 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_windows.dart'; -import 'package:flutter_tools/src/commands/build_winuwp.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/windows/visual_studio.dart'; @@ -23,7 +22,6 @@ import '../../src/test_flutter_command_runner.dart'; const String flutterRoot = r'C:\flutter'; const String buildFilePath = r'C:\windows\CMakeLists.txt'; -const String buildUwpFilePath = r'C:\winuwp\CMakeLists.txt'; const String visualStudioPath = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community'; const String _cmakePath = visualStudioPath + r'\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe'; const String _defaultGenerator = 'Visual Studio 16 2019'; @@ -72,31 +70,19 @@ void main() { setUpMockCoreProjectFiles(); } - void setUpMockUwpFilesForBuild(int version) { - final Directory projectDirectory = (fileSystem.file(buildUwpFilePath) - ..createSync(recursive: true)) - .parent; - projectDirectory.childFile('project_version').writeAsString(version.toString()); - setUpMockCoreProjectFiles(); - } - // Returns the command matching the build_windows call to generate CMake // files. FakeCommand cmakeGenerationCommand({ void Function() onRun, - bool winuwp = false, String generator = _defaultGenerator, }) { return FakeCommand( command: [ _cmakePath, '-S', - fileSystem.path.dirname(winuwp ? buildUwpFilePath : buildFilePath), + fileSystem.path.dirname(buildFilePath), '-B', - if (winuwp) - r'build\winuwp' - else - r'build\windows', + r'build\windows', '-G', generator, ], @@ -109,20 +95,15 @@ void main() { bool verbose = false, void Function() onRun, String stdout = '', - bool winuwp = false, }) { return FakeCommand( command: [ _cmakePath, '--build', - if (winuwp) - r'build\winuwp' - else - r'build\windows', + r'build\windows', '--config', buildMode, - if (!winuwp) - ...['--target', 'INSTALL'], + ...['--target', 'INSTALL'], if (verbose) '--verbose' ], @@ -615,125 +596,6 @@ if %errorlevel% neq 0 goto :VCEnd FileSystemUtils: () => FileSystemUtils(fileSystem: fileSystem, platform: windowsPlatform), Usage: () => usage, }); - - testUsingContext('Windows UWP build fails when there is no windows project', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockCoreProjectFiles(); - - expect(createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ), throwsToolExit(message: 'No Windows UWP desktop project configured. See ' - 'https://docs.flutter.dev/desktop#add-desktop-support-to-an-existing-flutter-app ' - 'to learn about adding Windows support to a project.')); - }, overrides: { - Platform: () => windowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - }); - - testUsingContext('Windows build fails on non windows platform', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockUwpFilesForBuild(0); - - expect(createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ), throwsToolExit()); - }, overrides: { - Platform: () => notWindowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - }); - - testUsingContext('Windows UWP build fails on non windows platform', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockProjectFilesForBuild(); - - expect(createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ), throwsToolExit(message: '"build winuwp" only supported on Windows hosts.')); - }, overrides: { - Platform: () => notWindowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - }); - - testUsingContext('Windows UWP build fails when the project version is out of date', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockUwpFilesForBuild(-1); - - expect(createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ), throwsToolExit(message: 'The Windows UWP project template and build process has changed. ' - 'In order to build you must delete the winuwp directory and re-create the project')); - }, overrides: { - Platform: () => windowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - }); - - testUsingContext('Windows UWP build fails when feature is disabled', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockProjectFilesForBuild(); - - // This message should include 'To enable, run "flutter config --enable-windows-uwp-desktop"." - // once the `windowsUwpEmbedding` feature is available on all channels. - expect(createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ), throwsToolExit(message: RegExp(r'"build winuwp" is not currently supported\.$'))); - }, overrides: { - Platform: () => windowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(), - }); - - testUsingContext('Windows UWP build completes successfully', () async { - final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsUwpCommand command = BuildWindowsUwpCommand() - ..visualStudioOverride = fakeVisualStudio; - setUpMockUwpFilesForBuild(0); - - await createTestCommandRunner(command).run( - const ['winuwp', '--no-pub'] - ); - }, overrides: { - Platform: () => windowsPlatform, - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.list([ - const FakeCommand( - command: [ - r'C:\flutter\bin\flutter', - 'assemble', - '--no-version-check', - '--output=build', - '-dTargetPlatform=windows-uwp-x64', - '-dTrackWidgetCreation=true', - '-dBuildMode=release', - r'-dTargetFile=lib\main.dart', - '-dTreeShakeIcons="true"', - '-dDartObfuscation=false', - 'release_bundle_windows_assets_uwp' - ], - ), - cmakeGenerationCommand(winuwp: true), - buildCommand('Release', stdout: 'STDOUT STUFF', winuwp: true), - ]), - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - }); } class FakeVisualStudio extends Fake implements VisualStudio { diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 705bb44cd8b38..9fcd22515850d 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -811,7 +811,6 @@ void main() { expect(projectDir.childDirectory('macos'), isNot(exists)); expect(projectDir.childDirectory('windows'), isNot(exists)); expect(projectDir.childDirectory('web'), isNot(exists)); - expect(projectDir.childDirectory('winuwp'), isNot(exists)); }, overrides: { FeatureFlags: () => TestFeatureFlags(), }); @@ -830,42 +829,14 @@ void main() { expect(projectDir.childDirectory('macos'), isNot(exists)); expect(projectDir.childDirectory('windows'), isNot(exists)); expect(projectDir.childDirectory('web'), isNot(exists)); - expect(projectDir.childDirectory('winuwp'), isNot(exists)); expect(projectDir.childDirectory('example').childDirectory('linux'), isNot(exists)); expect(projectDir.childDirectory('example').childDirectory('macos'), isNot(exists)); expect(projectDir.childDirectory('example').childDirectory('windows'), isNot(exists)); expect(projectDir.childDirectory('example').childDirectory('web'), isNot(exists)); - expect(projectDir.childDirectory('example').childDirectory('winuwp'), isNot(exists)); }, overrides: { FeatureFlags: () => TestFeatureFlags(), }); - testUsingContext('app supports Windows UWP if requested', () async { - Cache.flutterRoot = '../..'; - - final CreateCommand command = CreateCommand(); - final CommandRunner runner = createTestCommandRunner(command); - - await runner.run([ - 'create', - '--no-pub', - '--platform=winuwp', - projectDir.path, - ]); - - expect(projectDir.childDirectory('linux'), isNot(exists)); - expect(projectDir.childDirectory('android'), isNot(exists)); - expect(projectDir.childDirectory('ios'), isNot(exists)); - expect(projectDir.childDirectory('windows'), isNot(exists)); - expect(projectDir.childDirectory('macos'), isNot(exists)); - expect(projectDir.childDirectory('web'), isNot(exists)); - expect(projectDir.childDirectory('winuwp'), exists); - expect(logger.errorText, isNot(contains(_kNoPlatformsMessage))); - }, overrides: { - FeatureFlags: () => TestFeatureFlags(isWindowsUwpEnabled: true), - Logger: () => logger, - }); - testUsingContext('app supports Linux if requested', () async { Cache.flutterRoot = '../..'; @@ -885,7 +856,6 @@ void main() { expect(projectDir.childDirectory('windows'), isNot(exists)); expect(projectDir.childDirectory('macos'), isNot(exists)); expect(projectDir.childDirectory('web'), isNot(exists)); - expect(projectDir.childDirectory('winuwp'), isNot(exists)); expect(logger.errorText, isNot(contains(_kNoPlatformsMessage))); }, overrides: { FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), diff --git a/packages/flutter_tools/test/general.shard/artifacts_test.dart b/packages/flutter_tools/test/general.shard/artifacts_test.dart index d906511a159e4..b4d5cab12e4de 100644 --- a/packages/flutter_tools/test/general.shard/artifacts_test.dart +++ b/packages/flutter_tools/test/general.shard/artifacts_test.dart @@ -141,18 +141,6 @@ void main() { artifacts.getArtifactPath(Artifact.flutterTester, platform: TargetPlatform.linux_arm64), fileSystem.path.join('root', 'bin', 'cache', 'artifacts', 'engine', 'linux-arm64', 'flutter_tester'), ); - expect( - artifacts.getArtifactPath(Artifact.windowsUwpDesktopPath, platform: TargetPlatform.windows_uwp_x64, mode: BuildMode.debug), - fileSystem.path.join('root', 'bin', 'cache', 'artifacts', 'engine', 'windows-uwp-x64-debug'), - ); - expect( - artifacts.getArtifactPath(Artifact.windowsUwpDesktopPath, platform: TargetPlatform.windows_uwp_x64, mode: BuildMode.profile), - fileSystem.path.join('root', 'bin', 'cache', 'artifacts', 'engine', 'windows-uwp-x64-profile'), - ); - expect( - artifacts.getArtifactPath(Artifact.windowsUwpDesktopPath, platform: TargetPlatform.windows_uwp_x64, mode: BuildMode.release), - fileSystem.path.join('root', 'bin', 'cache', 'artifacts', 'engine', 'windows-uwp-x64-release'), - ); expect( artifacts.getArtifactPath(Artifact.frontendServerSnapshotForEngineDartSdk), fileSystem.path.join('root', 'bin', 'cache', 'dart-sdk', 'bin', 'snapshots', 'frontend_server.dart.snapshot') @@ -358,20 +346,6 @@ void main() { expect(artifacts.getHostArtifact(HostArtifact.engineDartBinary).path, contains('.exe')); }); - testWithoutContext('Looks up windows UWP artifacts in host engine', () async { - artifacts = LocalEngineArtifacts( - fileSystem.path.join(fileSystem.currentDirectory.path, 'out', 'winuwp_debug_unopt'), - fileSystem.path.join(fileSystem.currentDirectory.path, 'out', 'winuwp_debug_unopt'), - cache: cache, - fileSystem: fileSystem, - platform: FakePlatform(operatingSystem: 'windows'), - processManager: FakeProcessManager.any(), - operatingSystemUtils: FakeOperatingSystemUtils(), - ); - - expect(artifacts.getArtifactPath(Artifact.windowsUwpDesktopPath), '/out/winuwp_debug_unopt'); - }); - testWithoutContext('Looks up dart on linux platforms', () async { expect(artifacts.getHostArtifact(HostArtifact.engineDartBinary).path, isNot(contains('.exe'))); }); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart index 6b97b1ed411b5..9ede15b792084 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart @@ -131,7 +131,6 @@ void main() { 'linux-x64': false, 'linux-arm64': false, 'windows-x64': false, - 'windows-uwp-x64': false, 'web-javascript': true, 'ios': false, 'android': false, diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart index 978901882a096..d88647f7dd2fc 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart @@ -125,107 +125,6 @@ void main() { ])); }); - testWithoutContext('UnpackWindowsUwp copies files to the correct winuwp/ cache directory', () async { - final Artifacts artifacts = Artifacts.test(); - final FileSystem fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); - final Environment environment = Environment.test( - fileSystem.currentDirectory, - artifacts: artifacts, - processManager: FakeProcessManager.any(), - fileSystem: fileSystem, - logger: BufferLogger.test(), - defines: { - kBuildMode: 'debug', - }, - ); - final DepfileService depfileService = DepfileService( - logger: BufferLogger.test(), - fileSystem: fileSystem, - ); - environment.buildDir.createSync(recursive: true); - - final String windowsDesktopPath = artifacts.getArtifactPath(Artifact.windowsUwpDesktopPath, platform: TargetPlatform.windows_x64, mode: BuildMode.debug); - final String windowsCppClientWrapper = artifacts.getArtifactPath(Artifact.windowsUwpCppClientWrapper, platform: TargetPlatform.windows_x64, mode: BuildMode.debug); - final String icuData = artifacts.getArtifactPath(Artifact.icuData, platform: TargetPlatform.windows_x64); - final List requiredFiles = [ - '$windowsDesktopPath\\flutter_export.h', - '$windowsDesktopPath\\flutter_messenger.h', - '$windowsDesktopPath\\flutter_windows_winuwp.dll', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.exp', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.lib', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.pdb', - '$windowsDesktopPath\\flutter_plugin_registrar.h', - '$windowsDesktopPath\\flutter_texture_registrar.h', - '$windowsDesktopPath\\flutter_windows.h', - icuData, - '$windowsCppClientWrapper\\foo', - r'C:\packages\flutter_tools\lib\src\build_system\targets\windows.dart', - ]; - - for (final String path in requiredFiles) { - fileSystem.file(path).createSync(recursive: true); - } - fileSystem.directory('windows').createSync(); - - await const UnpackWindowsUwp().build(environment); - - // Output files are copied correctly. - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_export.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_messenger.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.exp'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.lib'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.pdb'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_export.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_messenger.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_plugin_registrar.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_texture_registrar.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\ephemeral\flutter_windows.h'), exists); - expect(fileSystem.file(r'C:\winuwp\flutter\flutter_windows.h'), exists); - expect(fileSystem.file('C:\\winuwp\\flutter\\ephemeral\\$icuData'), exists); - expect(fileSystem.file('C:\\winuwp\\flutter\\ephemeral\\$windowsCppClientWrapper\\foo'), exists); - - final File outputDepfile = environment.buildDir - .childFile('windows_uwp_engine_sources.d'); - - // Depfile is created correctly. - expect(outputDepfile, exists); - - final List inputPaths = depfileService.parse(outputDepfile) - .inputs.map((File file) => file.path).toList(); - final List outputPaths = depfileService.parse(outputDepfile) - .outputs.map((File file) => file.path).toList(); - - // Depfile has expected sources. - expect(inputPaths, unorderedEquals([ - '$windowsDesktopPath\\flutter_export.h', - '$windowsDesktopPath\\flutter_messenger.h', - '$windowsDesktopPath\\flutter_windows_winuwp.dll', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.exp', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.lib', - '$windowsDesktopPath\\flutter_windows_winuwp.dll.pdb', - '$windowsDesktopPath\\flutter_plugin_registrar.h', - '$windowsDesktopPath\\flutter_texture_registrar.h', - '$windowsDesktopPath\\flutter_windows.h', - icuData, - '$windowsCppClientWrapper\\foo', - ])); - expect(outputPaths, unorderedEquals([ - r'C:\winuwp\flutter\ephemeral\flutter_export.h', - r'C:\winuwp\flutter\ephemeral\flutter_messenger.h', - r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll', - r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.exp', - r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.lib', - r'C:\winuwp\flutter\ephemeral\flutter_windows_winuwp.dll.pdb', - r'C:\winuwp\flutter\ephemeral\flutter_plugin_registrar.h', - r'C:\winuwp\flutter\ephemeral\flutter_texture_registrar.h', - r'C:\winuwp\flutter\ephemeral\flutter_windows.h', - r'C:\winuwp\flutter\flutter_windows.h', - 'C:\\winuwp\\flutter\\ephemeral\\$icuData', - 'C:\\winuwp\\flutter\\ephemeral\\$windowsCppClientWrapper\\foo', - ])); - }); - // AssetBundleFactory still uses context injection FileSystem fileSystem; @@ -288,7 +187,7 @@ void main() { environment.buildDir.childFile('app.so').createSync(recursive: true); - await const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64), uwp: false).build(environment); + await const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64)).build(environment); await const ProfileBundleWindowsAssets().build(environment); // Depfile is created and so is copied. @@ -301,60 +200,6 @@ void main() { ProcessManager: () => FakeProcessManager.any(), }); - testUsingContext('ReleaseBundleWindowsAssets creates correct bundle structure with UWP', () async { - final Environment environment = Environment.test( - fileSystem.currentDirectory, - artifacts: Artifacts.test(), - processManager: FakeProcessManager.any(), - fileSystem: fileSystem, - logger: BufferLogger.test(), - defines: { - kBuildMode: 'release', - } - ); - - environment.buildDir.childFile('app.so').createSync(recursive: true); - - await const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64), uwp: true).build(environment); - await const ReleaseBundleWindowsAssets().build(environment); - - // Depfile is created and so is copied. - expect(environment.buildDir.childFile('flutter_assets.d'), exists); - expect(fileSystem.file(r'C:\winuwp\app.so'), exists); - expect(fileSystem.file(r'C:\flutter_assets\kernel_blob.bin').existsSync(), false); - expect(fileSystem.file(r'C:\flutter_assets\AssetManifest.json'), exists); - }, overrides: { - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - }); - - testUsingContext('ProfileBundleWindowsAssets creates correct bundle structure with UWP', () async { - final Environment environment = Environment.test( - fileSystem.currentDirectory, - artifacts: Artifacts.test(), - processManager: FakeProcessManager.any(), - fileSystem: fileSystem, - logger: BufferLogger.test(), - defines: { - kBuildMode: 'profile', - } - ); - - environment.buildDir.childFile('app.so').createSync(recursive: true); - - await const WindowsAotBundle(AotElfProfile(TargetPlatform.windows_x64), uwp: true).build(environment); - await const ProfileBundleWindowsAssets().build(environment); - - // Depfile is created and so is copied. - expect(environment.buildDir.childFile('flutter_assets.d'), exists); - expect(fileSystem.file(r'C:\winuwp\app.so'), exists); - expect(fileSystem.file(r'C:\flutter_assets\kernel_blob.bin').existsSync(), false); - expect(fileSystem.file(r'C:\flutter_assets\AssetManifest.json'), exists); - }, overrides: { - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - }); - testUsingContext('ReleaseBundleWindowsAssets creates correct bundle structure', () async { final Environment environment = Environment.test( fileSystem.currentDirectory, @@ -369,7 +214,7 @@ void main() { environment.buildDir.childFile('app.so').createSync(recursive: true); - await const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64), uwp: false).build(environment); + await const WindowsAotBundle(AotElfRelease(TargetPlatform.windows_x64)).build(environment); await const ReleaseBundleWindowsAssets().build(environment); // Depfile is created and so is copied. diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart index 283c498563c64..a21cafc1e33d3 100644 --- a/packages/flutter_tools/test/general.shard/cache_test.dart +++ b/packages/flutter_tools/test/general.shard/cache_test.dart @@ -604,20 +604,6 @@ void main() { ])); }); - testWithoutContext('Windows UWP desktop artifacts include profile, debug, and release artifacts', () { - final Cache cache = Cache.test(processManager: FakeProcessManager.any()); - final WindowsUwpEngineArtifacts artifacts = WindowsUwpEngineArtifacts( - cache, - platform: FakePlatform(operatingSystem: 'windows'), - ); - - expect(artifacts.getBinaryDirs(), containsAll([ - contains(contains('profile')), - contains(contains('release')), - contains(contains('debug')), - ])); - }); - testWithoutContext('Linux desktop artifacts ignore filtering when requested', () { fakeProcessManager.addCommand(unameCommandForX64); diff --git a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart index 5cbea5fc0b927..0bd3de9fcc733 100644 --- a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart +++ b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart @@ -1054,7 +1054,4 @@ class FakeFlutterProject extends Fake implements FlutterProject { @override WindowsProject windows; - - @override - WindowsUwpProject windowsUwp; } diff --git a/packages/flutter_tools/test/general.shard/features_test.dart b/packages/flutter_tools/test/general.shard/features_test.dart index d8a460a581bf2..c7dcf5261d234 100644 --- a/packages/flutter_tools/test/general.shard/features_test.dart +++ b/packages/flutter_tools/test/general.shard/features_test.dart @@ -366,37 +366,5 @@ void main() { expect(featureFlags.isWindowsEnabled, true); }); - - // Windows UWP desktop - - testWithoutContext('Flutter Windows UWP desktop off by default on master', () { - final FeatureFlags featureFlags = createFlags('master'); - - expect(featureFlags.isWindowsUwpEnabled, false); - }); - - testWithoutContext('Flutter Windows UWP desktop enabled with config on master', () { - final FeatureFlags featureFlags = createFlags('master'); - testConfig.setValue('enable-windows-uwp-desktop', true); - - expect(featureFlags.isWindowsUwpEnabled, true); - }); - - testWithoutContext('Flutter Windows UWP desktop config includes removal warning', () { - expect(windowsUwpEmbedding.extraHelpText, contains('Windows UWP support is obsolete and will be removed')); - }); - - testWithoutContext('Flutter Windows UWP desktop off by default on stable', () { - final FeatureFlags featureFlags = createFlags('stable'); - - expect(featureFlags.isWindowsUwpEnabled, false); - }); - - testWithoutContext('Flutter Windows UWP desktop not enabled with config on stable', () { - final FeatureFlags featureFlags = createFlags('stable'); - testConfig.setValue('enable-windows-uwp-desktop', true); - - expect(featureFlags.isWindowsUwpEnabled, false); - }); }); } diff --git a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart index 18950258f985d..40ea7cea7031c 100644 --- a/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart +++ b/packages/flutter_tools/test/general.shard/plugin_parsing_test.dart @@ -272,8 +272,7 @@ void main() { ' windows:\n' ' pluginClass: WinSamplePlugin\n' ' supportedVariants:\n' - ' - win32\n' - ' - uwp\n'; + ' - win32\n'; final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap; final Plugin plugin = Plugin.fromYaml( @@ -288,7 +287,6 @@ void main() { final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey]! as WindowsPlugin; expect(windowsPlugin.supportedVariants, [ PluginPlatformVariant.win32, - PluginPlatformVariant.winuwp, ]); }); @@ -322,8 +320,7 @@ void main() { ' windows:\n' ' pluginClass: WinSamplePlugin\n' ' supportedVariants:\n' - ' - not_yet_invented_variant\n' - ' - uwp\n'; + ' - not_yet_invented_variant\n'; final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap; final Plugin plugin = Plugin.fromYaml( @@ -336,9 +333,7 @@ void main() { ); final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey]! as WindowsPlugin; - expect(windowsPlugin.supportedVariants, { - PluginPlatformVariant.winuwp, - }); + expect(windowsPlugin.supportedVariants, {}); }); testWithoutContext('Plugin parsing throws a fatal error on an empty plugin', () { diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index a51ffc89a366d..9eeadf7dea580 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -1682,9 +1682,6 @@ class FakeFlutterProject extends Fake implements FlutterProject { @override WindowsProject windows; - - @override - WindowsUwpProject windowsUwp; } class FakeMacOSProject extends Fake implements MacOSProject { diff --git a/packages/flutter_tools/test/general.shard/runner/local_engine_test.dart b/packages/flutter_tools/test/general.shard/runner/local_engine_test.dart index feff223c64319..55328826dccd6 100644 --- a/packages/flutter_tools/test/general.shard/runner/local_engine_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/local_engine_test.dart @@ -93,31 +93,6 @@ void main() { expect(logger.traceText, contains('Local engine source at /arbitrary/engine/src')); }); - testWithoutContext('treats winuwp_debug_unopt as a host engine', () async { - final FileSystem fileSystem = MemoryFileSystem.test(); - final Directory localEngine = fileSystem - .directory('$kArbitraryEngineRoot/src/out/winuwp_debug_unopt/') - ..createSync(recursive: true); - fileSystem.directory('$kArbitraryEngineRoot/src/out/winuwp_debug_unopt/').createSync(recursive: true); - - final BufferLogger logger = BufferLogger.test(); - final LocalEngineLocator localEngineLocator = LocalEngineLocator( - fileSystem: fileSystem, - flutterRoot: 'flutter/flutter', - logger: logger, - userMessages: UserMessages(), - platform: FakePlatform(environment: {}), - ); - - expect( - await localEngineLocator.findEnginePath(null, localEngine.path, null), - matchesEngineBuildPaths( - hostEngine: '/arbitrary/engine/src/out/winuwp_debug_unopt', - targetEngine: '/arbitrary/engine/src/out/winuwp_debug_unopt', - ), - ); - }); - testWithoutContext('works if --local-engine is specified and --local-engine-src-path ' 'is determined by --local-engine', () async { final FileSystem fileSystem = MemoryFileSystem.test(); diff --git a/packages/flutter_tools/test/general.shard/windows/install_manifest_test.dart b/packages/flutter_tools/test/general.shard/windows/install_manifest_test.dart deleted file mode 100644 index 2b7fdb8528226..0000000000000 --- a/packages/flutter_tools/test/general.shard/windows/install_manifest_test.dart +++ /dev/null @@ -1,144 +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:file/memory.dart'; -import 'package:file_testing/file_testing.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/base/platform.dart'; -import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/project.dart'; -import 'package:flutter_tools/src/windows/install_manifest.dart'; - -import '../../src/common.dart'; -import '../../src/context.dart'; - -final Platform platform = FakePlatform(operatingSystem: 'windows'); - -void main() { - FileSystem fileSystem; - - setUp(() { - fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows); - }); - - testUsingContext('Generates install manifest for a debug build', () async { - final Logger logger = BufferLogger.test(); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - final Directory buildDirectory = fileSystem.currentDirectory - .childDirectory('build') - .childDirectory('winuwp'); - - await createManifest( - logger: logger, - fileSystem: fileSystem, - platform: platform, - project: flutterProject.windowsUwp, - buildDirectory: buildDirectory, - buildInfo: BuildInfo.debug, - ); - - final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); - expect(manifest, exists); - expect(manifest.readAsLinesSync(), unorderedEquals([ - 'C:/build/flutter_assets/kernel_blob.bin', - 'C:/build/flutter_assets/AssetManifest.json', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', - 'C:/winuwp/flutter/ephemeral/icudtl.dat', - ])); - }, overrides: { - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - }); - - testUsingContext('Generates install manifest for a release build', () async { - final Logger logger = BufferLogger.test(); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - final Directory buildDirectory = fileSystem.currentDirectory - .childDirectory('build') - .childDirectory('winuwp'); - - await createManifest( - logger: logger, - fileSystem: fileSystem, - platform: platform, - project: flutterProject.windowsUwp, - buildDirectory: buildDirectory, - buildInfo: BuildInfo.release, - ); - - final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); - expect(manifest, exists); - expect(manifest.readAsLinesSync(), unorderedEquals([ - 'C:/build/winuwp/app.so', - 'C:/build/flutter_assets/AssetManifest.json', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', - 'C:/winuwp/flutter/ephemeral/icudtl.dat' - ])); - }, overrides: { - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - }); - - testUsingContext('Generates install manifest for a release build with assets', () async { - final BufferLogger logger = BufferLogger.test(); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - final Directory buildDirectory = fileSystem.currentDirectory - .childDirectory('build') - .childDirectory('winuwp'); - - fileSystem.currentDirectory.childDirectory('.dart_tool').childFile('package_config.json') - ..createSync(recursive: true) - ..writeAsStringSync(''' -{ - "configVersion": 2, - "packages": [] -} - -'''); - fileSystem.currentDirectory.childFile('pubspec.yaml') - ..createSync() - ..writeAsStringSync(''' -name: foo - -flutter: - assets: - - assets/foo.png - -'''); - fileSystem.currentDirectory - .childDirectory('assets') - .childFile('foo.png') - .createSync(recursive: true); - - await createManifest( - logger: logger, - fileSystem: fileSystem, - platform: platform, - project: flutterProject.windowsUwp, - buildDirectory: buildDirectory, - buildInfo: BuildInfo.release, - ); - - final File manifest = flutterProject.windowsUwp.ephemeralDirectory.childFile('install_manifest'); - expect(manifest, exists); - expect(manifest.readAsLinesSync(), unorderedEquals([ - 'C:/build/winuwp/app.so', - 'C:/build/flutter_assets/assets/foo.png', - 'C:/build/flutter_assets/AssetManifest.json', - 'C:/build/flutter_assets/FontManifest.json', - 'C:/build/flutter_assets/NOTICES.Z', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll', - 'C:/winuwp/flutter/ephemeral/flutter_windows_winuwp.dll.pdb', - 'C:/winuwp/flutter/ephemeral/icudtl.dat' - ])); - }, overrides: { - FileSystem: () => fileSystem, - ProcessManager: () => FakeProcessManager.any(), - }); -} diff --git a/packages/flutter_tools/test/general.shard/windows/plugins_test.dart b/packages/flutter_tools/test/general.shard/windows/plugins_test.dart index 68337306a2f48..45702779037ad 100644 --- a/packages/flutter_tools/test/general.shard/windows/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/plugins_test.dart @@ -13,7 +13,6 @@ import 'package:flutter_tools/src/plugins.dart'; import 'package:flutter_tools/src/project.dart'; import '../../src/common.dart'; -import '../../src/fakes.dart'; const TemplateRenderer renderer = MustacheTemplateRenderer(); @@ -63,94 +62,8 @@ void main() { contains('#include '), ); }); - - testWithoutContext('UWP injects plugins marked as UWP-compatible', () async { - final FileSystem fileSystem = MemoryFileSystem.test(); - setUpProject(fileSystem); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - await writeWindowsUwpPluginFiles(flutterProject, [ - Plugin( - name: 'test', - path: 'foo', - defaultPackagePlatforms: const {}, - pluginDartClassPlatforms: const {}, - platforms: const { - WindowsPlugin.kConfigKey: WindowsPlugin( - name: 'test', - pluginClass: 'Foo', - variants: {PluginPlatformVariant.winuwp}, - )}, - dependencies: [], - isDirectDependency: true, - ), - ], renderer); - - final Directory managed = flutterProject.windowsUwp.managedDirectory; - expect(flutterProject.windowsUwp.generatedPluginCmakeFile, exists); - expect(managed.childFile('generated_plugin_registrant.h'), exists); - expect( - managed.childFile('generated_plugin_registrant.cc').readAsStringSync(), - contains('#include '), - ); - }); - - testWithoutContext('UWP does not inject Win32-only plugins', () async { - final FileSystem fileSystem = MemoryFileSystem.test(); - setUpProject(fileSystem); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - await writeWindowsUwpPluginFiles(flutterProject, [ - Plugin( - name: 'test', - path: 'foo', - defaultPackagePlatforms: const {}, - pluginDartClassPlatforms: const {}, - platforms: const { - WindowsPlugin.kConfigKey: WindowsPlugin( - name: 'test', - pluginClass: 'Foo', - variants: {PluginPlatformVariant.win32}, - )}, - dependencies: [], - isDirectDependency: true, - ), - ], renderer); - - final Directory managed = flutterProject.windowsUwp.managedDirectory; - expect(flutterProject.windowsUwp.generatedPluginCmakeFile, exists); - expect(managed.childFile('generated_plugin_registrant.h'), exists); - expect( - managed.childFile('generated_plugin_registrant.cc').readAsStringSync(), - isNot(contains('#include ')), - ); - }); - - testWithoutContext('Symlink injection treats UWP as Win32', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - setUpProject(fileSystem); - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - flutterProject.flutterPluginsDependenciesFile.writeAsStringSync(kPluginDependencies); - - createPluginSymlinks( - flutterProject, - featureFlagsOverride: TestFeatureFlags(isWindowsUwpEnabled: true), - ); - - expect(flutterProject.windowsUwp.pluginSymlinkDirectory, exists); - - final Link link = flutterProject.windowsUwp.pluginSymlinkDirectory.listSync().single as Link; - - expect(link.path, '/winuwp/flutter/ephemeral/.plugin_symlinks/example'); - expect(link.targetSync(), r'C:\\example\\'); - }); } void setUpProject(FileSystem fileSystem) { fileSystem.file('pubspec.yaml').createSync(); - fileSystem.file('winuwp/CMakeLists.txt') - .createSync(recursive: true); - fileSystem.file('winuwp/project_version') - ..createSync(recursive: true) - ..writeAsStringSync('0'); } diff --git a/packages/flutter_tools/test/general.shard/windows/project_test.dart b/packages/flutter_tools/test/general.shard/windows/project_test.dart deleted file mode 100644 index 5a77c287c356b..0000000000000 --- a/packages/flutter_tools/test/general.shard/windows/project_test.dart +++ /dev/null @@ -1,138 +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. - -import 'package:file/file.dart'; -import 'package:file/memory.dart'; -import 'package:flutter_tools/src/project.dart'; - -import '../../src/common.dart'; - -const String kExampleManifest = r''' - - - - - - - - @SHORT_NAME@ - CMake Test Cert - Assets/StoreLogo.png - - - - - - - - - - - - - - - - - - - - - - -'''; - -void main() { - testWithoutContext('Project can parse the app version from the appx manifest', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - fileSystem.file('winuwp/runner_uwp/appxmanifest.in') - ..createSync(recursive: true) - ..writeAsStringSync(kExampleManifest); - - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - expect(flutterProject.windowsUwp.packageVersion, '2.3.1.4'); - }); - - testWithoutContext('Project returns null if appx manifest does not exist', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - expect(flutterProject.windowsUwp.packageVersion, null); - }); - - testWithoutContext('Project throws a tool exit if appxmanifest is not valid xml', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - fileSystem.file('winuwp/runner_uwp/appxmanifest.in') - ..createSync(recursive: true) - ..writeAsStringSync('['); - - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - expect(() => flutterProject.windowsUwp.packageVersion, throwsToolExit()); - }); - - testWithoutContext('Can parse the PACKAGE_GUID from the Cmake manifest', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - fileSystem.file('winuwp/runner_uwp/CMakeLists.txt') - ..createSync(recursive: true) - ..writeAsStringSync(r''' -cmake_minimum_required (VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) - -include(CMakePrintHelpers) - -project ("TestBedUWP") - -set(APP_MANIFEST_NAME Package.appxmanifest) -set(APP_MANIFEST_TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}) -set(SHORT_NAME ${BINARY_NAME}) -set(PACKAGE_GUID "F941A77F-8AE1-4E3E-9611-68FBD3C62AE8") - -'''); - - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - expect(flutterProject.windowsUwp.packageGuid, 'F941A77F-8AE1-4E3E-9611-68FBD3C62AE8'); - }); - - testWithoutContext('Returns null if the PACKAGE_GUID cannot be found in the Cmake file', () { - final FileSystem fileSystem = MemoryFileSystem.test(); - fileSystem.file('winuwp/runner_uwp/CMakeLists.txt') - ..createSync(recursive: true) - ..writeAsStringSync(r''' -cmake_minimum_required (VERSION 3.8) -set(CMAKE_SYSTEM_NAME WindowsStore) -set(CMAKE_SYSTEM_VERSION 10.0) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) - -include(CMakePrintHelpers) - -project ("TestBedUWP") - -set(APP_MANIFEST_NAME Package.appxmanifest) -set(APP_MANIFEST_TARGET_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${APP_MANIFEST_NAME}) -set(SHORT_NAME ${BINARY_NAME}) -'''); - - final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); - - expect(flutterProject.windowsUwp.packageGuid, null); - }); -} diff --git a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart index 4646884aecfef..9152d8201fee3 100644 --- a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart @@ -9,12 +9,9 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/windows/application_package.dart'; -import 'package:flutter_tools/src/windows/uwptool.dart'; import 'package:flutter_tools/src/windows/windows_device.dart'; import 'package:flutter_tools/src/windows/windows_workflow.dart'; import 'package:test/fake.dart'; @@ -42,46 +39,16 @@ void main() { expect(windowsDevice.supportsRuntimeMode(BuildMode.jitRelease), false); }); - testWithoutContext('WindowsUwpDevice defaults', () async { - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - expect(await windowsDevice.targetPlatform, TargetPlatform.windows_uwp_x64); - expect(windowsDevice.name, 'Windows (UWP)'); - expect(await windowsDevice.installApp(package), true); - expect(await windowsDevice.uninstallApp(package), true); - expect(await windowsDevice.isLatestBuildInstalled(package), false); - expect(await windowsDevice.isAppInstalled(package), false); - expect(windowsDevice.category, Category.desktop); - - expect(windowsDevice.supportsRuntimeMode(BuildMode.debug), true); - expect(windowsDevice.supportsRuntimeMode(BuildMode.profile), true); - expect(windowsDevice.supportsRuntimeMode(BuildMode.release), true); - expect(windowsDevice.supportsRuntimeMode(BuildMode.jitRelease), false); - }); - testWithoutContext('WindowsDevices does not list devices if the workflow is unsupported', () async { expect(await WindowsDevices( windowsWorkflow: WindowsWorkflow( featureFlags: TestFeatureFlags(), platform: FakePlatform(operatingSystem: 'windows'), ), - featureFlags: TestFeatureFlags(), operatingSystemUtils: FakeOperatingSystemUtils(), logger: BufferLogger.test(), processManager: FakeProcessManager.any(), fileSystem: MemoryFileSystem.test(), - uwptool: FakeUwpTool(), ).devices, []); }); @@ -95,61 +62,9 @@ void main() { logger: BufferLogger.test(), processManager: FakeProcessManager.any(), fileSystem: MemoryFileSystem.test(), - featureFlags: TestFeatureFlags(isWindowsEnabled: true), - uwptool: FakeUwpTool(), ).devices, hasLength(1)); }); - testWithoutContext('WindowsDevices lists a UWP Windows device if feature is enabled', () async { - final FeatureFlags featureFlags = TestFeatureFlags(isWindowsEnabled: true, isWindowsUwpEnabled: true); - expect(await WindowsDevices( - windowsWorkflow: WindowsWorkflow( - featureFlags: featureFlags, - platform: FakePlatform(operatingSystem: 'windows') - ), - operatingSystemUtils: FakeOperatingSystemUtils(), - logger: BufferLogger.test(), - processManager: FakeProcessManager.any(), - fileSystem: MemoryFileSystem.test(), - featureFlags: featureFlags, - uwptool: FakeUwpTool(), - ).devices, hasLength(2)); - }); - - testWithoutContext('WindowsDevices has windows and winuwp well known devices', () async { - final FeatureFlags featureFlags = TestFeatureFlags(isWindowsEnabled: true, isWindowsUwpEnabled: true); - expect(WindowsDevices( - windowsWorkflow: WindowsWorkflow( - featureFlags: featureFlags, - platform: FakePlatform(operatingSystem: 'windows') - ), - operatingSystemUtils: FakeOperatingSystemUtils(), - logger: BufferLogger.test(), - processManager: FakeProcessManager.any(), - fileSystem: MemoryFileSystem.test(), - featureFlags: featureFlags, - uwptool: FakeUwpTool(), - ).wellKnownIds, ['windows', 'winuwp']); - }); - - testWithoutContext('WindowsDevices ignores the timeout provided to discoverDevices', () async { - final WindowsDevices windowsDevices = WindowsDevices( - windowsWorkflow: WindowsWorkflow( - featureFlags: TestFeatureFlags(isWindowsEnabled: true), - platform: FakePlatform(operatingSystem: 'windows') - ), - operatingSystemUtils: FakeOperatingSystemUtils(), - logger: BufferLogger.test(), - processManager: FakeProcessManager.any(), - fileSystem: MemoryFileSystem.test(), - featureFlags: TestFeatureFlags(isWindowsEnabled: true), - uwptool: FakeUwpTool(), - ); - // Timeout ignored. - final List devices = await windowsDevices.discoverDevices(timeout: const Duration(seconds: 10)); - expect(devices, hasLength(1)); - }); - testWithoutContext('isSupportedForProject is true with editable host app', () async { final FileSystem fileSystem = MemoryFileSystem.test(); final WindowsDevice windowsDevice = setUpWindowsDevice(fileSystem: fileSystem); @@ -191,196 +106,6 @@ void main() { expect(windowsDevice.executablePathForDevice(fakeApp, BuildMode.profile), 'profile/executable'); expect(windowsDevice.executablePathForDevice(fakeApp, BuildMode.release), 'release/executable'); }); - - testWithoutContext('WinUWPDevice installs cert if not installed', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - uwptool.hasValidSignature = false; - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - final bool result = await windowsDevice.installApp(package); - - expect(result, isTrue); - expect(uwptool.installCertRequests, hasLength(1)); - expect(uwptool.installAppRequests, hasLength(1)); - }); - - testWithoutContext('WinUWPDevice does not install cert if not installed', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - uwptool.hasValidSignature = true; - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - final bool result = await windowsDevice.installApp(package); - - expect(result, isTrue); - expect(uwptool.installCertRequests, isEmpty); - expect(uwptool.installAppRequests, hasLength(1)); - }); - - testWithoutContext('WinUWPDevice prefers installing multi-arch binaries', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - final String singleArchPath = fileSystem.path.absolute(fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - )); - fileSystem.file(singleArchPath).createSync(recursive:true); - final String multiArchPath = fileSystem.path.absolute(fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_Debug_Test', 'testapp_1.2.3.4_Debug.msix', - )); - fileSystem.file(multiArchPath).createSync(recursive:true); - final bool result = await windowsDevice.installApp(package); - - expect(result, isTrue); - expect(uwptool.installAppRequests.single.packageUri, Uri.file(multiArchPath).toString()); - }); - - testWithoutContext('WinUWPDevice falls back to installing single-arch binaries', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - final String singleArchPath = fileSystem.path.absolute(fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - )); - fileSystem.file(singleArchPath).createSync(recursive:true); - final bool result = await windowsDevice.installApp(package); - - expect(result, isTrue); - expect(uwptool.installAppRequests.single.packageUri, Uri.file(singleArchPath).toString()); - }); - - testWithoutContext('WinUWPDevice can launch application if cert is installed', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - uwptool.hasValidSignature = true; - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - final LaunchResult result = await windowsDevice.startApp( - package, - debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), - prebuiltApplication: true, - platformArgs: {}, - ); - - expect(result.started, true); - expect(uwptool.installCertRequests, isEmpty); - expect(uwptool.launchAppRequests.single.packageFamily, 'PACKAGE-ID_publisher'); - expect(uwptool.launchAppRequests.single.args, [ - '--observatory-port=12345', - '--disable-service-auth-codes', - '--enable-dart-profiling', - '--enable-checked-mode', - '--verify-entry-points', - ]); - }); - - testWithoutContext('WinUWPDevice installs cert and can launch application if cert not installed', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - uwptool.hasValidSignature = false; - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Debug_Test', 'testapp_1.2.3.4_x64_Debug.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - final LaunchResult result = await windowsDevice.startApp( - package, - debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), - prebuiltApplication: true, - platformArgs: {}, - ); - - expect(result.started, true); - expect(uwptool.installCertRequests, isNotEmpty); - expect(uwptool.launchAppRequests.single.packageFamily, 'PACKAGE-ID_publisher'); - expect(uwptool.launchAppRequests.single.args, [ - '--observatory-port=12345', - '--disable-service-auth-codes', - '--enable-dart-profiling', - '--enable-checked-mode', - '--verify-entry-points', - ]); - }); - - testWithoutContext('WinUWPDevice can launch application in release mode', () async { - Cache.flutterRoot = ''; - final FakeUwpTool uwptool = FakeUwpTool(); - final FileSystem fileSystem = MemoryFileSystem.test(); - final WindowsUWPDevice windowsDevice = setUpWindowsUwpDevice( - fileSystem: fileSystem, - uwptool: uwptool, - ); - final FakeBuildableUwpApp package = FakeBuildableUwpApp(); - - final String packagePath = fileSystem.path.join( - 'build', 'winuwp', 'runner_uwp', 'AppPackages', 'testapp', - 'testapp_1.2.3.4_x64_Release_Test', 'testapp_1.2.3.4_x64_Release.msix', - ); - fileSystem.file(packagePath).createSync(recursive:true); - final LaunchResult result = await windowsDevice.startApp( - package, - debuggingOptions: DebuggingOptions.enabled(BuildInfo.release), - prebuiltApplication: true, - platformArgs: {}, - ); - - expect(result.started, true); - expect(uwptool.launchAppRequests.single.packageFamily, 'PACKAGE-ID_publisher'); - expect(uwptool.launchAppRequests.single.args, []); - }); } FlutterProject setUpFlutterProject(Directory directory) { @@ -404,119 +129,7 @@ WindowsDevice setUpWindowsDevice({ ); } -WindowsUWPDevice setUpWindowsUwpDevice({ - FileSystem fileSystem, - Logger logger, - ProcessManager processManager, - UwpTool uwptool, -}) { - return WindowsUWPDevice( - fileSystem: fileSystem ?? MemoryFileSystem.test(), - logger: logger ?? BufferLogger.test(), - processManager: processManager ?? FakeProcessManager.any(), - operatingSystemUtils: FakeOperatingSystemUtils(), - uwptool: uwptool ?? FakeUwpTool(), - ); -} - class FakeWindowsApp extends Fake implements WindowsApp { @override String executable(BuildMode buildMode) => '${buildMode.name}/executable'; } - -class FakeBuildableUwpApp extends Fake implements BuildableUwpApp { - @override - String get id => 'PACKAGE-ID'; - @override - String get name => 'testapp'; - @override - String get projectVersion => '1.2.3.4'; - - // Test helper to get the expected package family. - static const String packageFamily = 'PACKAGE-ID_publisher'; -} - -class FakeUwpTool implements UwpTool { - bool isInstalled = false; - bool hasValidSignature = false; - final List<_GetPackageFamilyRequest> getPackageFamilyRequests = <_GetPackageFamilyRequest>[]; - final List<_LaunchAppRequest> launchAppRequests = <_LaunchAppRequest>[]; - final List<_InstallCertRequest> installCertRequests = <_InstallCertRequest>[]; - final List<_InstallAppRequest> installAppRequests = <_InstallAppRequest>[]; - final List<_UninstallAppRequest> uninstallAppRequests = <_UninstallAppRequest>[]; - - @override - Future> listApps() async { - return isInstalled ? [FakeBuildableUwpApp.packageFamily] : []; - } - - @override - Future getPackageFamilyName(String packageName) async { - getPackageFamilyRequests.add(_GetPackageFamilyRequest(packageName)); - return isInstalled ? FakeBuildableUwpApp.packageFamily : null; - } - - @override - Future launchApp(String packageFamily, List args) async { - launchAppRequests.add(_LaunchAppRequest(packageFamily, args)); - return 42; - } - - @override - Future isSignatureValid(String packagePath) async { - return hasValidSignature; - } - - @override - Future installCertificate(String certificatePath) async { - installCertRequests.add(_InstallCertRequest(certificatePath)); - return true; - } - - @override - Future installApp(String packageUri, List dependencyUris) async { - installAppRequests.add(_InstallAppRequest(packageUri, dependencyUris)); - isInstalled = true; - return true; - } - - @override - Future uninstallApp(String packageFamily) async { - uninstallAppRequests.add(_UninstallAppRequest(packageFamily)); - isInstalled = false; - return true; - } -} - -class _GetPackageFamilyRequest { - const _GetPackageFamilyRequest(this.packageId); - - final String packageId; -} - -class _LaunchAppRequest { - const _LaunchAppRequest(this.packageFamily, this.args); - - final String packageFamily; - final List args; -} - -class _InstallCertRequest { - const _InstallCertRequest(this.certificatePath); - - final String certificatePath; -} - - -class _InstallAppRequest { - const _InstallAppRequest(this.packageUri, this.dependencyUris); - - final String packageUri; - final List dependencyUris; -} - -class _UninstallAppRequest { - const _UninstallAppRequest(this.packageFamily); - - final String packageFamily; -} diff --git a/packages/flutter_tools/test/src/fakes.dart b/packages/flutter_tools/test/src/fakes.dart index 8ace19f6ade14..230c0302c7d2a 100644 --- a/packages/flutter_tools/test/src/fakes.dart +++ b/packages/flutter_tools/test/src/fakes.dart @@ -425,7 +425,6 @@ class TestFeatureFlags implements FeatureFlags { this.isIOSEnabled = true, this.isFuchsiaEnabled = false, this.areCustomDevicesEnabled = false, - this.isWindowsUwpEnabled = false, }); @override @@ -455,9 +454,6 @@ class TestFeatureFlags implements FeatureFlags { @override final bool areCustomDevicesEnabled; - @override - final bool isWindowsUwpEnabled; - @override bool isEnabled(Feature feature) { switch (feature) { @@ -479,8 +475,6 @@ class TestFeatureFlags implements FeatureFlags { return isFuchsiaEnabled; case flutterCustomDevicesFeature: return areCustomDevicesEnabled; - case windowsUwpEmbedding: - return isWindowsUwpEnabled; } return false; } From e1d21cf2565e1f81b08e9b7e0dcf92ce25a02d63 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 14:29:07 -0400 Subject: [PATCH 090/108] Roll Engine from d5b381c2e56d to 3f27923c7e6c (2 revisions) (#102588) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-mac.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 0fd5076e42244..7b02b7bf9f556 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -d5b381c2e56d76ff56f4fcd4d53c84325c186182 +3f27923c7e6c06624fceefa59f8acfa749584847 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 1bcedb32f599e..fadb71ff11095 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -Jki3kG8_PI7MxcaiJMq3S_hlIs_wVuqBMOWOnuEHaw0C +V9WZPjuRB6MuqnFOtwwCpQ836OCACOlommBDJRphsswC From 3d4a1723e30ba9d9da51d85b482b1f6cfe07ec16 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Apr 2022 12:44:08 -0700 Subject: [PATCH 091/108] [framework] Reland: use ImageFilter for zoom page transition (#102552) --- .../src/material/page_transitions_theme.dart | 12 +++- .../material/page_transitions_theme_test.dart | 58 +++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index be8e5bb07d302..60e54894d3bdf 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -318,7 +318,11 @@ class _ZoomEnterTransition extends StatelessWidget { }, child: FadeTransition( opacity: fadeTransition, - child: ScaleTransition(scale: scaleTransition, child: child), + child: ScaleTransition( + scale: scaleTransition, + filterQuality: FilterQuality.low, + child: child, + ), ), ); } @@ -363,7 +367,11 @@ class _ZoomExitTransition extends StatelessWidget { return FadeTransition( opacity: fadeTransition, - child: ScaleTransition(scale: scaleTransition, child: child), + child: ScaleTransition( + scale: scaleTransition, + filterQuality: FilterQuality.low, + child: child, + ), ); } } diff --git a/packages/flutter/test/material/page_transitions_theme_test.dart b/packages/flutter/test/material/page_transitions_theme_test.dart index 749588c6f5155..4899c835aa799 100644 --- a/packages/flutter/test/material/page_transitions_theme_test.dart +++ b/packages/flutter/test/material/page_transitions_theme_test.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -220,4 +221,61 @@ void main() { await tester.pumpAndSettle(); expect(builtCount, 1); }, variant: TargetPlatformVariant.only(TargetPlatform.android)); + + testWidgets('_ZoomPageTransition uses a FilterQuality while animating', (WidgetTester tester) async { + final Map routes = { + '/': (BuildContext context) => Material( + child: TextButton( + child: const Text('push'), + onPressed: () { Navigator.of(context).pushNamed('/b'); }, + ), + ), + '/b': (BuildContext context) => StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return TextButton( + child: const Text('pop'), + onPressed: () { Navigator.pop(context); }, + ); + }, + ), + }; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: ZoomPageTransitionsBuilder(), // creates a _ZoomPageTransition + }, + ), + ), + routes: routes, + ), + ); + + expect(tester.layers, isNot(contains(isA()))); + + await tester.tap(find.text('push')); + await tester.pump(); + await tester.pump(); + + expect(tester.layers, contains(isA())); + expect(tester.layers.whereType(), hasLength(1)); + + await tester.pumpAndSettle(); + + expect(tester.layers, isNot(contains(isA()))); + + await tester.tap(find.text('pop')); + await tester.pump(); + await tester.pump(); + + expect(tester.layers, contains(isA())); + // exiting requires two different zooms. + expect(tester.layers.whereType(), hasLength(2)); + + await tester.pumpAndSettle(); + + expect(tester.layers, isNot(contains(isA()))); + }, variant: TargetPlatformVariant.only(TargetPlatform.android)); } From 79d4bdd1595dbeeaaf1a94789177860fc9072133 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 15:54:07 -0400 Subject: [PATCH 092/108] Roll Engine from 3f27923c7e6c to b30b65a74554 (1 revision) (#102594) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 7b02b7bf9f556..d5c65d74c3136 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -3f27923c7e6c06624fceefa59f8acfa749584847 +b30b65a74554945a19b31f66a10a3372a10d0e85 From dacab7de3a1b81d263aee87a2529a9db0d5e2da2 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 26 Apr 2022 13:29:08 -0700 Subject: [PATCH 093/108] Improve efficiency of copying the animation ObserverList in notifyListeners (#102536) --- packages/flutter/lib/src/animation/listener_helpers.dart | 4 ++-- packages/flutter/lib/src/foundation/observer_list.dart | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/animation/listener_helpers.dart b/packages/flutter/lib/src/animation/listener_helpers.dart index ebf2943bd99a5..55cbd048e467b 100644 --- a/packages/flutter/lib/src/animation/listener_helpers.dart +++ b/packages/flutter/lib/src/animation/listener_helpers.dart @@ -137,7 +137,7 @@ mixin AnimationLocalListenersMixin { @protected @pragma('vm:notify-debugger-on-exception') void notifyListeners() { - final List localListeners = List.of(_listeners); + final List localListeners = _listeners.toList(growable: false); for (final VoidCallback listener in localListeners) { InformationCollector? collector; assert(() { @@ -226,7 +226,7 @@ mixin AnimationLocalStatusListenersMixin { @protected @pragma('vm:notify-debugger-on-exception') void notifyStatusListeners(AnimationStatus status) { - final List localListeners = List.of(_statusListeners); + final List localListeners = _statusListeners.toList(growable: false); for (final AnimationStatusListener listener in localListeners) { try { if (_statusListeners.contains(listener)) diff --git a/packages/flutter/lib/src/foundation/observer_list.dart b/packages/flutter/lib/src/foundation/observer_list.dart index c4683a09ed466..22c2389cebeb3 100644 --- a/packages/flutter/lib/src/foundation/observer_list.dart +++ b/packages/flutter/lib/src/foundation/observer_list.dart @@ -76,6 +76,11 @@ class ObserverList extends Iterable { @override bool get isNotEmpty => _list.isNotEmpty; + + @override + List toList({bool growable = true}) { + return _list.toList(growable: growable); + } } /// A list optimized for the observer pattern, but for larger numbers of observers. From 4a2ed00231bc5f1a11cf3e1723cf29e36efdef15 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Tue, 26 Apr 2022 13:30:45 -0700 Subject: [PATCH 094/108] [flutter_tools] Add entries to HostArtifacts for impellerc, libtessellator (#102593) --- packages/flutter_tools/lib/src/artifacts.dart | 93 ++++++++++++------- .../test/general.shard/artifacts_test.dart | 8 ++ 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index b53bca9ca5860..bf7635aeecb77 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -92,8 +92,14 @@ enum HostArtifact { idevicesyslog, idevicescreenshot, iproxy, + /// The root of the sky_engine package. skyEnginePath, + + // The Impeller shader compiler. + impellerc, + // Impeller's tessellation library. + libtessellator, } // TODO(knopp): Remove once darwin artifacts are universal and moved out of darwin-x64 @@ -202,8 +208,14 @@ String? _artifactToFileName(Artifact artifact, [ TargetPlatform? platform, Build } } -String _hostArtifactToFileName(HostArtifact artifact, bool windows) { - final String exe = windows ? '.exe' : ''; +String _hostArtifactToFileName(HostArtifact artifact, Platform platform) { + final String exe = platform.isWindows ? '.exe' : ''; + String dll = '.so'; + if (platform.isWindows) { + dll = '.dll'; + } else if (platform.isMacOS) { + dll = '.dylib'; + } switch (artifact) { case HostArtifact.flutterWebSdk: return ''; @@ -247,6 +259,10 @@ String _hostArtifactToFileName(HostArtifact artifact, bool windows) { case HostArtifact.webPrecompiledCanvaskitSoundSdkSourcemaps: case HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps: return 'dart_sdk.js.map'; + case HostArtifact.impellerc: + return 'impellerc$exe'; + case HostArtifact.libtessellator: + return 'libtessellator$dll'; } } @@ -337,63 +353,68 @@ class CachedArtifacts implements Artifacts { final String path = _dartSdkPath(_cache); return _fileSystem.directory(path); case HostArtifact.engineDartBinary: - final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.flutterWebSdk: final String path = _getFlutterWebSdkPath(); return _fileSystem.directory(path); case HostArtifact.flutterWebLibrariesJson: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPlatformKernelDill: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPlatformSoundKernelDill: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledSdk: case HostArtifact.webPrecompiledSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitSdk: case HostArtifact.webPrecompiledCanvaskitSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitAndHtmlSdk: case HostArtifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledSoundSdk: case HostArtifact.webPrecompiledSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitSoundSdk: case HostArtifact.webPrecompiledCanvaskitSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdk: case HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.idevicesyslog: case HostArtifact.idevicescreenshot: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName); case HostArtifact.skyEnginePath: final Directory dartPackageDirectory = _cache.getCacheDir('pkg'); - final String path = _fileSystem.path.join(dartPackageDirectory.path, _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(dartPackageDirectory.path, _hostArtifactToFileName(artifact, _platform)); return _fileSystem.directory(path); case HostArtifact.dart2jsSnapshot: case HostArtifact.dartdevcSnapshot: case HostArtifact.kernelWorkerSnapshot: - final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.iosDeploy: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName); case HostArtifact.iproxy: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName); + case HostArtifact.impellerc: + case HostArtifact.libtessellator: + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); + final String engineDir = _getEngineArtifactsPath(_currentHostPlatform(_platform, _operatingSystemUtils))!; + return _fileSystem.file(_fileSystem.path.join(engineDir, artifactFileName)); } } @@ -757,67 +778,71 @@ class CachedLocalEngineArtifacts implements LocalEngineArtifacts { final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk'); return _fileSystem.directory(path); case HostArtifact.engineDartBinary: - final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.dart2jsSnapshot: - final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.dartdevcSnapshot: - final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_dartSdkPath(_cache), 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.kernelWorkerSnapshot: - final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.flutterWebSdk: final String path = _getFlutterWebSdkPath(); return _fileSystem.directory(path); case HostArtifact.flutterWebLibrariesJson: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPlatformKernelDill: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPlatformSoundKernelDill: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledSdk: case HostArtifact.webPrecompiledSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitSdk: case HostArtifact.webPrecompiledCanvaskitSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitAndHtmlSdk: case HostArtifact.webPrecompiledCanvaskitAndHtmlSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledSoundSdk: case HostArtifact.webPrecompiledSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitSoundSdk: case HostArtifact.webPrecompiledCanvaskitSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdk: case HostArtifact.webPrecompiledCanvaskitAndHtmlSoundSdkSourcemaps: - final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html-sound', _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(_getFlutterWebSdkPath(), 'kernel', 'amd-canvaskit-html-sound', _hostArtifactToFileName(artifact, _platform)); return _fileSystem.file(path); case HostArtifact.idevicesyslog: case HostArtifact.idevicescreenshot: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('libimobiledevice').childFile(artifactFileName); case HostArtifact.skyEnginePath: final Directory dartPackageDirectory = _cache.getCacheDir('pkg'); - final String path = _fileSystem.path.join(dartPackageDirectory.path, _hostArtifactToFileName(artifact, _platform.isWindows)); + final String path = _fileSystem.path.join(dartPackageDirectory.path, _hostArtifactToFileName(artifact, _platform)); return _fileSystem.directory(path); case HostArtifact.iosDeploy: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('ios-deploy').childFile(artifactFileName); case HostArtifact.iproxy: - final String artifactFileName = _hostArtifactToFileName(artifact, _platform.isWindows); + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); return _cache.getArtifactDirectory('usbmuxd').childFile(artifactFileName); + case HostArtifact.impellerc: + case HostArtifact.libtessellator: + final String artifactFileName = _hostArtifactToFileName(artifact, _platform); + return _fileSystem.file(_fileSystem.path.join(_hostEngineOutPath, artifactFileName)); } } diff --git a/packages/flutter_tools/test/general.shard/artifacts_test.dart b/packages/flutter_tools/test/general.shard/artifacts_test.dart index b4d5cab12e4de..aed3eb9285104 100644 --- a/packages/flutter_tools/test/general.shard/artifacts_test.dart +++ b/packages/flutter_tools/test/general.shard/artifacts_test.dart @@ -315,6 +315,14 @@ void main() { fileSystem.path.join('/out', 'host_debug_unopt', 'dart-sdk', 'bin', 'snapshots', 'frontend_server.dart.snapshot') ); + expect( + artifacts.getHostArtifact(HostArtifact.impellerc).path, + fileSystem.path.join('/out', 'host_debug_unopt', 'impellerc'), + ); + expect( + artifacts.getHostArtifact(HostArtifact.libtessellator).path, + fileSystem.path.join('/out', 'host_debug_unopt', 'libtessellator.so'), + ); }); testWithoutContext('getEngineType', () { From d69816163ef6d48dcb20f0cdeddf2d7894db7108 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Tue, 26 Apr 2022 13:34:06 -0700 Subject: [PATCH 095/108] Enable Mac/android arm64 tests as `bringup: true` (#102589) --- .ci.yaml | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/.ci.yaml b/.ci.yaml index 8322c8c8b45d2..33a869f0de3ee 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -108,6 +108,25 @@ platform_properties: os: Mac-12 cpu: x86 device_os: N + mac_arm64_android: + properties: + caches: >- + [ + {"name":"builder_mac_devicelab","path":"builder"}, + {"name":"android_sdk","path":"android"}, + {"name":"flutter_sdk","path":"flutter sdk"}, + {"name":"gradle","path":"gradle"}, + {"name":"openjdk_11","path":"java"}, + {"name":"pub_cache","path":".pub-cache"} + ] + dependencies: >- + [ + {"dependency": "android_sdk", "version": "version:31v8"}, + {"dependency": "open_jdk", "version": "11"} + ] + os: Mac-12 + cpu: arm64 + device_os: N mac_ios: properties: caches: >- @@ -3110,6 +3129,17 @@ targets: task_name: hello_world_android__compile scheduler: luci + - name: Mac_arm64_android hello_world_android__compile + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # Flaky: https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","android","mac","arm64"] + task_name: hello_world_android__compile + scheduler: luci + - name: Mac_android hot_mode_dev_cycle__benchmark recipe: devicelab/devicelab_drone presubmit: false @@ -3130,6 +3160,17 @@ targets: task_name: integration_test_test scheduler: luci + - name: Mac_arm64_android integration_test_test + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # Flaky: https://github.com/flutter/flutter/issues/87508 + timeout: 60 + properties: + tags: > + ["devicelab","android","mac","arm64"] + task_name: integration_test_test + scheduler: luci + - name: Mac_android integration_ui_frame_number recipe: devicelab/devicelab_drone presubmit: false @@ -3161,6 +3202,19 @@ targets: task_name: run_release_test scheduler: luci + - name: Mac_arm64_android run_release_test + recipe: devicelab/devicelab_drone + presubmit: false + bringup: true # Flaky: https://github.com/flutter/flutter/issues/87508 + runIf: + - dev/** + timeout: 60 + properties: + tags: > + ["devicelab","android","mac","arm64"] + task_name: run_release_test + scheduler: luci + - name: Mac_android flutter_gallery_mac__start_up recipe: devicelab/devicelab_drone presubmit: false From c6af38c7f74cda9dfd164ecd6142c6120622173a Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Tue, 26 Apr 2022 14:24:09 -0700 Subject: [PATCH 096/108] Fix docs re: return value of Navigator's restorable methods (#102595) --- .../flutter/lib/src/widgets/navigator.dart | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/packages/flutter/lib/src/widgets/navigator.dart b/packages/flutter/lib/src/widgets/navigator.dart index 93d0bc5f21839..c64eac58cc678 100644 --- a/packages/flutter/lib/src/widgets/navigator.dart +++ b/packages/flutter/lib/src/widgets/navigator.dart @@ -1531,15 +1531,17 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the route. /// /// To use [pushNamed], an [Navigator.onGenerateRoute] callback must be /// provided, /// {@endtemplate} /// + /// {@template flutter.widgets.navigator.pushNamed.returnValue} + /// Returns a [Future] that completes to the `result` value passed to [pop] + /// when the pushed route is popped off the navigator. + /// {@endtemplate} + /// /// {@template flutter.widgets.Navigator.pushNamed} /// The provided `arguments` are passed to the pushed route via /// [RouteSettings.arguments]. Any object can be passed as `arguments` (e.g. a @@ -1699,9 +1701,6 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the new route, /// and `TO` is the type of the return value of the old route. /// @@ -1709,6 +1708,8 @@ class Navigator extends StatefulWidget { /// be provided. /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -1793,16 +1794,14 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the new route, /// and `TO` is the return value type of the old route. /// /// To use [popAndPushNamed], a [Navigator.onGenerateRoute] callback must be provided. - /// /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -1898,15 +1897,14 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the new route. /// /// To use [pushNamedAndRemoveUntil], an [Navigator.onGenerateRoute] callback /// must be provided. /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -1982,12 +1980,11 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the route. /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: @@ -2068,13 +2065,12 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the new route, /// and `TO` is the type of the return value of the old route. /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: @@ -2155,12 +2151,11 @@ class Navigator extends StatefulWidget { /// Ongoing gestures within the current route are canceled when a new route is /// pushed. /// - /// Returns a [Future] that completes to the `result` value passed to [pop] - /// when the pushed route is popped off the navigator. - /// /// The `T` type argument is the type of the return value of the new route. /// {@endtemplate} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: @@ -4078,6 +4073,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.pushNamed} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -4145,6 +4142,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.pushReplacementNamed} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -4215,6 +4214,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.popAndPushNamed} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -4278,6 +4279,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.pushNamedAndRemoveUntil} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@macro flutter.widgets.Navigator.pushNamed} /// /// {@tool snippet} @@ -4346,6 +4349,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.push} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: @@ -4493,6 +4498,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.pushReplacement} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: @@ -4578,6 +4585,8 @@ class NavigatorState extends State with TickerProviderStateMixin, Res /// /// {@macro flutter.widgets.navigator.pushAndRemoveUntil} /// + /// {@macro flutter.widgets.navigator.pushNamed.returnValue} + /// /// {@tool snippet} /// /// Typical usage is as follows: From 2032de4b314d5c44e88b4d54c5eee86d01916204 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 17:29:05 -0400 Subject: [PATCH 097/108] Roll Engine from b30b65a74554 to 545a0b4ad107 (4 revisions) (#102599) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index d5c65d74c3136..bd7b40ca50f36 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -b30b65a74554945a19b31f66a10a3372a10d0e85 +545a0b4ad107425c6a7fa7cd6c57314672d83130 From e493d5ce73b39402a82ba8c8b800a0f1e1fd6377 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 18:39:03 -0400 Subject: [PATCH 098/108] Roll Engine from 545a0b4ad107 to 07584c64bb7b (3 revisions) (#102603) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index bd7b40ca50f36..62e6786a530c2 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -545a0b4ad107425c6a7fa7cd6c57314672d83130 +07584c64bb7ba8d9e79214c3667cdb16cfa67923 From fba9214d11ee73e235a9d995557478b03efefe87 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Apr 2022 16:14:04 -0700 Subject: [PATCH 099/108] [framework] remove usage and deprecate physical model layer (#102274) --- packages/flutter/lib/src/rendering/flex.dart | 22 +- packages/flutter/lib/src/rendering/flow.dart | 21 +- packages/flutter/lib/src/rendering/layer.dart | 8 + .../flutter/lib/src/rendering/object.dart | 12 + .../flutter/lib/src/rendering/proxy_box.dart | 219 ++++++++++++------ .../lib/src/rendering/shifted_box.dart | 23 +- .../test/material/chip_filter_test.dart | 2 + .../test/material/chip_input_test.dart | 2 + .../test/material/outlined_button_test.dart | 45 ---- .../test/material/range_slider_test.dart | 4 +- .../flutter/test/material/slider_test.dart | 5 +- .../test/material/slider_theme_test.dart | 2 + .../test/material/toggle_buttons_test.dart | 26 +++ .../material/toggle_buttons_theme_test.dart | 6 + .../flutter/test/rendering/debug_test.dart | 2 +- .../test/rendering/proxy_box_test.dart | 99 +++----- .../test/widgets/mouse_region_test.dart | 2 +- .../test/widgets/nested_scroll_view_test.dart | 39 ++-- .../test/widgets/physical_model_test.dart | 24 -- .../flutter/test/widgets/transform_test.dart | 9 +- 20 files changed, 279 insertions(+), 293 deletions(-) diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart index 99107df196b26..04043d0d11b74 100644 --- a/packages/flutter/lib/src/rendering/flex.dart +++ b/packages/flutter/lib/src/rendering/flex.dart @@ -1083,20 +1083,14 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin _clipRectLayer = LayerHandle(); diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index 4644180ddfbc3..b7f468acfaf14 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -1972,12 +1972,20 @@ class BackdropFilterLayer extends ContainerLayer { /// When debugging, setting [debugDisablePhysicalShapeLayers] to true will cause this /// layer to be skipped (directly replaced by its children). This can be helpful /// to track down the cause of performance problems. +@Deprecated( + 'Use a clip and canvas operations directly (See RenderPhysicalModel). ' + 'This feature was deprecated after v2.13.0-0.0.pre.', +) class PhysicalModelLayer extends ContainerLayer { /// Creates a composited layer that uses a physical model to producing /// lighting effects. /// /// The [clipPath], [clipBehavior], [elevation], [color], and [shadowColor] /// arguments must be non-null before the compositing phase of the pipeline. + @Deprecated( + 'Use a clip and canvas operations directly (See RenderPhysicalModel). ' + 'This feature was deprecated after v2.13.0-0.0.pre.', + ) PhysicalModelLayer({ Path? clipPath, Clip clipBehavior = Clip.none, diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index c517ae1a64c61..73648a23de8c4 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -491,6 +491,10 @@ class PaintingContext extends ClipContext { /// (e.g. from opacity layer to a clip rect layer). /// {@endtemplate} ClipRectLayer? pushClipRect(bool needsCompositing, Offset offset, Rect clipRect, PaintingContextCallback painter, { Clip clipBehavior = Clip.hardEdge, ClipRectLayer? oldLayer }) { + if (clipBehavior == Clip.none) { + painter(this, offset); + return null; + } final Rect offsetClipRect = clipRect.shift(offset); if (needsCompositing) { final ClipRectLayer layer = oldLayer ?? ClipRectLayer(); @@ -526,6 +530,10 @@ class PaintingContext extends ClipContext { /// {@macro flutter.rendering.PaintingContext.pushClipRect.oldLayer} ClipRRectLayer? pushClipRRect(bool needsCompositing, Offset offset, Rect bounds, RRect clipRRect, PaintingContextCallback painter, { Clip clipBehavior = Clip.antiAlias, ClipRRectLayer? oldLayer }) { assert(clipBehavior != null); + if (clipBehavior == Clip.none) { + painter(this, offset); + return null; + } final Rect offsetBounds = bounds.shift(offset); final RRect offsetClipRRect = clipRRect.shift(offset); if (needsCompositing) { @@ -562,6 +570,10 @@ class PaintingContext extends ClipContext { /// {@macro flutter.rendering.PaintingContext.pushClipRect.oldLayer} ClipPathLayer? pushClipPath(bool needsCompositing, Offset offset, Rect bounds, Path clipPath, PaintingContextCallback painter, { Clip clipBehavior = Clip.antiAlias, ClipPathLayer? oldLayer }) { assert(clipBehavior != null); + if (clipBehavior == Clip.none) { + painter(this, offset); + return null; + } final Rect offsetBounds = bounds.shift(offset); final Path offsetClipPath = clipPath.shift(offset); if (needsCompositing) { diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index 7e45a9d82d606..28b5990eff91b 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -1827,9 +1827,6 @@ abstract class _RenderPhysicalModelBase extends _RenderCustomClip { markNeedsPaint(); } - @override - bool get alwaysNeedsCompositing => true; - @override void describeSemanticsConfiguration(SemanticsConfiguration config) { super.describeSemanticsConfiguration(config); @@ -1845,6 +1842,8 @@ abstract class _RenderPhysicalModelBase extends _RenderCustomClip { } } +final Paint _transparentPaint = Paint()..color = const Color(0x00000000); + /// Creates a physical model layer that clips its child to a rounded /// rectangle. /// @@ -1873,9 +1872,6 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase { _shape = shape, _borderRadius = borderRadius; - @override - PhysicalModelLayer? get layer => super.layer as PhysicalModelLayer?; - /// The shape of the layer. /// /// Defaults to [BoxShape.rectangle]. The [borderRadius] affects the corners @@ -1933,42 +1929,79 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase { @override void paint(PaintingContext context, Offset offset) { - if (child != null) { - _updateClip(); - final RRect offsetRRect = _clip!.shift(offset); - final Rect offsetBounds = offsetRRect.outerRect; - final Path offsetRRectAsPath = Path()..addRRect(offsetRRect); - bool paintShadows = true; - assert(() { - if (debugDisableShadows) { - if (elevation > 0.0) { - context.canvas.drawRRect( - offsetRRect, - Paint() - ..color = shadowColor - ..style = PaintingStyle.stroke - ..strokeWidth = elevation * 2.0, - ); - } - paintShadows = false; - } - return true; - }()); - layer ??= PhysicalModelLayer(); - layer! - ..clipPath = offsetRRectAsPath - ..clipBehavior = clipBehavior - ..elevation = paintShadows ? elevation : 0.0 - ..color = color - ..shadowColor = shadowColor; - context.pushLayer(layer!, super.paint, offset, childPaintBounds: offsetBounds); - assert(() { - layer!.debugCreator = debugCreator; - return true; - }()); - } else { + if (child == null) { layer = null; + return; } + + _updateClip(); + final RRect offsetRRect = _clip!.shift(offset); + final Rect offsetBounds = offsetRRect.outerRect; + final Path offsetRRectAsPath = Path()..addRRect(offsetRRect); + bool paintShadows = true; + assert(() { + if (debugDisableShadows) { + if (elevation > 0.0) { + context.canvas.drawRRect( + offsetRRect, + Paint() + ..color = shadowColor + ..style = PaintingStyle.stroke + ..strokeWidth = elevation * 2.0, + ); + } + paintShadows = false; + } + return true; + }()); + + final Canvas canvas = context.canvas; + if (elevation != 0.0 && paintShadows) { + // The drawShadow call doesn't add the region of the shadow to the + // picture's bounds, so we draw a hardcoded amount of extra space to + // account for the maximum potential area of the shadow. + // TODO(jsimmons): remove this when Skia does it for us. + canvas.drawRect( + offsetBounds.inflate(20.0), + _transparentPaint, + ); + canvas.drawShadow( + offsetRRectAsPath, + shadowColor, + elevation, + color.alpha != 0xFF, + ); + } + final bool usesSaveLayer = clipBehavior == Clip.antiAliasWithSaveLayer; + if (!usesSaveLayer) { + canvas.drawRRect( + offsetRRect, + Paint()..color = color + ); + } + layer = context.pushClipRRect( + needsCompositing, + offset, + Offset.zero & size, + _clip!, + (PaintingContext context, Offset offset) { + if (usesSaveLayer) { + // If we want to avoid the bleeding edge artifact + // (https://github.com/flutter/flutter/issues/18057#issue-328003931) + // using saveLayer, we have to call drawPaint instead of drawPath as + // anti-aliased drawPath will always have such artifacts. + context.canvas.drawPaint( Paint()..color = color); + } + super.paint(context, offset); + }, + oldLayer: layer as ClipRRectLayer?, + clipBehavior: clipBehavior, + ); + + assert(() { + layer?.debugCreator = debugCreator; + return true; + }()); } @override @@ -2006,9 +2039,6 @@ class RenderPhysicalShape extends _RenderPhysicalModelBase { assert(color != null), assert(shadowColor != null); - @override - PhysicalModelLayer? get layer => super.layer as PhysicalModelLayer?; - @override Path get _defaultClip => Path()..addRect(Offset.zero & size); @@ -2025,41 +2055,78 @@ class RenderPhysicalShape extends _RenderPhysicalModelBase { @override void paint(PaintingContext context, Offset offset) { - if (child != null) { - _updateClip(); - final Rect offsetBounds = offset & size; - final Path offsetPath = _clip!.shift(offset); - bool paintShadows = true; - assert(() { - if (debugDisableShadows) { - if (elevation > 0.0) { - context.canvas.drawPath( - offsetPath, - Paint() - ..color = shadowColor - ..style = PaintingStyle.stroke - ..strokeWidth = elevation * 2.0, - ); - } - paintShadows = false; - } - return true; - }()); - layer ??= PhysicalModelLayer(); - layer! - ..clipPath = offsetPath - ..clipBehavior = clipBehavior - ..elevation = paintShadows ? elevation : 0.0 - ..color = color - ..shadowColor = shadowColor; - context.pushLayer(layer!, super.paint, offset, childPaintBounds: offsetBounds); - assert(() { - layer!.debugCreator = debugCreator; - return true; - }()); - } else { + if (child == null) { layer = null; + return; } + + _updateClip(); + final Rect offsetBounds = offset & size; + final Path offsetPath = _clip!.shift(offset); + bool paintShadows = true; + assert(() { + if (debugDisableShadows) { + if (elevation > 0.0) { + context.canvas.drawPath( + offsetPath, + Paint() + ..color = shadowColor + ..style = PaintingStyle.stroke + ..strokeWidth = elevation * 2.0, + ); + } + paintShadows = false; + } + return true; + }()); + + final Canvas canvas = context.canvas; + if (elevation != 0.0 && paintShadows) { + // The drawShadow call doesn't add the region of the shadow to the + // picture's bounds, so we draw a hardcoded amount of extra space to + // account for the maximum potential area of the shadow. + // TODO(jsimmons): remove this when Skia does it for us. + canvas.drawRect( + offsetBounds.inflate(20.0), + _transparentPaint, + ); + canvas.drawShadow( + offsetPath, + shadowColor, + elevation, + color.alpha != 0xFF, + ); + } + final bool usesSaveLayer = clipBehavior == Clip.antiAliasWithSaveLayer; + if (!usesSaveLayer) { + canvas.drawPath( + offsetPath, + Paint()..color = color + ); + } + layer = context.pushClipPath( + needsCompositing, + offset, + Offset.zero & size, + _clip!, + (PaintingContext context, Offset offset) { + if (usesSaveLayer) { + // If we want to avoid the bleeding edge artifact + // (https://github.com/flutter/flutter/issues/18057#issue-328003931) + // using saveLayer, we have to call drawPaint instead of drawPath as + // anti-aliased drawPath will always have such artifacts. + context.canvas.drawPaint( Paint()..color = color); + } + super.paint(context, offset); + }, + oldLayer: layer as ClipPathLayer?, + clipBehavior: clipBehavior, + ); + + assert(() { + layer?.debugCreator = debugCreator; + return true; + }()); } @override diff --git a/packages/flutter/lib/src/rendering/shifted_box.dart b/packages/flutter/lib/src/rendering/shifted_box.dart index 7ecdbb2b21ac3..1d989ad322eb2 100644 --- a/packages/flutter/lib/src/rendering/shifted_box.dart +++ b/packages/flutter/lib/src/rendering/shifted_box.dart @@ -799,20 +799,15 @@ class RenderConstraintsTransformBox extends RenderAligningShiftedBox with DebugO return; } - if (clipBehavior == Clip.none) { - _clipRectLayer.layer = null; - super.paint(context, offset); - } else { - // We have overflow and the clipBehavior isn't none. Clip it. - _clipRectLayer.layer = context.pushClipRect( - needsCompositing, - offset, - Offset.zero & size, - super.paint, - clipBehavior: clipBehavior, - oldLayer: _clipRectLayer.layer, - ); - } + // We have overflow and the clipBehavior isn't none. Clip it. + _clipRectLayer.layer = context.pushClipRect( + needsCompositing, + offset, + Offset.zero & size, + super.paint, + clipBehavior: clipBehavior, + oldLayer: _clipRectLayer.layer, + ); // Display the overflow indicator. assert(() { diff --git a/packages/flutter/test/material/chip_filter_test.dart b/packages/flutter/test/material/chip_filter_test.dart index 3405f3b6fc262..773aadae18770 100644 --- a/packages/flutter/test/material/chip_filter_test.dart +++ b/packages/flutter/test/material/chip_filter_test.dart @@ -64,6 +64,8 @@ void expectCheckmarkColor(Finder finder, Color color) { expect( finder, paints + // Physical model path + ..path() // The first path that is painted is the selection overlay. We do not care // how it is painted but it has to be added it to this pattern so that the // check mark can be checked next. diff --git a/packages/flutter/test/material/chip_input_test.dart b/packages/flutter/test/material/chip_input_test.dart index 84929d3eaeb9e..6c6ca97bf0bb2 100644 --- a/packages/flutter/test/material/chip_input_test.dart +++ b/packages/flutter/test/material/chip_input_test.dart @@ -64,6 +64,8 @@ void expectCheckmarkColor(Finder finder, Color color) { expect( finder, paints + // Physical model layer path + ..path() // The first path that is painted is the selection overlay. We do not care // how it is painted but it has to be added it to this pattern so that the // check mark can be checked next. diff --git a/packages/flutter/test/material/outlined_button_test.dart b/packages/flutter/test/material/outlined_button_test.dart index ecbf00c3cd514..d899247065c99 100644 --- a/packages/flutter/test/material/outlined_button_test.dart +++ b/packages/flutter/test/material/outlined_button_test.dart @@ -852,10 +852,6 @@ void main() { ), ); } - - // 116 = 16 + 'button'.length * 14 + 16, horizontal padding = 16 - const Rect clipRect = Rect.fromLTRB(0.0, 0.0, 116.0, 36.0); - final Path clipPath = Path()..addRect(clipRect); final Finder outlinedButton = find.byType(OutlinedButton); BorderSide getBorderSide() { @@ -873,12 +869,6 @@ void main() { // Expect that the button is disabled and painted with the disabled border color. expect(tester.widget(outlinedButton).enabled, false); expect(getBorderSide(), disabledBorderSide); - _checkPhysicalLayer( - tester.element(outlinedButton), - fillColor, - clipPath: clipPath, - clipRect: clipRect, - ); // Pump a new button with a no-op onPressed callback to make it enabled. await tester.pumpWidget( @@ -896,23 +886,11 @@ void main() { // Wait for the border's color to change to pressed await tester.pump(const Duration(milliseconds: 200)); expect(getBorderSide(), pressedBorderSide); - _checkPhysicalLayer( - tester.element(outlinedButton), - fillColor, - clipPath: clipPath, - clipRect: clipRect, - ); // Tap gesture completes, button returns to its initial configuration. await gesture.up(); await tester.pumpAndSettle(); expect(getBorderSide(), enabledBorderSide); - _checkPhysicalLayer( - tester.element(outlinedButton), - fillColor, - clipPath: clipPath, - clipRect: clipRect, - ); }); testWidgets('OutlinedButton has no clip by default', (WidgetTester tester) async { @@ -1748,29 +1726,6 @@ void main() { }); } -PhysicalModelLayer _findPhysicalLayer(Element element) { - expect(element, isNotNull); - RenderObject? object = element.renderObject; - while (object != null && object is! RenderRepaintBoundary && object is! RenderView) { - object = object.parent as RenderObject?; - } - expect(object!.debugLayer, isNotNull); - expect(object.debugLayer!.firstChild, isA()); - final PhysicalModelLayer layer = object.debugLayer!.firstChild! as PhysicalModelLayer; - final Layer child = layer.firstChild!; - return child is PhysicalModelLayer ? child : layer; -} - -void _checkPhysicalLayer(Element element, Color expectedColor, { Path? clipPath, Rect? clipRect }) { - final PhysicalModelLayer expectedLayer = _findPhysicalLayer(element); - expect(expectedLayer.elevation, 0.0); - expect(expectedLayer.color, expectedColor); - if (clipPath != null) { - expect(clipRect, isNotNull); - expect(expectedLayer.clipPath, coversSameAreaAs(clipPath, areaToCompare: clipRect!.inflate(10.0))); - } -} - TextStyle _iconStyle(WidgetTester tester, IconData icon) { final RichText iconRichText = tester.widget( find.descendant(of: find.byIcon(icon), matching: find.byType(RichText)), diff --git a/packages/flutter/test/material/range_slider_test.dart b/packages/flutter/test/material/range_slider_test.dart index 6e8595bf0d87e..c3d0b6989b214 100644 --- a/packages/flutter/test/material/range_slider_test.dart +++ b/packages/flutter/test/material/range_slider_test.dart @@ -1360,7 +1360,7 @@ void main() { ); // Represents the Raised Button and Range Slider. - expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 3)); + expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 4)); expect(valueIndicatorBox, paintsExactlyCountTimes(#drawParagraph, 3)); await tester.tap(find.text('Next')); @@ -1379,7 +1379,7 @@ void main() { ); // Represents the raised button with inner page text. - expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 1)); + expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 2)); expect(valueIndicatorBox, paintsExactlyCountTimes(#drawParagraph, 1)); // Don't stop holding the value indicator. diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart index 543831055c32f..c2c8b6d4a5af0 100644 --- a/packages/flutter/test/material/slider_test.dart +++ b/packages/flutter/test/material/slider_test.dart @@ -784,6 +784,7 @@ void main() { expect( valueIndicatorBox, paints + ..rrect(color: const Color(0xfffafafa)) ..rrect(color: customColor1) // active track ..rrect(color: customColor2) // inactive track ..circle(color: customColor1.withOpacity(0.12)) // overlay @@ -2415,7 +2416,7 @@ void main() { ..paragraph(), ); - expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 2)); + expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 3)); expect(valueIndicatorBox, paintsExactlyCountTimes(#drawParagraph, 2)); await tester.tap(find.text('Next')); @@ -2432,7 +2433,7 @@ void main() { ); // Represents the ElevatedButton with inner Text, inner page. - expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 1)); + expect(valueIndicatorBox, paintsExactlyCountTimes(#drawPath, 2)); expect(valueIndicatorBox, paintsExactlyCountTimes(#drawParagraph, 1)); // Don't stop holding the value indicator. diff --git a/packages/flutter/test/material/slider_theme_test.dart b/packages/flutter/test/material/slider_theme_test.dart index 93e607ca6e10d..e890fdd064dc2 100644 --- a/packages/flutter/test/material/slider_theme_test.dart +++ b/packages/flutter/test/material/slider_theme_test.dart @@ -1134,6 +1134,8 @@ void main() { expect( valueIndicatorBox, paints + // physical model + ..rrect() ..rrect(rrect: RRect.fromLTRBAndCorners( 24.0, 298.0, 24.0, 302.0, topLeft: const Radius.circular(2.0), diff --git a/packages/flutter/test/material/toggle_buttons_test.dart b/packages/flutter/test/material/toggle_buttons_test.dart index 7937117d917a9..55ddfa378f67d 100644 --- a/packages/flutter/test/material/toggle_buttons_test.dart +++ b/packages/flutter/test/material/toggle_buttons_test.dart @@ -1015,6 +1015,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: theme.colorScheme.onSurface.withOpacity(0.12), @@ -1042,6 +1044,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: theme.colorScheme.onSurface.withOpacity(0.12), @@ -1068,6 +1072,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: theme.colorScheme.onSurface.withOpacity(0.12), @@ -1108,6 +1114,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: borderColor, @@ -1137,6 +1145,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: selectedBorderColor, @@ -1165,6 +1175,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model + ..path() ..path( style: PaintingStyle.stroke, color: disabledBorderColor, @@ -1432,6 +1444,8 @@ void main() { expect( toggleButtonRenderObject[0], paints + // physical model + ..path() // leading side, top and bottom - enabled ..path( style: PaintingStyle.stroke, @@ -1445,6 +1459,8 @@ void main() { expect( toggleButtonRenderObject[1], paints + // physical model + ..path() // leading side - selected ..path( style: PaintingStyle.stroke, @@ -1464,6 +1480,8 @@ void main() { expect( toggleButtonRenderObject[2], paints + // physical model + ..path() // leading side - selected, since previous button is selected ..path( style: PaintingStyle.stroke, @@ -1515,6 +1533,8 @@ void main() { expect( toggleButtonRenderObject[0], paints + // physical model + ..path() // left side, top and right - enabled. ..path( style: PaintingStyle.stroke, @@ -1528,6 +1548,8 @@ void main() { expect( toggleButtonRenderObject[1], paints + // physical model + ..path() // top side - selected. ..path( style: PaintingStyle.stroke, @@ -1547,6 +1569,8 @@ void main() { expect( toggleButtonRenderObject[2], paints + // physical model + ..path() // top side - selected, since previous button is selected. ..path( style: PaintingStyle.stroke, @@ -1712,6 +1736,8 @@ void main() { expect( toggleButtonRenderObject[0], paints + // physical model paints + ..path() // left side, top and right - enabled. ..path( style: PaintingStyle.stroke, diff --git a/packages/flutter/test/material/toggle_buttons_theme_test.dart b/packages/flutter/test/material/toggle_buttons_theme_test.dart index cd8246ec5ddf7..5d26f85065166 100644 --- a/packages/flutter/test/material/toggle_buttons_theme_test.dart +++ b/packages/flutter/test/material/toggle_buttons_theme_test.dart @@ -543,6 +543,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model layer paint + ..path() ..path( style: PaintingStyle.stroke, color: borderColor, @@ -576,6 +578,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model layer paint + ..path() ..path( style: PaintingStyle.stroke, color: selectedBorderColor, @@ -608,6 +612,8 @@ void main() { expect( toggleButtonRenderObject, paints + // physical model layer paint + ..path() ..path( style: PaintingStyle.stroke, color: disabledBorderColor, diff --git a/packages/flutter/test/rendering/debug_test.dart b/packages/flutter/test/rendering/debug_test.dart index b31703e6c5e0f..74d80e4436cad 100644 --- a/packages/flutter/test/rendering/debug_test.dart +++ b/packages/flutter/test/rendering/debug_test.dart @@ -222,7 +222,7 @@ void main() { ); final RenderOpacity root = RenderOpacity( opacity: .5, - child: blackBox, + child: RenderRepaintBoundary(child: blackBox), ); layout(root, phase: EnginePhase.compositingBits); diff --git a/packages/flutter/test/rendering/proxy_box_test.dart b/packages/flutter/test/rendering/proxy_box_test.dart index 70dfff9df4cff..4957f2f0c63ba 100644 --- a/packages/flutter/test/rendering/proxy_box_test.dart +++ b/packages/flutter/test/rendering/proxy_box_test.dart @@ -5,9 +5,8 @@ import 'dart:typed_data'; import 'dart:ui' as ui show Gradient, Image, ImageFilter; -import 'package:flutter/animation.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -15,7 +14,6 @@ import 'rendering_tester.dart'; void main() { TestRenderingFlutterBinding.ensureInitialized(); - test('RenderFittedBox handles applying paint transform and hit-testing with empty size', () { final RenderFittedBox fittedBox = RenderFittedBox( child: RenderCustomPaint( @@ -61,47 +59,20 @@ void main() { expect(painted, equals(false)); }); - test('RenderPhysicalModel compositing on Fuchsia', () { - debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia; - + test('RenderPhysicalModel compositing', () { final RenderPhysicalModel root = RenderPhysicalModel(color: const Color(0xffff00ff)); layout(root, phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); + expect(root.needsCompositing, isFalse); // On Fuchsia, the system compositor is responsible for drawing shadows // for physical model layers with non-zero elevation. root.elevation = 1.0; pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); + expect(root.needsCompositing, isFalse); root.elevation = 0.0; pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); - - debugDefaultTargetPlatformOverride = null; - }); - - test('RenderPhysicalModel compositing on non-Fuchsia', () { - for (final TargetPlatform platform in TargetPlatform.values) { - if (platform == TargetPlatform.fuchsia) { - continue; - } - debugDefaultTargetPlatformOverride = platform; - - final RenderPhysicalModel root = RenderPhysicalModel(color: const Color(0xffff00ff)); - layout(root, phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); - - // Flutter now composites physical shapes on all platforms. - root.elevation = 1.0; - pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); - - root.elevation = 0.0; - pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); - } - debugDefaultTargetPlatformOverride = null; + expect(root.needsCompositing, isFalse); }); test('RenderSemanticsGestureHandler adds/removes correct semantic actions', () { @@ -128,9 +99,6 @@ void main() { group('RenderPhysicalShape', () { test('shape change triggers repaint', () { for (final TargetPlatform platform in TargetPlatform.values) { - if (platform == TargetPlatform.fuchsia) { - continue; - } debugDefaultTargetPlatformOverride = platform; final RenderPhysicalShape root = RenderPhysicalShape( @@ -151,27 +119,24 @@ void main() { debugDefaultTargetPlatformOverride = null; }); - test('compositing on non-Fuchsia', () { + test('compositing', () { for (final TargetPlatform platform in TargetPlatform.values) { - if (platform == TargetPlatform.fuchsia) { - continue; - } debugDefaultTargetPlatformOverride = platform; final RenderPhysicalShape root = RenderPhysicalShape( color: const Color(0xffff00ff), clipper: const ShapeBorderClipper(shape: CircleBorder()), ); layout(root, phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); + expect(root.needsCompositing, isFalse); // On non-Fuchsia platforms, we composite physical shape layers root.elevation = 1.0; pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); + expect(root.needsCompositing, isFalse); root.elevation = 0.0; pumpFrame(phase: EnginePhase.composite); - expect(root.needsCompositing, isTrue); + expect(root.needsCompositing, isFalse); } debugDefaultTargetPlatformOverride = null; }); @@ -287,7 +252,9 @@ void main() { test('RenderOpacity reuses its layer', () { _testLayerReuse(RenderOpacity( opacity: 0.5, // must not be 0 or 1.0. Otherwise, it won't create a layer - child: RenderSizedBox(const Size(1.0, 1.0)), // size doesn't matter + child: RenderRepaintBoundary( + child: RenderSizedBox(const Size(1.0, 1.0)), + ), // size doesn't matter )); }); @@ -353,9 +320,7 @@ void main() { test('RenderClipRect reuses its layer', () { _testLayerReuse(RenderClipRect( clipper: _TestRectClipper(), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); @@ -364,9 +329,7 @@ void main() { test('RenderClipRRect reuses its layer', () { _testLayerReuse(RenderClipRRect( clipper: _TestRRectClipper(), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); @@ -375,9 +338,7 @@ void main() { test('RenderClipOval reuses its layer', () { _testLayerReuse(RenderClipOval( clipper: _TestRectClipper(), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); @@ -386,32 +347,28 @@ void main() { test('RenderClipPath reuses its layer', () { _testLayerReuse(RenderClipPath( clipper: _TestPathClipper(), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); }); test('RenderPhysicalModel reuses its layer', () { - _testLayerReuse(RenderPhysicalModel( + _testLayerReuse(RenderPhysicalModel( + clipBehavior: Clip.hardEdge, color: const Color.fromRGBO(0, 0, 0, 1.0), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); }); test('RenderPhysicalShape reuses its layer', () { - _testLayerReuse(RenderPhysicalShape( + _testLayerReuse(RenderPhysicalShape( clipper: _TestPathClipper(), + clipBehavior: Clip.hardEdge, color: const Color.fromRGBO(0, 0, 0, 1.0), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); @@ -421,9 +378,7 @@ void main() { _testLayerReuse(RenderTransform( // Use a 3D transform to force compositing. transform: Matrix4.rotationX(0.1), - // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1.0, 1.0)), ), // size doesn't matter )); @@ -434,8 +389,7 @@ void main() { fit: BoxFit.cover, clipBehavior: Clip.hardEdge, // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(100.0, 200.0)), ), // size doesn't matter )); @@ -445,8 +399,7 @@ void main() { _testLayerReuse(RenderFittedBox( fit: BoxFit.fill, // Inject opacity under the clip to force compositing. - child: RenderOpacity( - opacity: 0.5, + child: RenderRepaintBoundary( child: RenderSizedBox(const Size(1, 1)), ), // size doesn't matter )); @@ -768,7 +721,7 @@ void _testLayerReuse(RenderBox renderObject) { expect(L, isNot(Layer)); expect(renderObject.debugLayer, null); layout(renderObject, phase: EnginePhase.paint, constraints: BoxConstraints.tight(const Size(10, 10))); - final Layer layer = renderObject.debugLayer!; + final Layer? layer = renderObject.debugLayer; expect(layer, isA()); expect(layer, isNotNull); diff --git a/packages/flutter/test/widgets/mouse_region_test.dart b/packages/flutter/test/widgets/mouse_region_test.dart index 7da940729dfaa..929fe1b0e9ff2 100644 --- a/packages/flutter/test/widgets/mouse_region_test.dart +++ b/packages/flutter/test/widgets/mouse_region_test.dart @@ -793,7 +793,7 @@ void main() { await tester.pumpWidget( MouseRegion( onEnter: (PointerEnterEvent _) {}, - child: const Opacity(opacity: 0.5, child: Placeholder()), + child: const RepaintBoundary(child: Placeholder()), ), ); diff --git a/packages/flutter/test/widgets/nested_scroll_view_test.dart b/packages/flutter/test/widgets/nested_scroll_view_test.dart index 62a257e38d59a..b29488d9c124b 100644 --- a/packages/flutter/test/widgets/nested_scroll_view_test.dart +++ b/packages/flutter/test/widgets/nested_scroll_view_test.dart @@ -591,35 +591,28 @@ void main() { )), ); - PhysicalModelLayer? _dfsFindPhysicalLayer(ContainerLayer layer) { - expect(layer, isNotNull); - Layer? child = layer.firstChild; - while (child != null) { - if (child is PhysicalModelLayer) { - return child; - } - if (child is ContainerLayer) { - Layer? innerChild = child.firstChild; - while (innerChild != null) { - if (innerChild is ContainerLayer) { - final PhysicalModelLayer? candidate = _dfsFindPhysicalLayer(innerChild); - if (candidate != null) { - return candidate; - } - } - innerChild = innerChild.nextSibling; - } + Object? _dfsFindPhysicalLayer(RenderObject object) { + expect(object, isNotNull); + if (object is RenderPhysicalModel || object is RenderPhysicalShape) { + return object; + } + final List children = []; + object.visitChildren(children.add); + for (final RenderObject child in children) { + final Object? result = _dfsFindPhysicalLayer(child); + if (result != null) { + return result; } - child = child.nextSibling; } return null; } - final ContainerLayer nestedScrollViewLayer = find.byType(NestedScrollView).evaluate().first.renderObject!.debugLayer!; + final RenderObject nestedScrollViewLayer = find.byType(NestedScrollView).evaluate().first.renderObject!; void _checkPhysicalLayer({required double elevation}) { - final PhysicalModelLayer? layer = _dfsFindPhysicalLayer(nestedScrollViewLayer); - expect(layer, isNotNull); - expect(layer!.elevation, equals(elevation)); + final dynamic physicalModel = _dfsFindPhysicalLayer(nestedScrollViewLayer); + expect(physicalModel, isNotNull); + // ignore: avoid_dynamic_calls + expect(physicalModel.elevation, equals(elevation)); } int expectedBuildCount = 0; diff --git a/packages/flutter/test/widgets/physical_model_test.dart b/packages/flutter/test/widgets/physical_model_test.dart index ccd8698b1c539..4591603ee31d2 100644 --- a/packages/flutter/test/widgets/physical_model_test.dart +++ b/packages/flutter/test/widgets/physical_model_test.dart @@ -43,30 +43,6 @@ void main() { expect(renderPhysicalShape.clipBehavior, equals(Clip.antiAlias)); }); - testWidgets('PhysicalModel - creates a physical model layer when it needs compositing', (WidgetTester tester) async { - debugDisableShadows = false; - await tester.pumpWidget( - MaterialApp( - home: PhysicalModel( - color: Colors.grey, - shadowColor: Colors.red, - elevation: 1.0, - child: Material(child: TextField(controller: TextEditingController())), - ), - ), - ); - await tester.pump(); - - final RenderPhysicalModel renderPhysicalModel = tester.allRenderObjects.whereType().first; - expect(renderPhysicalModel.needsCompositing, true); - - final PhysicalModelLayer physicalModelLayer = tester.layers.whereType().first; - expect(physicalModelLayer.shadowColor, Colors.red); - expect(physicalModelLayer.color, Colors.grey); - expect(physicalModelLayer.elevation, 1.0); - debugDisableShadows = true; - }); - testWidgets('PhysicalModel - clips when overflows and elevation is 0', (WidgetTester tester) async { const Key key = Key('test'); await tester.pumpWidget( diff --git a/packages/flutter/test/widgets/transform_test.dart b/packages/flutter/test/widgets/transform_test.dart index 621a4ee77f3ce..a21056e86a86b 100644 --- a/packages/flutter/test/widgets/transform_test.dart +++ b/packages/flutter/test/widgets/transform_test.dart @@ -240,8 +240,7 @@ void main() { child: ClipRect( child: Transform( transform: Matrix4.diagonal3Values(0.5, 0.5, 1.0), - child: Opacity( - opacity: 0.9, + child: RepaintBoundary( child: Container( color: const Color(0xFF00FF00), ), @@ -265,7 +264,7 @@ void main() { await tester.pumpWidget( Transform.rotate( angle: math.pi / 2.0, - child: Opacity(opacity: 0.5, child: Container()), + child: RepaintBoundary(child: Container()), ), ); @@ -305,7 +304,7 @@ void main() { await tester.pumpWidget( Transform.translate( offset: const Offset(100.0, 50.0), - child: Opacity(opacity: 0.5, child: Container()), + child: RepaintBoundary(child: Container()), ), ); @@ -320,7 +319,7 @@ void main() { await tester.pumpWidget( Transform.scale( scale: 2.0, - child: Opacity(opacity: 0.5, child: Container()), + child: RepaintBoundary(child: Container()), ), ); From 936623e174e43fd35467627270d183ba9553a9f3 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 19:54:07 -0400 Subject: [PATCH 100/108] Roll Engine from 07584c64bb7b to 46b0889d13ce (1 revision) (#102606) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 62e6786a530c2..c74022c59c868 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -07584c64bb7ba8d9e79214c3667cdb16cfa67923 +46b0889d13ce0449b1add97e69aeddf0636838ae From c46d4c03cc331695f46d9b909743925f8787c721 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 26 Apr 2022 17:34:06 -0700 Subject: [PATCH 101/108] Revert "[framework] Reland: use ImageFilter for zoom page transition " (#102611) --- .../src/material/page_transitions_theme.dart | 12 +--- .../material/page_transitions_theme_test.dart | 58 ------------------- 2 files changed, 2 insertions(+), 68 deletions(-) diff --git a/packages/flutter/lib/src/material/page_transitions_theme.dart b/packages/flutter/lib/src/material/page_transitions_theme.dart index 60e54894d3bdf..be8e5bb07d302 100644 --- a/packages/flutter/lib/src/material/page_transitions_theme.dart +++ b/packages/flutter/lib/src/material/page_transitions_theme.dart @@ -318,11 +318,7 @@ class _ZoomEnterTransition extends StatelessWidget { }, child: FadeTransition( opacity: fadeTransition, - child: ScaleTransition( - scale: scaleTransition, - filterQuality: FilterQuality.low, - child: child, - ), + child: ScaleTransition(scale: scaleTransition, child: child), ), ); } @@ -367,11 +363,7 @@ class _ZoomExitTransition extends StatelessWidget { return FadeTransition( opacity: fadeTransition, - child: ScaleTransition( - scale: scaleTransition, - filterQuality: FilterQuality.low, - child: child, - ), + child: ScaleTransition(scale: scaleTransition, child: child), ); } } diff --git a/packages/flutter/test/material/page_transitions_theme_test.dart b/packages/flutter/test/material/page_transitions_theme_test.dart index 4899c835aa799..749588c6f5155 100644 --- a/packages/flutter/test/material/page_transitions_theme_test.dart +++ b/packages/flutter/test/material/page_transitions_theme_test.dart @@ -5,7 +5,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -221,61 +220,4 @@ void main() { await tester.pumpAndSettle(); expect(builtCount, 1); }, variant: TargetPlatformVariant.only(TargetPlatform.android)); - - testWidgets('_ZoomPageTransition uses a FilterQuality while animating', (WidgetTester tester) async { - final Map routes = { - '/': (BuildContext context) => Material( - child: TextButton( - child: const Text('push'), - onPressed: () { Navigator.of(context).pushNamed('/b'); }, - ), - ), - '/b': (BuildContext context) => StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return TextButton( - child: const Text('pop'), - onPressed: () { Navigator.pop(context); }, - ); - }, - ), - }; - - await tester.pumpWidget( - MaterialApp( - theme: ThemeData( - pageTransitionsTheme: const PageTransitionsTheme( - builders: { - TargetPlatform.android: ZoomPageTransitionsBuilder(), // creates a _ZoomPageTransition - }, - ), - ), - routes: routes, - ), - ); - - expect(tester.layers, isNot(contains(isA()))); - - await tester.tap(find.text('push')); - await tester.pump(); - await tester.pump(); - - expect(tester.layers, contains(isA())); - expect(tester.layers.whereType(), hasLength(1)); - - await tester.pumpAndSettle(); - - expect(tester.layers, isNot(contains(isA()))); - - await tester.tap(find.text('pop')); - await tester.pump(); - await tester.pump(); - - expect(tester.layers, contains(isA())); - // exiting requires two different zooms. - expect(tester.layers.whereType(), hasLength(2)); - - await tester.pumpAndSettle(); - - expect(tester.layers, isNot(contains(isA()))); - }, variant: TargetPlatformVariant.only(TargetPlatform.android)); } From e5741f8d53df4683159b78304ab86b82fef1557a Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 20:59:08 -0400 Subject: [PATCH 102/108] Roll Engine from 46b0889d13ce to 6ac401970df1 (3 revisions) (#102612) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index c74022c59c868..3c17119d02dc2 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -46b0889d13ce0449b1add97e69aeddf0636838ae +6ac401970df19fb1a1d11f407b38314993bdbb9b From 1bb9eed4d0ecaf62cfe38e9760f71324b090aa02 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:09:04 -0700 Subject: [PATCH 103/108] Update open sdk version to be version `version:11` (#102610) --- .ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci.yaml b/.ci.yaml index 33a869f0de3ee..8d1b3c05ba48b 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -122,7 +122,7 @@ platform_properties: dependencies: >- [ {"dependency": "android_sdk", "version": "version:31v8"}, - {"dependency": "open_jdk", "version": "11"} + {"dependency": "open_jdk", "version": "version:11"} ] os: Mac-12 cpu: arm64 From 9fbdd4c8d50bbf88486379e2eb236e55a8307c6a Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Tue, 26 Apr 2022 23:09:06 -0400 Subject: [PATCH 104/108] Roll Engine from 6ac401970df1 to 24471f3cbb33 (3 revisions) (#102618) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 3c17119d02dc2..689fad4c71bfa 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -6ac401970df19fb1a1d11f407b38314993bdbb9b +24471f3cbb334d02f9ef91c11aba92a5f1198b03 From d6ea2c67d72e9b86f8b3165e140205b493521964 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Wed, 27 Apr 2022 00:24:06 -0400 Subject: [PATCH 105/108] Roll Engine from 24471f3cbb33 to 5d844aa30fc6 (1 revision) (#102619) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 689fad4c71bfa..bcdd44c6cd86b 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -24471f3cbb334d02f9ef91c11aba92a5f1198b03 +5d844aa30fc66d299a53ea12cec93b436b5725ea From 0b80f08cf05844851bf825ebe600cc35a55949fd Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Wed, 27 Apr 2022 01:39:07 -0400 Subject: [PATCH 106/108] Roll Engine from 5d844aa30fc6 to fcc15947754b (1 revision) (#102622) --- bin/internal/engine.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index bcdd44c6cd86b..88810bbaa4a9f 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -5d844aa30fc66d299a53ea12cec93b436b5725ea +fcc15947754bb12321a260908ab8bf5bc445a5f9 From 07f1c2047465a9bea0ba04bd925a5c4864d41a8a Mon Sep 17 00:00:00 2001 From: Alexandre Ardhuin Date: Wed, 27 Apr 2022 09:15:35 +0200 Subject: [PATCH 107/108] add missing trailing commas in list/set/map literals (#102585) --- .../flutter_test/flutter_gold_test.dart | 6 +- .../lib/src/animated_complex_opacity.dart | 2 +- .../lib/src/opacity_peephole.dart | 2 +- .../lib/src/picture_cache.dart | 4 +- .../lib/src/post_backdrop_filter.dart | 2 +- .../macrobenchmarks/lib/src/stack_size.dart | 2 +- .../lib/src/web/bench_text_layout.dart | 2 +- .../macrobenchmarks/test/frame_policy.dart | 8 +- ...opacity_peephole_col_of_rows_perf_e2e.dart | 2 +- ...eephole_fade_transition_text_perf_e2e.dart | 2 +- ...ity_peephole_grid_of_opacity_perf_e2e.dart | 2 +- .../opacity_peephole_one_rect_perf_e2e.dart | 2 +- ...ity_peephole_opacity_of_grid_perf_e2e.dart | 2 +- .../standard_message_codec_bench.dart | 2 +- .../standard_method_codec_bench.dart | 2 +- .../multiple_flutters/module/lib/main.dart | 4 +- .../stocks/lib/i18n/stock_strings.dart | 2 +- dev/bots/analyze.dart | 4 +- dev/bots/service_worker_test.dart | 6 +- dev/bots/test.dart | 4 +- dev/bots/test/prepare_package_test.dart | 4 +- dev/conductor/core/lib/src/repository.dart | 4 +- dev/conductor/core/lib/src/state.dart | 6 +- dev/conductor/core/test/next_test.dart | 2 +- .../test/customer_test_test.dart | 11 +- .../build_ios_framework_module_test.dart | 4 +- .../flutter_engine_group_performance.dart | 4 +- .../bin/tasks/gradle_java8_compile_test.dart | 2 +- .../tasks/gradle_plugin_light_apk_test.dart | 10 +- .../module_custom_host_app_name_test.dart | 2 +- dev/devicelab/bin/tasks/module_test.dart | 2 +- dev/devicelab/bin/tasks/module_test_ios.dart | 2 +- dev/devicelab/bin/tasks/plugin_lint_mac.dart | 10 +- dev/devicelab/lib/framework/ab.dart | 6 +- dev/devicelab/lib/tasks/gallery.dart | 2 +- .../tasks/platform_channels_benchmarks.dart | 2 +- dev/devicelab/test/metrics_center_test.dart | 2 +- .../flutterapp/lib/main.dart | 2 +- .../ios_platform_view_tests/lib/main.dart | 2 +- dev/tools/update_icons.dart | 2 +- dev/tools/vitool/test/vitool_test.dart | 2 +- .../test/image_cache_tracing_test.dart | 10 +- .../dialog/cupertino_action_sheet.0.dart | 2 +- .../dialog/cupertino_alert_dialog.0.dart | 2 +- .../nav_bar/cupertino_sliver_nav_bar.0.dart | 2 +- .../cupertino_sliver_refresh_control.0.dart | 2 +- .../api/lib/material/app_bar/app_bar.1.dart | 2 +- .../show_modal_bottom_sheet.0.dart | 2 +- .../material/icon_button/icon_button.0.dart | 2 +- .../lib/material/list_tile/list_tile.5.dart | 2 +- .../navigation_bar/navigation_bar.0.dart | 2 +- .../navigation_rail.extended_animation.0.dart | 2 +- .../platform_menu_bar.0.dart | 4 +- .../lib/material/popupmenu/popupmenu.0.dart | 2 +- .../lib/material/scaffold/scaffold.of.0.dart | 2 +- .../lib/material/scaffold/scaffold.of.1.dart | 2 +- .../scaffold_state.show_bottom_sheet.0.dart | 9 +- ...e.font_feature_historical_ligatures.0.dart | 2 +- .../lib/widgets/async/future_builder.0.dart | 6 +- .../lib/widgets/async/stream_builder.0.dart | 8 +- .../widgets/autofill/autofill_group.0.dart | 6 +- .../interactive_viewer.builder.0.dart | 2 +- .../nested_scroll_view.2.dart | 2 +- .../widgets/page_storage/page_storage.0.dart | 2 +- .../lib/widgets/page_view/page_view.0.dart | 2 +- .../decorated_box_transition.0.dart | 2 +- .../transitions/sliver_fade_transition.0.dart | 2 +- .../flutter/lib/src/material/theme_data.dart | 2 +- packages/flutter/test/material/app_test.dart | 42 ++--- .../flutter/test/material/dropdown_test.dart | 4 +- .../test/material/popup_menu_test.dart | 78 +++++---- .../test/material/scrollbar_theme_test.dart | 2 +- .../test/material/slider_theme_test.dart | 2 +- .../test/material/theme_data_test.dart | 2 +- .../flutter/test/material/tooltip_test.dart | 2 +- .../flutter/test/material/will_pop_test.dart | 2 +- .../painting/_network_image_test_web.dart | 6 +- .../test/scheduler/scheduler_test.dart | 20 ++- .../test/services/system_chrome_test.dart | 6 +- .../flutter/test/widgets/actions_test.dart | 4 +- .../test/widgets/animated_size_test.dart | 6 +- .../draggable_scrollable_sheet_test.dart | 2 +- .../layout_builder_and_parent_data_test.dart | 10 +- .../overscroll_stretch_indicator_test.dart | 64 +++---- .../test/widgets/platform_menu_bar_test.dart | 12 +- .../test/widgets/scroll_behavior_test.dart | 42 +++-- .../flutter/test/widgets/scrollable_test.dart | 12 +- .../test/widgets/selectable_text_test.dart | 4 +- .../flutter/test/widgets/transform_test.dart | 16 +- .../test/widgets/transitions_test.dart | 12 +- .../flutter_driver/lib/src/common/wait.dart | 2 +- .../test/src/real_tests/extension_test.dart | 5 +- .../src/real_tests/flutter_driver_test.dart | 6 +- .../src/real_tests/timeline_summary_test.dart | 16 +- .../test/src/real_tests/wait_test.dart | 2 +- .../test/flutter_goldens_test.dart | 41 ++--- .../flutter_goldens/test/json_templates.dart | 12 +- packages/flutter_test/lib/src/controller.dart | 4 +- packages/flutter_test/lib/src/matchers.dart | 2 +- .../lib/src/test_async_utils.dart | 2 +- .../flutter_test/lib/src/widget_tester.dart | 4 +- .../flutter_test_variable_is_false_test.dart | 2 +- packages/flutter_test/test/goldens_test.dart | 33 ++-- .../test/live_widget_controller_test.dart | 8 +- packages/flutter_test/test/matchers_test.dart | 38 ++-- .../flutter_test/test/widget_tester_test.dart | 8 +- packages/flutter_tools/bin/tool_backend.dart | 2 +- packages/flutter_tools/bin/xcode_backend.dart | 2 +- .../lib/src/android/android_device.dart | 9 +- .../lib/src/android/android_emulator.dart | 2 +- .../flutter_tools/lib/src/android/gradle.dart | 8 +- .../lib/src/base/analyze_size.dart | 2 +- .../flutter_tools/lib/src/base/build.dart | 2 +- .../flutter_tools/lib/src/base/logger.dart | 2 +- .../lib/src/build_system/hash.dart | 4 +- .../lib/src/build_system/targets/assets.dart | 2 +- .../lib/src/build_system/targets/common.dart | 2 +- .../lib/src/build_system/targets/ios.dart | 4 +- .../build_system/targets/localizations.dart | 4 +- .../lib/src/build_system/targets/macos.dart | 2 +- .../lib/src/commands/assemble.dart | 8 +- .../lib/src/commands/build_ios_framework.dart | 6 +- .../lib/src/commands/create.dart | 2 +- .../lib/src/commands/custom_devices.dart | 16 +- .../lib/src/commands/daemon.dart | 2 +- .../lib/src/commands/format.dart | 2 +- .../lib/src/commands/precache.dart | 4 +- .../flutter_tools/lib/src/commands/test.dart | 2 +- .../lib/src/custom_devices/custom_device.dart | 10 +- .../custom_devices/custom_device_config.dart | 2 +- .../custom_devices/custom_devices_config.dart | 2 +- packages/flutter_tools/lib/src/device.dart | 4 +- .../lib/src/drive/web_driver_service.dart | 20 +-- .../lib/src/flutter_manifest.dart | 2 +- .../lib/src/fuchsia/fuchsia_ffx.dart | 2 +- .../src/fuchsia/fuchsia_kernel_compiler.dart | 6 +- .../flutter_tools/lib/src/ios/devices.dart | 2 +- packages/flutter_tools/lib/src/ios/mac.dart | 2 +- .../flutter_tools/lib/src/ios/simulators.dart | 2 +- .../flutter_tools/lib/src/ios/xcodeproj.dart | 4 +- .../lib/src/isolated/devfs_web.dart | 2 +- .../lib/src/linux/build_linux.dart | 2 +- .../lib/src/linux/linux_doctor.dart | 2 +- .../lib/src/macos/build_macos.dart | 2 +- .../flutter_tools/lib/src/macos/xcdevice.dart | 4 +- .../lib/src/persistent_tool_state.dart | 2 +- .../lib/src/platform_plugins.dart | 2 +- .../lib/src/resident_devtools_handler.dart | 2 +- packages/flutter_tools/lib/src/run_hot.dart | 4 +- .../lib/src/runner/flutter_command.dart | 4 +- packages/flutter_tools/lib/src/template.dart | 6 +- .../lib/src/test/flutter_web_platform.dart | 2 +- .../lib/src/tester/flutter_tester.dart | 2 +- packages/flutter_tools/lib/src/vmservice.dart | 12 +- .../lib/src/windows/build_windows.dart | 4 +- .../lib/src/windows/visual_studio.dart | 4 +- .../hermetic/assemble_test.dart | 2 +- .../commands.shard/hermetic/attach_test.dart | 4 +- .../hermetic/build_fuchsia_test.dart | 2 +- .../hermetic/build_ios_test.dart | 2 +- .../hermetic/build_ipa_test.dart | 6 +- .../hermetic/build_linux_test.dart | 2 +- .../hermetic/build_macos_test.dart | 16 +- .../hermetic/build_web_test.dart | 4 +- .../hermetic/build_windows_test.dart | 4 +- .../commands.shard/hermetic/config_test.dart | 2 +- .../hermetic/create_usage_test.dart | 3 +- .../hermetic/custom_devices_test.dart | 104 +++++------ .../commands.shard/hermetic/devices_test.dart | 12 +- .../hermetic/downgrade_test.dart | 18 +- .../hermetic/proxy_validator_test.dart | 6 +- .../hermetic/symbolize_test.dart | 3 +- .../commands.shard/hermetic/test_test.dart | 14 +- .../permeable/build_aar_test.dart | 2 +- .../permeable/build_bundle_test.dart | 12 +- .../commands.shard/permeable/create_test.dart | 26 +-- .../permeable/devices_test.dart | 6 +- .../permeable/packages_test.dart | 18 +- .../permeable/upgrade_test.dart | 6 +- .../android/adb_log_reader_test.dart | 12 +- .../android_device_discovery_test.dart | 10 +- .../android_device_port_forwarder_test.dart | 16 +- .../android/android_device_start_test.dart | 2 +- .../android/android_device_test.dart | 24 +-- .../android/android_emulator_test.dart | 2 +- .../android/android_gradle_builder_test.dart | 22 +-- .../android/android_install_test.dart | 4 +- .../android/gradle_errors_test.dart | 4 +- .../general.shard/android/template_test.dart | 2 +- .../general.shard/artifact_updater_test.dart | 10 +- .../test/general.shard/base/build_test.dart | 2 +- .../test/general.shard/build_info_test.dart | 12 +- .../build_system/targets/android_test.dart | 10 +- .../build_system/targets/assets_test.dart | 10 +- .../build_system/targets/common_test.dart | 4 +- .../build_system/targets/ios_test.dart | 4 +- .../build_system/targets/linux_test.dart | 4 +- .../build_system/targets/macos_test.dart | 16 +- .../build_system/targets/windows_test.dart | 4 +- .../test/general.shard/cache_test.dart | 12 +- .../commands/flutter_root_test.dart | 14 +- .../general.shard/compile_batch_test.dart | 10 +- .../compile_expression_test.dart | 4 +- .../coverage_collector_test.dart | 66 +++---- .../custom_devices/custom_device_test.dart | 44 ++--- .../custom_devices_config_test.dart | 22 +-- .../test/general.shard/dart/pub_get_test.dart | 16 +- .../test/general.shard/dart_plugin_test.dart | 8 +- .../general.shard/desktop_device_test.dart | 4 +- .../test/general.shard/devfs_test.dart | 2 +- .../test/general.shard/device_test.dart | 14 +- .../general.shard/devtools_launcher_test.dart | 4 +- .../drive/drive_service_test.dart | 36 ++-- .../drive/web_driver_service_test.dart | 34 ++-- .../test/general.shard/emulator_test.dart | 12 +- .../general.shard/flutter_manifest_test.dart | 10 +- .../flutter_tester_device_test.dart | 10 +- .../general.shard/flutter_validator_test.dart | 2 +- .../fuchsia/fuchsia_device_start_test.dart | 4 +- .../fuchsia/fuchsia_device_test.dart | 2 +- .../fuchsia/fuchsia_pm_test.dart | 2 +- .../intellij/intellij_validator_test.dart | 6 +- .../general.shard/ios/code_signing_test.dart | 14 +- .../test/general.shard/ios/devices_test.dart | 6 +- .../general.shard/ios/ios_deploy_test.dart | 8 +- .../ios/ios_device_install_test.dart | 164 ++++++++++-------- .../ios/ios_device_logger_test.dart | 2 +- .../ios_device_start_nonprebuilt_test.dart | 4 +- .../ios/ios_device_start_prebuilt_test.dart | 13 +- .../test/general.shard/ios/mac_test.dart | 20 ++- .../general.shard/ios/simulators_test.dart | 6 +- .../general.shard/ios/xcodeproj_test.dart | 10 +- .../general.shard/license_collector_test.dart | 18 +- .../macos/macos_device_test.dart | 2 +- .../test/general.shard/plugins_test.dart | 34 ++-- .../general.shard/preview_device_test.dart | 4 +- .../test/general.shard/project_test.dart | 8 +- .../resident_devtools_handler_test.dart | 2 +- .../general.shard/resident_runner_test.dart | 36 ++-- .../resident_web_runner_test.dart | 8 +- .../runner/flutter_command_test.dart | 2 +- .../general.shard/runner/runner_test.dart | 6 +- .../general.shard/terminal_handler_test.dart | 34 ++-- .../test/general.shard/tracing_test.dart | 2 +- .../general.shard/update_packages_test.dart | 4 +- .../test/general.shard/vmservice_test.dart | 20 +-- .../general.shard/web/devfs_web_test.dart | 92 +++++----- .../test/general.shard/web/devices_test.dart | 6 +- .../web/golden_comparator_test.dart | 12 +- .../general.shard/web/memory_fs_test.dart | 12 +- .../web/web_asset_server_test.dart | 2 +- .../general.shard/windows/plugins_test.dart | 3 +- .../integration.shard/analyze_once_test.dart | 4 +- .../integration.shard/analyze_size_test.dart | 4 +- .../debug_adapter/test_adapter_test.dart | 2 +- .../deferred_components_test.dart | 4 +- .../downgrade_upgrade_integration_test.dart | 4 +- .../deferred_components_project.dart | 2 +- .../test/integration.shard/test_driver.dart | 2 +- .../test/integration.shard/test_test.dart | 4 +- .../test/src/custom_devices_common.dart | 4 +- .../flutter_tools/test/src/fake_devices.dart | 10 +- .../test/src/fake_vm_services.dart | 2 +- packages/flutter_tools/test/src/fakes.dart | 2 +- .../test/web.shard/chrome_test.dart | 4 +- .../test/web.shard/vm_service_web_test.dart | 4 +- .../flutter_tools/tool/daemon_client.dart | 2 +- .../test/src/common/network_test.dart | 7 +- packages/integration_test/lib/common.dart | 2 +- .../lib/integration_test.dart | 2 +- .../test/binding_fail_test.dart | 2 +- 271 files changed, 1235 insertions(+), 1140 deletions(-) diff --git a/dev/automated_tests/flutter_test/flutter_gold_test.dart b/dev/automated_tests/flutter_test/flutter_gold_test.dart index fbd701b4737c9..b12ac4efd1695 100644 --- a/dev/automated_tests/flutter_test/flutter_gold_test.dart +++ b/dev/automated_tests/flutter_test/flutter_gold_test.dart @@ -13,10 +13,12 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:platform/platform.dart'; // 1x1 colored pixel -const List _kFailPngBytes = [137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, +const List _kFailPngBytes = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 13, 73, 68, 65, 84, 120, 1, 99, 249, 207, 240, 255, 63, 0, 7, 18, 3, - 2, 164, 147, 160, 197, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]; + 2, 164, 147, 160, 197, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, +]; void main() { final MemoryFileSystem fs = MemoryFileSystem(); diff --git a/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart b/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart index 90b2276e343bc..90c3bcd104cd3 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/animated_complex_opacity.dart @@ -33,7 +33,7 @@ class _AnimatedComplexOpacityState extends State with Si for (int i = 0; i < 20; i++) FadeTransition(opacity: animation, child: Center( child: Transform.scale(scale: 1.01, child: const ModeratelyComplexWidget()), - )) + )), ], ), ), diff --git a/dev/benchmarks/macrobenchmarks/lib/src/opacity_peephole.dart b/dev/benchmarks/macrobenchmarks/lib/src/opacity_peephole.dart index c719ed50a0d48..c1ebc9249c24c 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/opacity_peephole.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/opacity_peephole.dart @@ -28,7 +28,7 @@ class OpacityPeepholePage extends StatelessWidget { onPressed: () { Navigator.pushNamed(context, variant.route); }, - ) + ), ], ), ); diff --git a/dev/benchmarks/macrobenchmarks/lib/src/picture_cache.dart b/dev/benchmarks/macrobenchmarks/lib/src/picture_cache.dart index 08063c75af2d3..caa20e127898d 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/picture_cache.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/picture_cache.dart @@ -62,7 +62,7 @@ class ListItem extends StatelessWidget { _buildUserInfo(), const SizedBox( height: 10, - ) + ), ]; if (index % 3 != 0) { contents.add(_buildImageContent()); @@ -140,7 +140,7 @@ class ListItem extends StatelessWidget { ), const SizedBox( width: 15, - ) + ), ], ); } diff --git a/dev/benchmarks/macrobenchmarks/lib/src/post_backdrop_filter.dart b/dev/benchmarks/macrobenchmarks/lib/src/post_backdrop_filter.dart index d95aed858dc3b..b17005c0bca73 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/post_backdrop_filter.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/post_backdrop_filter.dart @@ -93,7 +93,7 @@ class _PostBackdropFilterPageState extends State with Ti ], ), ), - ) + ), ], ), ], diff --git a/dev/benchmarks/macrobenchmarks/lib/src/stack_size.dart b/dev/benchmarks/macrobenchmarks/lib/src/stack_size.dart index 3f828c0a0f47e..a4012d8409663 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/stack_size.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/stack_size.dart @@ -67,7 +67,7 @@ final GetStackPointerCallback getStackPointer = () { // "mov r0, sp" in machine code: 0D00A0E1. 0x0d, 0x00, 0xa0, 0xe1, // "bx lr" in machine code: 1EFF2FE1. - 0x1e, 0xff, 0x2f, 0xe1 + 0x1e, 0xff, 0x2f, 0xe1, ] ); diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/bench_text_layout.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/bench_text_layout.dart index b06d34aafe2df..7a1cf7363be08 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/web/bench_text_layout.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/web/bench_text_layout.dart @@ -393,7 +393,7 @@ class PaletteTabView extends StatelessWidget { 600, 700, 800, - 900 + 900, ]; static const List accentKeys = [100, 200, 400, 700]; diff --git a/dev/benchmarks/macrobenchmarks/test/frame_policy.dart b/dev/benchmarks/macrobenchmarks/test/frame_policy.dart index b40304a794928..95b80ef8a58da 100644 --- a/dev/benchmarks/macrobenchmarks/test/frame_policy.dart +++ b/dev/benchmarks/macrobenchmarks/test/frame_policy.dart @@ -45,8 +45,8 @@ void main() { position: location + movePerRun * t.toDouble(), pointer: 1, delta: movePerRun, - ) - ]) + ), + ]), ], PointerEventRecord(totalTime, [ PointerUpEvent( @@ -54,8 +54,8 @@ void main() { timeStamp: totalTime - const Duration(milliseconds: 1), position: location + movePerRun * moveEventNumber.toDouble(), pointer: 1, - ) - ]) + ), + ]), ]; binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.benchmarkLive; diff --git a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_col_of_rows_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_col_of_rows_perf_e2e.dart index cf9129ef88c00..9343e008bebbf 100644 --- a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_col_of_rows_perf_e2e.dart +++ b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_col_of_rows_perf_e2e.dart @@ -11,7 +11,7 @@ void main() { 'opacity_peephole_col_of_rows_perf', [ ScrollableButtonRoute(kScrollableName, kOpacityPeepholeRouteName), - ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOpacityOfColOfRowsRouteName) + ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOpacityOfColOfRowsRouteName), ], pageDelay: const Duration(seconds: 1), duration: const Duration(seconds: 10), diff --git a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_fade_transition_text_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_fade_transition_text_perf_e2e.dart index 269cfd1e8b858..232af02951f5f 100644 --- a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_fade_transition_text_perf_e2e.dart +++ b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_fade_transition_text_perf_e2e.dart @@ -11,7 +11,7 @@ void main() { 'opacity_peephole_fade_transition_text_perf', [ ScrollableButtonRoute(kScrollableName, kOpacityPeepholeRouteName), - ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeFadeTransitionTextRouteName) + ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeFadeTransitionTextRouteName), ], pageDelay: const Duration(seconds: 1), duration: const Duration(seconds: 10), diff --git a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_grid_of_opacity_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_grid_of_opacity_perf_e2e.dart index 068c21cce65d4..b188b4b286460 100644 --- a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_grid_of_opacity_perf_e2e.dart +++ b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_grid_of_opacity_perf_e2e.dart @@ -11,7 +11,7 @@ void main() { 'opacity_peephole_grid_of_opacity_perf', [ ScrollableButtonRoute(kScrollableName, kOpacityPeepholeRouteName), - ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeGridOfOpacityRouteName) + ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeGridOfOpacityRouteName), ], pageDelay: const Duration(seconds: 1), duration: const Duration(seconds: 10), diff --git a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_one_rect_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_one_rect_perf_e2e.dart index 63313da61861a..8986c216546e5 100644 --- a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_one_rect_perf_e2e.dart +++ b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_one_rect_perf_e2e.dart @@ -11,7 +11,7 @@ void main() { 'opacity_peephole_one_rect_perf', [ ScrollableButtonRoute(kScrollableName, kOpacityPeepholeRouteName), - ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOneRectRouteName) + ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOneRectRouteName), ], pageDelay: const Duration(seconds: 1), duration: const Duration(seconds: 10), diff --git a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_opacity_of_grid_perf_e2e.dart b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_opacity_of_grid_perf_e2e.dart index ca6082830bd40..991ed7b0be363 100644 --- a/dev/benchmarks/macrobenchmarks/test/opacity_peephole_opacity_of_grid_perf_e2e.dart +++ b/dev/benchmarks/macrobenchmarks/test/opacity_peephole_opacity_of_grid_perf_e2e.dart @@ -11,7 +11,7 @@ void main() { 'opacity_peephole_opacity_of_grid_perf', [ ScrollableButtonRoute(kScrollableName, kOpacityPeepholeRouteName), - ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOpacityOfGridRouteName) + ScrollableButtonRoute(kOpacityScrollableName, kOpacityPeepholeOpacityOfGridRouteName), ], pageDelay: const Duration(seconds: 1), duration: const Duration(seconds: 10), diff --git a/dev/benchmarks/microbenchmarks/lib/foundation/standard_message_codec_bench.dart b/dev/benchmarks/microbenchmarks/lib/foundation/standard_message_codec_bench.dart index 0debebd5f8b3f..5be91076a7b31 100644 --- a/dev/benchmarks/microbenchmarks/lib/foundation/standard_message_codec_bench.dart +++ b/dev/benchmarks/microbenchmarks/lib/foundation/standard_message_codec_bench.dart @@ -78,7 +78,7 @@ void main() { 'integer': 1234, 'string': 'This is a performance test.', 'float': 1.25, - 'boolean': true + 'boolean': true, }); } watch.stop(); diff --git a/dev/benchmarks/microbenchmarks/lib/foundation/standard_method_codec_bench.dart b/dev/benchmarks/microbenchmarks/lib/foundation/standard_method_codec_bench.dart index 2cbb28564ceed..6731d57d1e9ea 100644 --- a/dev/benchmarks/microbenchmarks/lib/foundation/standard_method_codec_bench.dart +++ b/dev/benchmarks/microbenchmarks/lib/foundation/standard_method_codec_bench.dart @@ -81,7 +81,7 @@ void main() { 'integer': 1234, 'string': 'This is a performance test.', 'float': 1.25, - 'boolean': true + 'boolean': true, })); } watch.stop(); diff --git a/dev/benchmarks/multiple_flutters/module/lib/main.dart b/dev/benchmarks/multiple_flutters/module/lib/main.dart index 4a583b42dee02..0036703d84535 100644 --- a/dev/benchmarks/multiple_flutters/module/lib/main.dart +++ b/dev/benchmarks/multiple_flutters/module/lib/main.dart @@ -160,7 +160,7 @@ class _MyHomePageState extends State { 0.0), // 10% of the width, so there are ten blinds. colors: [ Color(0xffee0000), - Color(0xffeeee00) + Color(0xffeeee00), ], // red to yellow tileMode: TileMode .repeated, // repeats the gradient over the canvas @@ -172,7 +172,7 @@ class _MyHomePageState extends State { CustomPaint( painter: Sky(), size: const Size(200.0, 36.0), - ) + ), ], ), ), diff --git a/dev/benchmarks/test_apps/stocks/lib/i18n/stock_strings.dart b/dev/benchmarks/test_apps/stocks/lib/i18n/stock_strings.dart index fc38e8f4b7c22..2af0dc28d5c02 100644 --- a/dev/benchmarks/test_apps/stocks/lib/i18n/stock_strings.dart +++ b/dev/benchmarks/test_apps/stocks/lib/i18n/stock_strings.dart @@ -97,7 +97,7 @@ abstract class StockStrings { static const List supportedLocales = [ Locale('en'), Locale('en', 'US'), - Locale('es') + Locale('es'), ]; /// Title for the Stocks application diff --git a/dev/bots/analyze.dart b/dev/bots/analyze.dart index 249a4a32d201b..f18b1a7f2ff8f 100644 --- a/dev/bots/analyze.dart +++ b/dev/bots/analyze.dart @@ -638,7 +638,7 @@ Future verifyNoBadImportsInFlutter(String workingDirectory) async { 'These are the exported packages:', ...packages.map((String path) => ' lib/$path.dart'), 'These are the directories:', - ...directories.map((String path) => ' lib/src/$path/') + ...directories.map((String path) => ' lib/src/$path/'), ].join('\n')); } // Verify that the imports are well-ordered. @@ -1585,7 +1585,7 @@ Future _checkConsumerDependencies() async { 'pub', 'deps', '--json', - '--directory=${path.join(flutterRoot, 'packages', package)}' + '--directory=${path.join(flutterRoot, 'packages', package)}', ]); if (result.exitCode != 0) { print(result.stdout as Object); diff --git a/dev/bots/service_worker_test.dart b/dev/bots/service_worker_test.dart index 10432c7a352aa..a40b7bc6c0645 100644 --- a/dev/bots/service_worker_test.dart +++ b/dev/bots/service_worker_test.dart @@ -239,7 +239,7 @@ Future runWebServiceWorkerTest({ ...{ 'manifest.json': 1, 'favicon.ico': 1, - } + }, }); expect(reportedVersion, '1'); reportedVersion = null; @@ -313,7 +313,7 @@ Future runWebServiceWorkerTest({ ...{ 'manifest.json': 1, 'favicon.ico': 1, - } + }, }); expect(reportedVersion, '3'); @@ -366,7 +366,7 @@ Future runWebServiceWorkerTest({ ...{ 'manifest.json': 1, 'favicon.ico': 1, - } + }, }); expect(reportedVersion, '4'); diff --git a/dev/bots/test.dart b/dev/bots/test.dart index a8532ae097f03..bc71ca06dc532 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -1268,7 +1268,7 @@ Future _runFlutterPluginsTests() async { 'core.longPaths=true', 'clone', 'https://github.com/flutter/plugins.git', - '.' + '.', ], workingDirectory: checkout.path, ); @@ -1329,7 +1329,7 @@ Future _runSkpGeneratorTests() async { 'core.longPaths=true', 'clone', 'https://github.com/flutter/tests.git', - '.' + '.', ], workingDirectory: checkout.path, ); diff --git a/dev/bots/test/prepare_package_test.dart b/dev/bots/test/prepare_package_test.dart index 3f7449ff3d52b..6f073243f4929 100644 --- a/dev/bots/test/prepare_package_test.dart +++ b/dev/bots/test/prepare_package_test.dart @@ -48,7 +48,7 @@ void main() { command: ['echo', 'test',], stdout: 'output', stderr: 'error', - ) + ), ]); final ProcessRunner processRunner = ProcessRunner( subprocessOutput: false, platform: platform, processManager: fakeProcessManager); @@ -62,7 +62,7 @@ void main() { stdout: 'output', stderr: 'error', exitCode: -1, - ) + ), ]); final ProcessRunner processRunner = ProcessRunner( subprocessOutput: false, platform: platform, processManager: fakeProcessManager); diff --git a/dev/conductor/core/lib/src/repository.dart b/dev/conductor/core/lib/src/repository.dart index 12854bfabcec8..71a382b2c35ab 100644 --- a/dev/conductor/core/lib/src/repository.dart +++ b/dev/conductor/core/lib/src/repository.dart @@ -151,7 +151,7 @@ abstract class Repository { upstreamRemote.name, '--', upstreamRemote.url, - checkoutDirectory.path + checkoutDirectory.path, ], 'Cloning $name repo', workingDirectory: parentDirectory.path, @@ -302,7 +302,7 @@ abstract class Repository { 'merge-base', '--is-ancestor', possibleDescendant, - possibleAncestor + possibleAncestor, ], 'verify $possibleAncestor is a direct ancestor of $possibleDescendant.', allowNonZeroExitCode: true, diff --git a/dev/conductor/core/lib/src/state.dart b/dev/conductor/core/lib/src/state.dart index d0bf99730dd5c..4d621764f84ed 100644 --- a/dev/conductor/core/lib/src/state.dart +++ b/dev/conductor/core/lib/src/state.dart @@ -171,7 +171,7 @@ String phaseInstructions(pb.ConductorState state) { ].join('\n'); } return [ - 'Either all cherrypicks have been auto-applied or there were none.' + 'Either all cherrypicks have been auto-applied or there were none.', ].join('\n'); case ReleasePhase.PUBLISH_VERSION: if (!requiresFrameworkPR(state)) { @@ -201,7 +201,7 @@ String phaseInstructions(pb.ConductorState state) { '\t 1. Post announcement to discord', '\t 2. Post announcement flutter release hotline chat room', '-----------------------------------------------------------------------', - 'This release has been completed.' + 'This release has been completed.', ].join('\n'); } return [ @@ -211,7 +211,7 @@ String phaseInstructions(pb.ConductorState state) { '\t 3. Post announcement to discord', '\t 4. Post announcement flutter release hotline chat room', '-----------------------------------------------------------------------', - 'This release has been completed.' + 'This release has been completed.', ].join('\n'); } // For analyzer diff --git a/dev/conductor/core/test/next_test.dart b/dev/conductor/core/test/next_test.dart index b4b8db10eeb9f..5f3662a2ea224 100644 --- a/dev/conductor/core/test/next_test.dart +++ b/dev/conductor/core/test/next_test.dart @@ -1124,7 +1124,7 @@ void main() { FakeCommand( command: const ['git', 'push', '', 'HEAD:refs/heads/'], exception: GitException(gitPushErrorMessage, ['git', 'push', '--force', '', 'HEAD:refs/heads/']), - ) + ), ]); final NextContext nextContext = NextContext( autoAccept: false, diff --git a/dev/customer_testing/test/customer_test_test.dart b/dev/customer_testing/test/customer_test_test.dart index e4d9c5d7646b8..129782c61d75a 100644 --- a/dev/customer_testing/test/customer_test_test.dart +++ b/dev/customer_testing/test/customer_test_test.dart @@ -32,11 +32,12 @@ test.windows=.\test_utilities\bin\flutter_test_runner.bat repo_dashboard ['git clone https://github.com/flutter/cocoon.git tests', 'git -C tests checkout abc123'])); if (Platform.isLinux || Platform.isMacOS) { expect( - test.tests, - containsAllInOrder([ - './test_utilities/bin/flutter_test_runner.sh app_flutter', - './test_utilities/bin/flutter_test_runner.sh repo_dashboard' - ])); + test.tests, + containsAllInOrder([ + './test_utilities/bin/flutter_test_runner.sh app_flutter', + './test_utilities/bin/flutter_test_runner.sh repo_dashboard', + ]), + ); } else if (Platform.isWindows) { expect(test.tests, containsAllInOrder(['.\test_utilities\bin\flutter_test_runner.bat repo_dashboard'])); } diff --git a/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart b/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart index ba76ec386a66f..1bb5a7866a774 100644 --- a/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart +++ b/dev/devicelab/bin/tasks/build_ios_framework_module_test.dart @@ -30,7 +30,7 @@ Future main() async { 'io.flutter.devicelab', '--template', 'module', - 'hello_module' + 'hello_module', ], ); @@ -410,7 +410,7 @@ Future _testBuildIosFramework(Directory projectDir, { bool isModule = fals 'ios-framework', '--cocoapods', '--force', // Allow podspec creation on master. - '--output=$cocoapodsOutputDirectoryName' + '--output=$cocoapodsOutputDirectoryName', ], ); }); diff --git a/dev/devicelab/bin/tasks/flutter_engine_group_performance.dart b/dev/devicelab/bin/tasks/flutter_engine_group_performance.dart index 63beff98617fb..f6ebee406bcc4 100644 --- a/dev/devicelab/bin/tasks/flutter_engine_group_performance.dart +++ b/dev/devicelab/bin/tasks/flutter_engine_group_performance.dart @@ -80,7 +80,7 @@ Future _doTest() async { 'am', 'start', '-n', - '$_bundleName/$_bundleName.$_activityName' + '$_bundleName/$_bundleName.$_activityName', ]); await Future.delayed(const Duration(seconds: 10)); final Map memoryStats = @@ -93,7 +93,7 @@ Future _doTest() async { ListStatistics(totalMemorySamples); final Map results = { - ...totalMemoryStatistics.asMap('totalMemory') + ...totalMemoryStatistics.asMap('totalMemory'), }; result = TaskResult.success(results, benchmarkScoreKeys: results.keys.toList()); diff --git a/dev/devicelab/bin/tasks/gradle_java8_compile_test.dart b/dev/devicelab/bin/tasks/gradle_java8_compile_test.dart index 64581e593c4cd..ec3dd6d9fdd5d 100644 --- a/dev/devicelab/bin/tasks/gradle_java8_compile_test.dart +++ b/dev/devicelab/bin/tasks/gradle_java8_compile_test.dart @@ -90,7 +90,7 @@ class AaaPlugin: FlutterPlugin, MethodCallHandler { options: [ 'apk', '--debug', - '--target-platform=android-arm' + '--target-platform=android-arm', ], ); }); diff --git a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart index 54633719921a0..459b039ab745e 100644 --- a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart +++ b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart @@ -22,7 +22,7 @@ Future main() async { options: [ 'apk', '--debug', - '--target-platform=android-arm' + '--target-platform=android-arm', ], ); }); @@ -54,7 +54,7 @@ Future main() async { options: [ 'apk', '--debug', - '--target-platform=android-x86' + '--target-platform=android-x86', ], ); }); @@ -85,7 +85,7 @@ Future main() async { options: [ 'apk', '--debug', - '--target-platform=android-x64' + '--target-platform=android-x64', ], ); }); @@ -115,7 +115,7 @@ Future main() async { options: [ 'apk', '--release', - '--target-platform=android-arm' + '--target-platform=android-arm', ], ); }); @@ -143,7 +143,7 @@ Future main() async { options: [ 'apk', '--release', - '--target-platform=android-arm64' + '--target-platform=android-arm64', ], ); }); diff --git a/dev/devicelab/bin/tasks/module_custom_host_app_name_test.dart b/dev/devicelab/bin/tasks/module_custom_host_app_name_test.dart index 7f19d887e079a..203f32697fedb 100644 --- a/dev/devicelab/bin/tasks/module_custom_host_app_name_test.dart +++ b/dev/devicelab/bin/tasks/module_custom_host_app_name_test.dart @@ -55,7 +55,7 @@ Future main() async { if (!Platform.isWindows) { await exec('chmod', [ '444', - readonlyTxtAssetFile.path + readonlyTxtAssetFile.path, ]); } diff --git a/dev/devicelab/bin/tasks/module_test.dart b/dev/devicelab/bin/tasks/module_test.dart index 413f2abe81f71..8ef1c54574a7e 100644 --- a/dev/devicelab/bin/tasks/module_test.dart +++ b/dev/devicelab/bin/tasks/module_test.dart @@ -58,7 +58,7 @@ Future main() async { if (!Platform.isWindows) { await exec('chmod', [ '444', - readonlyTxtAssetFile.path + readonlyTxtAssetFile.path, ]); } diff --git a/dev/devicelab/bin/tasks/module_test_ios.dart b/dev/devicelab/bin/tasks/module_test_ios.dart index 996540989a10e..832647f440e48 100644 --- a/dev/devicelab/bin/tasks/module_test_ios.dart +++ b/dev/devicelab/bin/tasks/module_test_ios.dart @@ -425,7 +425,7 @@ end '-archivePath', objectiveCBuildArchiveDirectory.path, 'COMPILER_INDEX_STORE_ENABLE=NO', - 'archive' + 'archive', ], environment: { 'FLUTTER_ANALYTICS_LOG_FILE': objectiveCAnalyticsOutputFile.path, diff --git a/dev/devicelab/bin/tasks/plugin_lint_mac.dart b/dev/devicelab/bin/tasks/plugin_lint_mac.dart index 2ad085f8d1323..01f5209bc33ef 100644 --- a/dev/devicelab/bin/tasks/plugin_lint_mac.dart +++ b/dev/devicelab/bin/tasks/plugin_lint_mac.dart @@ -248,7 +248,7 @@ Future main() async { 'build', options: [ 'ios', - '--no-codesign' + '--no-codesign', ], // TODO(jmagman): Make Objective-C applications handle Swift libraries https://github.com/flutter/flutter/issues/16049 canFail: true @@ -272,7 +272,7 @@ Future main() async { 'build', options: [ 'ios', - '--no-codesign' + '--no-codesign', ], ); }); @@ -305,7 +305,7 @@ Future main() async { 'build', options: [ 'ios', - '--no-codesign' + '--no-codesign', ], ); }); @@ -326,7 +326,7 @@ Future main() async { 'build', options: [ 'ios', - '--no-codesign' + '--no-codesign', ], ); }); @@ -390,7 +390,7 @@ Future main() async { 'build', options: [ 'ios', - '--no-codesign' + '--no-codesign', ], ); }); diff --git a/dev/devicelab/lib/framework/ab.dart b/dev/devicelab/lib/framework/ab.dart index 4f214f9c88ebc..11dbaf00dfc75 100644 --- a/dev/devicelab/lib/framework/ab.dart +++ b/dev/devicelab/lib/framework/ab.dart @@ -50,7 +50,7 @@ class ABTest { final Map resultMap = results as Map; return > { for (String key in resultMap.keys) - key: (resultMap[key] as List).cast() + key: (resultMap[key] as List).cast(), }; } @@ -153,13 +153,13 @@ class ABTest { 'Score', 'Average A', '(noise)', 'Average B', '(noise)', - 'Speed-up' + 'Speed-up', ]; final List alignments = [ FieldJustification.LEFT, FieldJustification.RIGHT, FieldJustification.LEFT, FieldJustification.RIGHT, FieldJustification.LEFT, - FieldJustification.CENTER + FieldJustification.CENTER, ]; final List lengths = List.filled(6, 0); diff --git a/dev/devicelab/lib/tasks/gallery.dart b/dev/devicelab/lib/tasks/gallery.dart index bd7a49fee2b89..aadb1e59a5ab5 100644 --- a/dev/devicelab/lib/tasks/gallery.dart +++ b/dev/devicelab/lib/tasks/gallery.dart @@ -131,7 +131,7 @@ class GalleryTransitionTest { if (transitionDurationFile != null) '$testOutputDirectory/$transitionDurationFile.json', if (timelineTraceFile != null) - '$testOutputDirectory/$timelineTraceFile.json' + '$testOutputDirectory/$timelineTraceFile.json', ], benchmarkScoreKeys: [ if (transitionDurationFile != null) diff --git a/dev/devicelab/lib/tasks/platform_channels_benchmarks.dart b/dev/devicelab/lib/tasks/platform_channels_benchmarks.dart index 5a006e7e58833..48d233c402007 100644 --- a/dev/devicelab/lib/tasks/platform_channels_benchmarks.dart +++ b/dev/devicelab/lib/tasks/platform_channels_benchmarks.dart @@ -29,7 +29,7 @@ TaskFunction runTask(adb.DeviceOperatingSystem operatingSystem) { 'ios,android', '--no-overwrite', '-v', - '.' + '.', ]; print('\nExecuting: $flutterExe $createArgs $appDir'); await utils.eval(flutterExe, createArgs); diff --git a/dev/devicelab/test/metrics_center_test.dart b/dev/devicelab/test/metrics_center_test.dart index 8963d23b8c941..13dfff065ba29 100644 --- a/dev/devicelab/test/metrics_center_test.dart +++ b/dev/devicelab/test/metrics_center_test.dart @@ -82,7 +82,7 @@ void main() { 'device_type': 'Moto G Play', 'device_version': 'android-25', 'host_type': 'linux', - 'host_version': 'debian-10.11' + 'host_version': 'debian-10.11', }; final List metricPoints = parse(results, tags, 'task abc'); diff --git a/dev/integration_tests/ios_add2app_life_cycle/flutterapp/lib/main.dart b/dev/integration_tests/ios_add2app_life_cycle/flutterapp/lib/main.dart index 09eb38291ba8c..358f8ef0d0f38 100644 --- a/dev/integration_tests/ios_add2app_life_cycle/flutterapp/lib/main.dart +++ b/dev/integration_tests/ios_add2app_life_cycle/flutterapp/lib/main.dart @@ -46,7 +46,7 @@ class _LifeCycleSpyState extends State with WidgetsBindingObserver super.initState(); WidgetsBinding.instance.addObserver(this); _actualLifeCycleSequence = [ - ServicesBinding.instance.lifecycleState + ServicesBinding.instance.lifecycleState, ]; } diff --git a/dev/integration_tests/ios_platform_view_tests/lib/main.dart b/dev/integration_tests/ios_platform_view_tests/lib/main.dart index aeb4f44f3188a..5cb467fdf1ccb 100644 --- a/dev/integration_tests/ios_platform_view_tests/lib/main.dart +++ b/dev/integration_tests/ios_platform_view_tests/lib/main.dart @@ -91,7 +91,7 @@ class PlatformViewPage extends StatelessWidget { key: button, child: const Text('button'), onPressed: (){}, - ) + ), ], ), ); diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart index 073345bf752ee..1691b3d2d9a2e 100644 --- a/dev/tools/update_icons.dart +++ b/dev/tools/update_icons.dart @@ -474,7 +474,7 @@ class Icon { '_monoline_filled', '_outlined', '_rounded', - '_sharp' + '_sharp', ]; late String id; // e.g. 5g, 5g_outlined, 5g_rounded, 5g_sharp diff --git a/dev/tools/vitool/test/vitool_test.dart b/dev/tools/vitool/test/vitool_test.dart index b7bf1b391c6f8..c8458badb850a 100644 --- a/dev/tools/vitool/test/vitool_test.dart +++ b/dev/tools/vitool/test/vitool_test.dart @@ -274,7 +274,7 @@ void main() { [ PathCommandAnimation('M', >>[ >[Point(5.0, 6.0)], - ]) + ]), ], opacities: [1.0], )), diff --git a/dev/tracing_tests/test/image_cache_tracing_test.dart b/dev/tracing_tests/test/image_cache_tracing_test.dart index eb8dc94ccc2da..6cc366b46b5d7 100644 --- a/dev/tracing_tests/test/image_cache_tracing_test.dart +++ b/dev/tracing_tests/test/image_cache_tracing_test.dart @@ -34,11 +34,11 @@ void main() { >[ { 'name': 'ImageCache.putIfAbsent', - 'args': {'key': 'Test', 'isolateId': isolateId} + 'args': {'key': 'Test', 'isolateId': isolateId}, }, { 'name': 'listener', - 'args': {'isolateId': isolateId} + 'args': {'isolateId': isolateId}, }, { 'name': 'ImageCache.clear', @@ -48,15 +48,15 @@ void main() { 'liveImages': 1, 'currentSizeInBytes': 0, 'isolateId': isolateId, - } + }, }, { 'name': 'ImageCache.putIfAbsent', - 'args': {'key': 'Test2', 'isolateId': isolateId} + 'args': {'key': 'Test2', 'isolateId': isolateId}, }, { 'name': 'ImageCache.evict', - 'args': {'sizeInBytes': 4, 'isolateId': isolateId} + 'args': {'sizeInBytes': 4, 'isolateId': isolateId}, }, ], ); diff --git a/examples/api/lib/cupertino/dialog/cupertino_action_sheet.0.dart b/examples/api/lib/cupertino/dialog/cupertino_action_sheet.0.dart index 507feee8d24af..4f51d92e0363e 100644 --- a/examples/api/lib/cupertino/dialog/cupertino_action_sheet.0.dart +++ b/examples/api/lib/cupertino/dialog/cupertino_action_sheet.0.dart @@ -59,7 +59,7 @@ class ActionSheetSample extends StatelessWidget { Navigator.pop(context); }, child: const Text('Destructive Action'), - ) + ), ], ), ); diff --git a/examples/api/lib/cupertino/dialog/cupertino_alert_dialog.0.dart b/examples/api/lib/cupertino/dialog/cupertino_alert_dialog.0.dart index f6af0831984ad..cca1cf64f3bd4 100644 --- a/examples/api/lib/cupertino/dialog/cupertino_alert_dialog.0.dart +++ b/examples/api/lib/cupertino/dialog/cupertino_alert_dialog.0.dart @@ -53,7 +53,7 @@ class ActionSheetSample extends StatelessWidget { Navigator.pop(context); }, child: const Text('Yes'), - ) + ), ], ), ); diff --git a/examples/api/lib/cupertino/nav_bar/cupertino_sliver_nav_bar.0.dart b/examples/api/lib/cupertino/nav_bar/cupertino_sliver_nav_bar.0.dart index 864ba983ceb77..1db77aa4e9f25 100644 --- a/examples/api/lib/cupertino/nav_bar/cupertino_sliver_nav_bar.0.dart +++ b/examples/api/lib/cupertino/nav_bar/cupertino_sliver_nav_bar.0.dart @@ -54,7 +54,7 @@ class CupertinoNavBarSample extends StatelessWidget { })); }, child: const Text('Go to Next Page'), - ) + ), ], ), ), diff --git a/examples/api/lib/cupertino/refresh/cupertino_sliver_refresh_control.0.dart b/examples/api/lib/cupertino/refresh/cupertino_sliver_refresh_control.0.dart index ce63503d8bd80..4f129a15e57c7 100644 --- a/examples/api/lib/cupertino/refresh/cupertino_sliver_refresh_control.0.dart +++ b/examples/api/lib/cupertino/refresh/cupertino_sliver_refresh_control.0.dart @@ -33,7 +33,7 @@ class _MyStatefulWidgetState extends State { List colors = [ CupertinoColors.systemYellow, CupertinoColors.systemOrange, - CupertinoColors.systemPink + CupertinoColors.systemPink, ]; List items = [ Container(color: CupertinoColors.systemPink, height: 100.0), diff --git a/examples/api/lib/material/app_bar/app_bar.1.dart b/examples/api/lib/material/app_bar/app_bar.1.dart index 55223828398f7..c5ddf6e393d8e 100644 --- a/examples/api/lib/material/app_bar/app_bar.1.dart +++ b/examples/api/lib/material/app_bar/app_bar.1.dart @@ -41,7 +41,7 @@ class MyStatelessWidget extends StatelessWidget { style: style, onPressed: () {}, child: const Text('Action 2'), - ) + ), ], ), ); diff --git a/examples/api/lib/material/bottom_sheet/show_modal_bottom_sheet.0.dart b/examples/api/lib/material/bottom_sheet/show_modal_bottom_sheet.0.dart index ae6e4800e44bb..e7b770252188d 100644 --- a/examples/api/lib/material/bottom_sheet/show_modal_bottom_sheet.0.dart +++ b/examples/api/lib/material/bottom_sheet/show_modal_bottom_sheet.0.dart @@ -49,7 +49,7 @@ class MyStatelessWidget extends StatelessWidget { ElevatedButton( child: const Text('Close BottomSheet'), onPressed: () => Navigator.pop(context), - ) + ), ], ), ), diff --git a/examples/api/lib/material/icon_button/icon_button.0.dart b/examples/api/lib/material/icon_button/icon_button.0.dart index 9180f15ac789d..2c62fa10d4251 100644 --- a/examples/api/lib/material/icon_button/icon_button.0.dart +++ b/examples/api/lib/material/icon_button/icon_button.0.dart @@ -51,7 +51,7 @@ class _MyStatefulWidgetState extends State { }); }, ), - Text('Volume : $_volume') + Text('Volume : $_volume'), ], ); } diff --git a/examples/api/lib/material/list_tile/list_tile.5.dart b/examples/api/lib/material/list_tile/list_tile.5.dart index 15fd4b168543b..4aff57a23cba2 100644 --- a/examples/api/lib/material/list_tile/list_tile.5.dart +++ b/examples/api/lib/material/list_tile/list_tile.5.dart @@ -140,7 +140,7 @@ class CustomListItemTwo extends StatelessWidget { readDuration: readDuration, ), ), - ) + ), ], ), ), diff --git a/examples/api/lib/material/navigation_bar/navigation_bar.0.dart b/examples/api/lib/material/navigation_bar/navigation_bar.0.dart index d06244f4a860b..4ca40385e2e59 100644 --- a/examples/api/lib/material/navigation_bar/navigation_bar.0.dart +++ b/examples/api/lib/material/navigation_bar/navigation_bar.0.dart @@ -267,7 +267,7 @@ class _HomeState extends State with TickerProviderStateMixin { Destination(0, 'Teal', Icons.home, Colors.teal), Destination(1, 'Cyan', Icons.business, Colors.cyan), Destination(2, 'Orange', Icons.school, Colors.orange), - Destination(3, 'Blue', Icons.flight, Colors.blue) + Destination(3, 'Blue', Icons.flight, Colors.blue), ]; late final List> navigatorKeys; diff --git a/examples/api/lib/material/navigation_rail/navigation_rail.extended_animation.0.dart b/examples/api/lib/material/navigation_rail/navigation_rail.extended_animation.0.dart index 6197e944f6900..e0583df488812 100644 --- a/examples/api/lib/material/navigation_rail/navigation_rail.extended_animation.0.dart +++ b/examples/api/lib/material/navigation_rail/navigation_rail.extended_animation.0.dart @@ -83,7 +83,7 @@ class _MyNavigationRailState extends State { ], ), ), - ) + ), ], ); } diff --git a/examples/api/lib/material/platform_menu_bar/platform_menu_bar.0.dart b/examples/api/lib/material/platform_menu_bar/platform_menu_bar.0.dart index 8b27bad853e3f..88a7308456b0f 100644 --- a/examples/api/lib/material/platform_menu_bar/platform_menu_bar.0.dart +++ b/examples/api/lib/material/platform_menu_bar/platform_menu_bar.0.dart @@ -84,7 +84,7 @@ class _MyMenuBarAppState extends State { onSelected: () { _handleMenuSelection(MenuSelection.about); }, - ) + ), ], ), PlatformMenuItemGroup( @@ -118,7 +118,7 @@ class _MyMenuBarAppState extends State { }, ), ], - ) + ), ], ), if (PlatformProvidedMenuItem.hasMenu(PlatformProvidedMenuItemType.quit)) diff --git a/examples/api/lib/material/popupmenu/popupmenu.0.dart b/examples/api/lib/material/popupmenu/popupmenu.0.dart index 8e9709f3dba1c..76323dfb5bd73 100644 --- a/examples/api/lib/material/popupmenu/popupmenu.0.dart +++ b/examples/api/lib/material/popupmenu/popupmenu.0.dart @@ -65,7 +65,7 @@ class _MyStatefulWidgetState extends State { value: Menu.itemFour, child: Text('Item 4'), ), - ]) + ]), ], ), body: Center( diff --git a/examples/api/lib/material/scaffold/scaffold.of.0.dart b/examples/api/lib/material/scaffold/scaffold.of.0.dart index 48e7cebf20014..85c9046ab7bca 100644 --- a/examples/api/lib/material/scaffold/scaffold.of.0.dart +++ b/examples/api/lib/material/scaffold/scaffold.of.0.dart @@ -53,7 +53,7 @@ class MyScaffoldBody extends StatelessWidget { onPressed: () { Navigator.pop(context); }, - ) + ), ], ), ), diff --git a/examples/api/lib/material/scaffold/scaffold.of.1.dart b/examples/api/lib/material/scaffold/scaffold.of.1.dart index c2a73a2839cb3..b1ee37af70c3d 100644 --- a/examples/api/lib/material/scaffold/scaffold.of.1.dart +++ b/examples/api/lib/material/scaffold/scaffold.of.1.dart @@ -53,7 +53,7 @@ class MyStatelessWidget extends StatelessWidget { onPressed: () { Navigator.pop(context); }, - ) + ), ], ), ), diff --git a/examples/api/lib/material/scaffold/scaffold_state.show_bottom_sheet.0.dart b/examples/api/lib/material/scaffold/scaffold_state.show_bottom_sheet.0.dart index d3e6993b904d8..cdd742cf7da16 100644 --- a/examples/api/lib/material/scaffold/scaffold_state.show_bottom_sheet.0.dart +++ b/examples/api/lib/material/scaffold/scaffold_state.show_bottom_sheet.0.dart @@ -46,10 +46,11 @@ class MyStatelessWidget extends StatelessWidget { children: [ const Text('BottomSheet'), ElevatedButton( - child: const Text('Close BottomSheet'), - onPressed: () { - Navigator.pop(context); - }) + child: const Text('Close BottomSheet'), + onPressed: () { + Navigator.pop(context); + }, + ), ], ), ), diff --git a/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart b/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart index 459f1ca7f22ca..b95b954b51a8a 100644 --- a/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart +++ b/examples/api/lib/ui/text/font_feature.font_feature_historical_ligatures.0.dart @@ -34,7 +34,7 @@ class ExampleWidget extends StatelessWidget { fontFamily: 'Sorts Mill Goudy', fontFeatures: [ FontFeature.historicalForms(), // Enables "hist". - FontFeature.historicalLigatures() // Enables "hlig". + FontFeature.historicalLigatures(), // Enables "hlig". ], ), ); diff --git a/examples/api/lib/widgets/async/future_builder.0.dart b/examples/api/lib/widgets/async/future_builder.0.dart index 20ff39576a8d2..512a10825c166 100644 --- a/examples/api/lib/widgets/async/future_builder.0.dart +++ b/examples/api/lib/widgets/async/future_builder.0.dart @@ -54,7 +54,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: Text('Result: ${snapshot.data}'), - ) + ), ]; } else if (snapshot.hasError) { children = [ @@ -66,7 +66,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: Text('Error: ${snapshot.error}'), - ) + ), ]; } else { children = const [ @@ -78,7 +78,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: EdgeInsets.only(top: 16), child: Text('Awaiting result...'), - ) + ), ]; } return Center( diff --git a/examples/api/lib/widgets/async/stream_builder.0.dart b/examples/api/lib/widgets/async/stream_builder.0.dart index c7e313f0b8aa3..906f676a9726d 100644 --- a/examples/api/lib/widgets/async/stream_builder.0.dart +++ b/examples/api/lib/widgets/async/stream_builder.0.dart @@ -85,7 +85,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: EdgeInsets.only(top: 16), child: Text('Select a lot'), - ) + ), ]; break; case ConnectionState.waiting: @@ -98,7 +98,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: EdgeInsets.only(top: 16), child: Text('Awaiting bids...'), - ) + ), ]; break; case ConnectionState.active: @@ -111,7 +111,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: Text('\$${snapshot.data}'), - ) + ), ]; break; case ConnectionState.done: @@ -124,7 +124,7 @@ class _MyStatefulWidgetState extends State { Padding( padding: const EdgeInsets.only(top: 16), child: Text('\$${snapshot.data} (closed)'), - ) + ), ]; break; } diff --git a/examples/api/lib/widgets/autofill/autofill_group.0.dart b/examples/api/lib/widgets/autofill/autofill_group.0.dart index d63badaceb718..dea0e1ae27308 100644 --- a/examples/api/lib/widgets/autofill/autofill_group.0.dart +++ b/examples/api/lib/widgets/autofill/autofill_group.0.dart @@ -84,13 +84,13 @@ class _MyStatefulWidgetState extends State { TextField( controller: billingAddress1, autofillHints: const [ - AutofillHints.streetAddressLine1 + AutofillHints.streetAddressLine1, ], ), TextField( controller: billingAddress2, autofillHints: const [ - AutofillHints.streetAddressLine2 + AutofillHints.streetAddressLine2, ], ), ], @@ -109,7 +109,7 @@ class _MyStatefulWidgetState extends State { TextField( controller: creditCardSecurityCode, autofillHints: const [ - AutofillHints.creditCardSecurityCode + AutofillHints.creditCardSecurityCode, ], ), ], diff --git a/examples/api/lib/widgets/interactive_viewer/interactive_viewer.builder.0.dart b/examples/api/lib/widgets/interactive_viewer/interactive_viewer.builder.0.dart index 3b99f87434d43..3fad51b78055b 100644 --- a/examples/api/lib/widgets/interactive_viewer/interactive_viewer.builder.0.dart +++ b/examples/api/lib/widgets/interactive_viewer/interactive_viewer.builder.0.dart @@ -43,7 +43,7 @@ class _IVBuilderExampleState extends State<_IVBuilderExample> { for (final Vector3 point in [ quad.point1, quad.point2, - quad.point3 + quad.point3, ]) { if (point.x < xMin) { xMin = point.x; diff --git a/examples/api/lib/widgets/nested_scroll_view/nested_scroll_view.2.dart b/examples/api/lib/widgets/nested_scroll_view/nested_scroll_view.2.dart index f858793ccf9f3..bc6dd2f1f792d 100644 --- a/examples/api/lib/widgets/nested_scroll_view/nested_scroll_view.2.dart +++ b/examples/api/lib/widgets/nested_scroll_view/nested_scroll_view.2.dart @@ -40,7 +40,7 @@ class MyStatelessWidget extends StatelessWidget { expandedHeight: 200.0, forceElevated: innerBoxIsScrolled, ), - ) + ), ]; }, body: Builder(builder: (BuildContext context) { return CustomScrollView( diff --git a/examples/api/lib/widgets/page_storage/page_storage.0.dart b/examples/api/lib/widgets/page_storage/page_storage.0.dart index 5bce2dfcdd428..bb7147d927354 100644 --- a/examples/api/lib/widgets/page_storage/page_storage.0.dart +++ b/examples/api/lib/widgets/page_storage/page_storage.0.dart @@ -33,7 +33,7 @@ class _MyHomePageState extends State { ), ColorBoxPage( key: PageStorageKey('pageTwo'), - ) + ), ]; int currentTab = 0; final PageStorageBucket _bucket = PageStorageBucket(); diff --git a/examples/api/lib/widgets/page_view/page_view.0.dart b/examples/api/lib/widgets/page_view/page_view.0.dart index e18fe940fa3fb..798dbad3e6b6e 100644 --- a/examples/api/lib/widgets/page_view/page_view.0.dart +++ b/examples/api/lib/widgets/page_view/page_view.0.dart @@ -44,7 +44,7 @@ class MyStatelessWidget extends StatelessWidget { ), Center( child: Text('Third Page'), - ) + ), ], ); } diff --git a/examples/api/lib/widgets/transitions/decorated_box_transition.0.dart b/examples/api/lib/widgets/transitions/decorated_box_transition.0.dart index 86fac6523a10b..5aa8641882a83 100644 --- a/examples/api/lib/widgets/transitions/decorated_box_transition.0.dart +++ b/examples/api/lib/widgets/transitions/decorated_box_transition.0.dart @@ -43,7 +43,7 @@ class _MyStatefulWidgetState extends State blurRadius: 10.0, spreadRadius: 3.0, offset: Offset(0, 6.0), - ) + ), ], ), end: BoxDecoration( diff --git a/examples/api/lib/widgets/transitions/sliver_fade_transition.0.dart b/examples/api/lib/widgets/transitions/sliver_fade_transition.0.dart index 2440e70ad7a51..9d35ea32f55be 100644 --- a/examples/api/lib/widgets/transitions/sliver_fade_transition.0.dart +++ b/examples/api/lib/widgets/transitions/sliver_fade_transition.0.dart @@ -80,7 +80,7 @@ class _MyStatefulWidgetState extends State childCount: 5, ), ), - ) + ), ]); } } diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 6ba18ba581f54..40b8e54ed1bd7 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -1907,7 +1907,7 @@ class ThemeData with Diagnosticable { static Map> _themeExtensionIterableToMap(Iterable> extensionsIterable) { return Map>.unmodifiable(>{ // Strangely, the cast is necessary for tests to run. - for (final ThemeExtension extension in extensionsIterable) extension.type: extension as ThemeExtension> + for (final ThemeExtension extension in extensionsIterable) extension.type: extension as ThemeExtension>, }); } diff --git a/packages/flutter/test/material/app_test.dart b/packages/flutter/test/material/app_test.dart index 6279e9a60fed2..505c40b3ec220 100644 --- a/packages/flutter/test/material/app_test.dart +++ b/packages/flutter/test/material/app_test.dart @@ -1076,9 +1076,9 @@ void main() { height: 1000.0, width: 1000.0, child: Text('Test'), - ) - ] - ) + ), + ], + ), )); expect(find.byType(StretchingOverscrollIndicator), findsNothing); @@ -1094,9 +1094,9 @@ void main() { height: 1000.0, width: 1000.0, child: Text('Test'), - ) - ] - ) + ), + ], + ), )); expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); @@ -1106,15 +1106,15 @@ void main() { testWidgets('ScrollBehavior stretch android overscroll indicator via useMaterial3 flag', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( theme: ThemeData(useMaterial3: true), - home: ListView( - children: const [ - SizedBox( - height: 1000.0, - width: 1000.0, - child: Text('Test'), - ) - ] - ) + home: ListView( + children: const [ + SizedBox( + height: 1000.0, + width: 1000.0, + child: Text('Test'), + ), + ], + ), )); expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); @@ -1131,9 +1131,9 @@ void main() { height: 1000.0, width: 1000.0, child: Text('Test'), - ) - ] - ) + ), + ], + ), )); expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); @@ -1151,9 +1151,9 @@ void main() { height: 1000.0, width: 1000.0, child: Text('Test'), - ) - ] - ) + ), + ], + ), )); expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart index 2fcdaa4d6de28..4a0dae1266809 100644 --- a/packages/flutter/test/material/dropdown_test.dart +++ b/packages/flutter/test/material/dropdown_test.dart @@ -3322,7 +3322,7 @@ void main() { alignment: buttonAlignment ?? AlignmentDirectional.centerStart, value: 'enabled', child: const Text('enabled'), - ) + ), ], ), ), @@ -3573,7 +3573,7 @@ void main() { value, 'Two', 'Free', - 'Four' + 'Four', ].map>((String value) { return DropdownMenuItem( value: value, diff --git a/packages/flutter/test/material/popup_menu_test.dart b/packages/flutter/test/material/popup_menu_test.dart index 91b8e617ac268..dd808690d9a30 100644 --- a/packages/flutter/test/material/popup_menu_test.dart +++ b/packages/flutter/test/material/popup_menu_test.dart @@ -869,8 +869,8 @@ void main() { bounds: Rect.fromLTRB(390, 0, 410, 600), type: DisplayFeatureType.cutout, state: DisplayFeatureState.unknown, - ) - ] + ), + ], ), child: Scaffold( body: Navigator( @@ -2215,20 +2215,22 @@ void main() { home: Scaffold( appBar: AppBar( title: const Text('PopupMenu Test'), - actions: [PopupMenuButton( - child: SizedBox( - key: buttonKey, - height: height, - width: width, - child: const ColoredBox( - color: Colors.pink, + actions: [ + PopupMenuButton( + child: SizedBox( + key: buttonKey, + height: height, + width: width, + child: const ColoredBox( + color: Colors.pink, + ), ), + itemBuilder: (BuildContext context) => >[ + const PopupMenuItem(value: 1, child: Text('-1-')), + const PopupMenuItem(value: 2, child: Text('-2-')), + ], ), - itemBuilder: (BuildContext context) => >[ - const PopupMenuItem(value: 1, child: Text('-1-')), - const PopupMenuItem(value: 2, child: Text('-2-')), - ], - )], + ], ), body: Container(), ), @@ -2269,30 +2271,32 @@ void main() { home: Scaffold( appBar: AppBar( title: const Text('PopupMenu Test'), - actions: [PopupMenuButton( - child: SizedBox( - key: buttonKey, - height: height, - width: width, - child: const ColoredBox( - color: Colors.pink, + actions: [ + PopupMenuButton( + child: SizedBox( + key: buttonKey, + height: height, + width: width, + child: const ColoredBox( + color: Colors.pink, + ), ), - ), - itemBuilder: (BuildContext context) { - return >[ - PopupMenuItem( - value: 1, - child: Builder( - builder: (BuildContext context) { - mediaQueryPadding = MediaQuery.of(context).padding; - return Text('-1-' * 500); // A long long text string. - }, + itemBuilder: (BuildContext context) { + return >[ + PopupMenuItem( + value: 1, + child: Builder( + builder: (BuildContext context) { + mediaQueryPadding = MediaQuery.of(context).padding; + return Text('-1-' * 500); // A long long text string. + }, + ), ), - ), - const PopupMenuItem(value: 2, child: Text('-2-')), - ]; - }, - )], + const PopupMenuItem(value: 2, child: Text('-2-')), + ]; + }, + ), + ], ), body: const SizedBox.shrink(), ), @@ -2570,7 +2574,7 @@ void main() { splashRadius: splashRadius, child: const Text('An item'), itemBuilder: (_) => >[ - const PopupMenuDivider() + const PopupMenuDivider(), ], ), ), diff --git a/packages/flutter/test/material/scrollbar_theme_test.dart b/packages/flutter/test/material/scrollbar_theme_test.dart index 1a876dafe894f..4182c511c9f99 100644 --- a/packages/flutter/test/material/scrollbar_theme_test.dart +++ b/packages/flutter/test/material/scrollbar_theme_test.dart @@ -662,7 +662,7 @@ void main() { "trackBorderColor: Instance of '_MaterialStatePropertyWith'", 'crossAxisMargin: 3.0', 'mainAxisMargin: 6.0', - 'minThumbLength: 120.0' + 'minThumbLength: 120.0', ]); // On the web, Dart doubles and ints are backed by the same kind of object because diff --git a/packages/flutter/test/material/slider_theme_test.dart b/packages/flutter/test/material/slider_theme_test.dart index e890fdd064dc2..0a51d8406e1a2 100644 --- a/packages/flutter/test/material/slider_theme_test.dart +++ b/packages/flutter/test/material/slider_theme_test.dart @@ -90,7 +90,7 @@ void main() { "rangeValueIndicatorShape: Instance of 'PaddleRangeSliderValueIndicatorShape'", 'showValueIndicator: always', 'valueIndicatorTextStyle: TextStyle(inherit: true, color: Color(0xff000000))', - 'mouseCursor: MaterialStateMouseCursor(clickable)' + 'mouseCursor: MaterialStateMouseCursor(clickable)', ]); }); diff --git a/packages/flutter/test/material/theme_data_test.dart b/packages/flutter/test/material/theme_data_test.dart index d44e5039d8675..2bedf53a3f1f4 100644 --- a/packages/flutter/test/material/theme_data_test.dart +++ b/packages/flutter/test/material/theme_data_test.dart @@ -447,7 +447,7 @@ void main() { ), MyThemeExtensionB( textStyle: TextStyle(fontSize: 50), - ) + ), }, ), home: Container(key: containerKey), diff --git a/packages/flutter/test/material/tooltip_test.dart b/packages/flutter/test/material/tooltip_test.dart index 2d25385bc6dc9..fcd72b1590fbd 100644 --- a/packages/flutter/test/material/tooltip_test.dart +++ b/packages/flutter/test/material/tooltip_test.dart @@ -1144,7 +1144,7 @@ void main() { waitDuration: waitDuration, showDuration: Duration(days: 1), child: Text('tooltip2'), - ) + ), ], ), ), diff --git a/packages/flutter/test/material/will_pop_test.dart b/packages/flutter/test/material/will_pop_test.dart index 6a8d0903585c2..80fef13b78950 100644 --- a/packages/flutter/test/material/will_pop_test.dart +++ b/packages/flutter/test/material/will_pop_test.dart @@ -410,7 +410,7 @@ void main() { child: const Text('anchor'), ); }, - ) + ), ]; Widget _buildNavigator(Key? key, List> pages) { diff --git a/packages/flutter/test/painting/_network_image_test_web.dart b/packages/flutter/test/painting/_network_image_test_web.dart index ff50f10e00d7c..bd1769309f12c 100644 --- a/packages/flutter/test/painting/_network_image_test_web.dart +++ b/packages/flutter/test/painting/_network_image_test_web.dart @@ -33,7 +33,7 @@ void runTests() { const Map headers = { 'flutter': 'flutter', - 'second': 'second' + 'second': 'second', }; final Image image = Image.network( @@ -60,7 +60,7 @@ void runTests() { const Map headers = { 'flutter': 'flutter', - 'second': 'second' + 'second': 'second', }; final Image image = Image.network( @@ -87,7 +87,7 @@ void runTests() { const Map headers = { 'flutter': 'flutter', - 'second': 'second' + 'second': 'second', }; final Image image = Image.network( diff --git a/packages/flutter/test/scheduler/scheduler_test.dart b/packages/flutter/test/scheduler/scheduler_test.dart index 50e1f6b206ec2..84b50c66e9c34 100644 --- a/packages/flutter/test/scheduler/scheduler_test.dart +++ b/packages/flutter/test/scheduler/scheduler_test.dart @@ -140,15 +140,17 @@ void main() { }); test('Flutter.Frame event fired', () async { - SchedulerBinding.instance.platformDispatcher.onReportTimings!([FrameTiming( - vsyncStart: 5000, - buildStart: 10000, - buildFinish: 15000, - rasterStart: 16000, - rasterFinish: 20000, - rasterFinishWallTime: 20010, - frameNumber: 1991 - )]); + SchedulerBinding.instance.platformDispatcher.onReportTimings!([ + FrameTiming( + vsyncStart: 5000, + buildStart: 10000, + buildFinish: 15000, + rasterStart: 16000, + rasterFinish: 20000, + rasterFinishWallTime: 20010, + frameNumber: 1991, + ), + ]); final List> events = scheduler.getEventsDispatched('Flutter.Frame'); expect(events, hasLength(1)); diff --git a/packages/flutter/test/services/system_chrome_test.dart b/packages/flutter/test/services/system_chrome_test.dart index b39fa929a1806..4b2ae76d6c6e2 100644 --- a/packages/flutter/test/services/system_chrome_test.dart +++ b/packages/flutter/test/services/system_chrome_test.dart @@ -34,7 +34,7 @@ void main() { 'statusBarBrightness': 'Brightness.dark', 'statusBarIconBrightness': 'Brightness.light', 'systemNavigationBarIconBrightness': 'Brightness.light', - 'systemNavigationBarContrastEnforced': null + 'systemNavigationBarContrastEnforced': null, }, )); log.clear(); @@ -47,7 +47,7 @@ void main() { SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( systemStatusBarContrastEnforced: false, - systemNavigationBarContrastEnforced: true + systemNavigationBarContrastEnforced: true, )); expect(tester.binding.microtaskCount, equals(1)); await tester.idle(); @@ -62,7 +62,7 @@ void main() { 'statusBarBrightness': null, 'statusBarIconBrightness': null, 'systemNavigationBarIconBrightness': null, - 'systemNavigationBarContrastEnforced': true + 'systemNavigationBarContrastEnforced': true, }, )); }); diff --git a/packages/flutter/test/widgets/actions_test.dart b/packages/flutter/test/widgets/actions_test.dart index 3cee40c5538ce..9f0401ba389ab 100644 --- a/packages/flutter/test/widgets/actions_test.dart +++ b/packages/flutter/test/widgets/actions_test.dart @@ -1470,7 +1470,7 @@ void main() { setState = stateSetter; return Actions( actions: > { - if (action2LookupContext != null) LogIntent: Action.overridable(defaultAction: LogInvocationAction(actionName: 'action2'), context: action2LookupContext!) + if (action2LookupContext != null) LogIntent: Action.overridable(defaultAction: LogInvocationAction(actionName: 'action2'), context: action2LookupContext!), }, child: Builder( builder: (BuildContext context3) { @@ -1579,7 +1579,7 @@ void main() { context: context2, ), context: context3, - ) + ), }, child: Builder( builder: (BuildContext context4) { diff --git a/packages/flutter/test/widgets/animated_size_test.dart b/packages/flutter/test/widgets/animated_size_test.dart index d58d61f1630b9..9d2a5cb29cd3b 100644 --- a/packages/flutter/test/widgets/animated_size_test.dart +++ b/packages/flutter/test/widgets/animated_size_test.dart @@ -389,7 +389,7 @@ void main() { const SizedBox( key: key2, height: 200, - ) + ), ], ), ) @@ -416,10 +416,10 @@ void main() { key: key2, height: 200, child: animatedSize, - ) + ), ], ), - ) + ), ); expect( diff --git a/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart b/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart index 28375d25328c2..50516495c87fc 100644 --- a/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart +++ b/packages/flutter/test/widgets/draggable_scrollable_sheet_test.dart @@ -1016,7 +1016,7 @@ void main() { _boilerplate( null, controller: controller, - ) + ), ], ), ), null, EnginePhase.build); diff --git a/packages/flutter/test/widgets/layout_builder_and_parent_data_test.dart b/packages/flutter/test/widgets/layout_builder_and_parent_data_test.dart index a6ab9a32b23eb..70f42972262b1 100644 --- a/packages/flutter/test/widgets/layout_builder_and_parent_data_test.dart +++ b/packages/flutter/test/widgets/layout_builder_and_parent_data_test.dart @@ -60,10 +60,12 @@ void main() { int frame = 1; await tester.pumpWidget(SizeChanger( // when this is triggered, the child LayoutBuilder will build again child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { - return Column(children: [Expanded( - flex: frame, // this is different after the next pump, so that the parentData has to be applied again - child: Container(height: 100.0), - )]); + return Column(children: [ + Expanded( + flex: frame, // this is different after the next pump, so that the parentData has to be applied again + child: Container(height: 100.0), + ), + ]); }), )); frame += 1; diff --git a/packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart b/packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart index e4129e5713a35..341f4924962d8 100644 --- a/packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart +++ b/packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart @@ -368,11 +368,11 @@ void main() { color: const Color(0xD0FF0000), height: 100, ), - ) + ), ], - ) + ), ), - ) + ), )); expect(find.text('Index 1'), findsOneWidget); @@ -396,41 +396,43 @@ void main() { testWidgets('Clip behavior is updated as needed', (WidgetTester tester) async { // Regression test for https://github.com/flutter/flutter/issues/97867 - await tester.pumpWidget(Directionality( + await tester.pumpWidget( + Directionality( textDirection: TextDirection.ltr, child: MediaQuery( data: const MediaQueryData(size: Size(800.0, 600.0)), child: ScrollConfiguration( - behavior: const ScrollBehavior().copyWith(overscroll: false), - child: Column( - children: [ - StretchingOverscrollIndicator( - axisDirection: AxisDirection.down, - child: SizedBox( - height: 300, - child: ListView.builder( - itemCount: 20, - itemBuilder: (BuildContext context, int index){ - return Padding( - padding: const EdgeInsets.all(10.0), - child: Text('Index $index'), - ); - }, - ), + behavior: const ScrollBehavior().copyWith(overscroll: false), + child: Column( + children: [ + StretchingOverscrollIndicator( + axisDirection: AxisDirection.down, + child: SizedBox( + height: 300, + child: ListView.builder( + itemCount: 20, + itemBuilder: (BuildContext context, int index){ + return Padding( + padding: const EdgeInsets.all(10.0), + child: Text('Index $index'), + ); + }, ), ), - Opacity( - opacity: 0.5, - child: Container( - color: const Color(0xD0FF0000), - height: 100, - ), - ) - ], - ) + ), + Opacity( + opacity: 0.5, + child: Container( + color: const Color(0xD0FF0000), + height: 100, + ), + ), + ], + ), ), - ) - )); + ), + ), + ); expect(find.text('Index 1'), findsOneWidget); expect(tester.getCenter(find.text('Index 1')).dy, 51.0); diff --git a/packages/flutter/test/widgets/platform_menu_bar_test.dart b/packages/flutter/test/widgets/platform_menu_bar_test.dart index 1034afdd27c07..cd0a02c9e53a6 100644 --- a/packages/flutter/test/widgets/platform_menu_bar_test.dart +++ b/packages/flutter/test/widgets/platform_menu_bar_test.dart @@ -131,15 +131,15 @@ void main() { 'enabled': true, 'shortcutTrigger': 100, 'shortcutModifiers': 1, - } - ] + }, + ], }, { 'id': 17, 'label': 'Sub Menu 12', 'enabled': true, - } - ] + }, + ], }, { 'id': 20, @@ -153,8 +153,8 @@ void main() { }, ], }, - {'id': 21, 'label': 'Menu 3', 'enabled': false, 'children': >[]} - ] + {'id': 21, 'label': 'Menu 3', 'enabled': false, 'children': >[]}, + ], }), ); }); diff --git a/packages/flutter/test/widgets/scroll_behavior_test.dart b/packages/flutter/test/widgets/scroll_behavior_test.dart index 434990a2650a6..b45583b6fccf6 100644 --- a/packages/flutter/test/widgets/scroll_behavior_test.dart +++ b/packages/flutter/test/widgets/scroll_behavior_test.dart @@ -82,7 +82,8 @@ void main() { }); testWidgets('ScrollBehavior default android overscroll indicator', (WidgetTester tester) async { - await tester.pumpWidget(Directionality( + await tester.pumpWidget( + Directionality( textDirection: TextDirection.ltr, child: ScrollConfiguration( behavior: const ScrollBehavior(), @@ -92,35 +93,38 @@ void main() { height: 1000.0, width: 1000.0, child: Text('Test'), - ) - ] - ) + ), + ], + ), ), - )); + ), + ); expect(find.byType(StretchingOverscrollIndicator), findsNothing); expect(find.byType(GlowingOverscrollIndicator), findsOneWidget); }, variant: TargetPlatformVariant.only(TargetPlatform.android)); testWidgets('ScrollBehavior stretch android overscroll indicator', (WidgetTester tester) async { - await tester.pumpWidget(Directionality( - textDirection: TextDirection.ltr, - child: MediaQuery( - data: const MediaQueryData(size: Size(800, 600)), - child: ScrollConfiguration( + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: MediaQuery( + data: const MediaQueryData(size: Size(800, 600)), + child: ScrollConfiguration( behavior: const ScrollBehavior(androidOverscrollIndicator: AndroidOverscrollIndicator.stretch), child: ListView( - children: const [ - SizedBox( - height: 1000.0, - width: 1000.0, - child: Text('Test'), - ) - ] - ) + children: const [ + SizedBox( + height: 1000.0, + width: 1000.0, + child: Text('Test'), + ), + ], + ), + ), ), ), - )); + ); expect(find.byType(StretchingOverscrollIndicator), findsOneWidget); expect(find.byType(GlowingOverscrollIndicator), findsNothing); diff --git a/packages/flutter/test/widgets/scrollable_test.dart b/packages/flutter/test/widgets/scrollable_test.dart index 4a63048f3dbff..b5b6689cbccc1 100644 --- a/packages/flutter/test/widgets/scrollable_test.dart +++ b/packages/flutter/test/widgets/scrollable_test.dart @@ -402,12 +402,14 @@ void main() { MaterialApp( home: CustomScrollView( physics: canDrag ? const AlwaysScrollableScrollPhysics() : const NeverScrollableScrollPhysics(), - slivers: [SliverToBoxAdapter( - child: SizedBox( - height: 2000, - child: GestureDetector(onTap: () {}), + slivers: [ + SliverToBoxAdapter( + child: SizedBox( + height: 2000, + child: GestureDetector(onTap: () {}), + ), ), - )], + ], ), ), ); diff --git a/packages/flutter/test/widgets/selectable_text_test.dart b/packages/flutter/test/widgets/selectable_text_test.dart index c56899bacbc5e..3e28b67093928 100644 --- a/packages/flutter/test/widgets/selectable_text_test.dart +++ b/packages/flutter/test/widgets/selectable_text_test.dart @@ -2197,7 +2197,7 @@ void main() { actions: [SemanticsAction.longPress], label: 'German greeting for good day', textDirection: TextDirection.ltr, - ) + ), ], ), ignoreTransform: true, ignoreRect: true)); }); @@ -2398,7 +2398,7 @@ void main() { TestSemantics( flags: [ SemanticsFlag.isHidden, - SemanticsFlag.isLink + SemanticsFlag.isLink, ], actions: [SemanticsAction.tap], label: 'off screen', diff --git a/packages/flutter/test/widgets/transform_test.dart b/packages/flutter/test/widgets/transform_test.dart index a21056e86a86b..751006a574c5e 100644 --- a/packages/flutter/test/widgets/transform_test.dart +++ b/packages/flutter/test/widgets/transform_test.dart @@ -411,8 +411,8 @@ void main() { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, - 25.0, 25.0, 0.0, 1.0] - ); + 25.0, 25.0, 0.0, 1.0, + ]); }); testWidgets('Transform.scale with FilterQuality produces filter layer', (WidgetTester tester) async { @@ -429,8 +429,8 @@ void main() { 3.14159, 0.0, 0.0, 0.0, 0.0, 3.14159, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, - -856.636, -642.477, 0.0, 1.0] - ); + -856.636, -642.477, 0.0, 1.0, + ]); }); testWidgets('Transform.rotate with FilterQuality produces filter layer', (WidgetTester tester) async { @@ -447,8 +447,8 @@ void main() { moreOrLessEquals(0.7071067811865476), moreOrLessEquals(0.7071067811865475), 0.0, 0.0, moreOrLessEquals(-0.7071067811865475), moreOrLessEquals(0.7071067811865476), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, - moreOrLessEquals(329.28932188134524), moreOrLessEquals(-194.97474683058329), 0.0, 1.0] - ); + moreOrLessEquals(329.28932188134524), moreOrLessEquals(-194.97474683058329), 0.0, 1.0, + ]); }); testWidgets('Offset Transform.rotate with FilterQuality produces filter layer', (WidgetTester tester) async { @@ -469,8 +469,8 @@ void main() { moreOrLessEquals(0.7071067811865476), moreOrLessEquals(0.7071067811865475), 0.0, 0.0, moreOrLessEquals(-0.7071067811865475), moreOrLessEquals(0.7071067811865476), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, - moreOrLessEquals(329.28932188134524), moreOrLessEquals(-194.97474683058329), 0.0, 1.0] - ); + moreOrLessEquals(329.28932188134524), moreOrLessEquals(-194.97474683058329), 0.0, 1.0, + ]); }); testWidgets('Transform layers update to match child and filterQuality', (WidgetTester tester) async { diff --git a/packages/flutter/test/widgets/transitions_test.dart b/packages/flutter/test/widgets/transitions_test.dart index 07dee3f06abe5..47b6809a3bc0d 100644 --- a/packages/flutter/test/widgets/transitions_test.dart +++ b/packages/flutter/test/widgets/transitions_test.dart @@ -25,11 +25,13 @@ void main() { width: 4.0, ), borderRadius: BorderRadius.zero, - boxShadow: const [BoxShadow( - color: Color(0x66000000), - blurRadius: 10.0, - spreadRadius: 4.0, - )], + boxShadow: const [ + BoxShadow( + color: Color(0x66000000), + blurRadius: 10.0, + spreadRadius: 4.0, + ), + ], ), end: BoxDecoration( color: const Color(0xFF000000), diff --git a/packages/flutter_driver/lib/src/common/wait.dart b/packages/flutter_driver/lib/src/common/wait.dart index b0cc8cfbb4e24..d6dd2b9954e6f 100644 --- a/packages/flutter_driver/lib/src/common/wait.dart +++ b/packages/flutter_driver/lib/src/common/wait.dart @@ -65,7 +65,7 @@ abstract class SerializableWaitCondition { /// Serializes the object to JSON. Map serialize() { return { - 'conditionName': conditionName + 'conditionName': conditionName, }; } diff --git a/packages/flutter_driver/test/src/real_tests/extension_test.dart b/packages/flutter_driver/test/src/real_tests/extension_test.dart index ae197b5bd3a61..99b0b302909a3 100644 --- a/packages/flutter_driver/test/src/real_tests/extension_test.dart +++ b/packages/flutter_driver/test/src/real_tests/extension_test.dart @@ -1154,9 +1154,8 @@ void main() { height: 0, width: 0, child: Text('World!', key: Key('widgetTwo')), - ) - ], - ), + ), + ]), ), ); diff --git a/packages/flutter_driver/test/src/real_tests/flutter_driver_test.dart b/packages/flutter_driver/test/src/real_tests/flutter_driver_test.dart index 8679f66bf826d..3888da784135b 100644 --- a/packages/flutter_driver/test/src/real_tests/flutter_driver_test.dart +++ b/packages/flutter_driver/test/src/real_tests/flutter_driver_test.dart @@ -108,7 +108,7 @@ void main() { await driver.waitFor(find.byTooltip('foo'), timeout: _kTestTimeout); expect(log, [ 'VMServiceFlutterDriver: >>> {command: waitFor, timeout: $_kSerializedTestTimeout, finderType: ByTooltipMessage, text: foo}', - 'VMServiceFlutterDriver: <<< {isError: false, response: {status: ok}}' + 'VMServiceFlutterDriver: <<< {isError: false, response: {status: ok}}', ]); }); @@ -587,7 +587,7 @@ void main() { 'setVMTimelineFlags [Dart, GC, Compiler]', 'getFlagList', 'setVMTimelineFlags []', - 'getVMTimeline null null' + 'getVMTimeline null null', ]); expect(timeline.events!.single.name, 'test event'); @@ -679,7 +679,7 @@ void main() { expect(fakeClient.commandLog, [ 'ext.flutter.driver {command: set_frame_sync, enabled: false}', 'ext.flutter.driver {command: waitFor, timeout: $_kSerializedTestTimeout, finderType: ByTooltipMessage, text: foo}', - 'ext.flutter.driver {command: set_frame_sync, enabled: true}' + 'ext.flutter.driver {command: set_frame_sync, enabled: true}', ]); }); }); diff --git a/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart b/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart index f5287e50b4599..0c0c94098060e 100644 --- a/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart +++ b/packages/flutter_driver/test/src/real_tests/timeline_summary_test.dart @@ -53,8 +53,8 @@ void main() { 'ph': 'b', 'ts': timeStamp, 'args': { - 'vsync_transitions_missed': vsyncsMissed.toString() - } + 'vsync_transitions_missed': vsyncsMissed.toString(), + }, }; Map lagEnd(int timeStamp, int vsyncsMissed) => { @@ -62,8 +62,8 @@ void main() { 'ph': 'e', 'ts': timeStamp, 'args': { - 'vsync_transitions_missed': vsyncsMissed.toString() - } + 'vsync_transitions_missed': vsyncsMissed.toString(), + }, }; Map cpuUsage(int timeStamp, double cpuUsage) => { @@ -71,8 +71,8 @@ void main() { 'name': 'CpuUsage', 'ts': timeStamp, 'args': { - 'total_cpu_usage': cpuUsage.toString() - } + 'total_cpu_usage': cpuUsage.toString(), + }, }; Map memoryUsage(int timeStamp, double dirty, double shared) => { @@ -82,7 +82,7 @@ void main() { 'args': { 'owned_shared_memory_usage': shared.toString(), 'dirty_memory_usage': dirty.toString(), - } + }, }; Map platformVsync(int timeStamp) => { @@ -98,7 +98,7 @@ void main() { 'args': { 'StartTime': startTime, 'TargetTime': endTime, - } + }, }; List> _genGC(String name, int count, int startTime, int timeDiff) { diff --git a/packages/flutter_driver/test/src/real_tests/wait_test.dart b/packages/flutter_driver/test/src/real_tests/wait_test.dart index adf99a45e8a48..ebbe0d780c941 100644 --- a/packages/flutter_driver/test/src/real_tests/wait_test.dart +++ b/packages/flutter_driver/test/src/real_tests/wait_test.dart @@ -135,7 +135,7 @@ void main() { const CombinedCondition combinedCondition = CombinedCondition([ NoTransientCallbacks(), - NoPendingFrame() + NoPendingFrame(), ]); expect(combinedCondition.serialize(), { diff --git a/packages/flutter_goldens/test/flutter_goldens_test.dart b/packages/flutter_goldens/test/flutter_goldens_test.dart index 4363c0416da4e..bdcdd7983022b 100644 --- a/packages/flutter_goldens/test/flutter_goldens_test.dart +++ b/packages/flutter_goldens/test/flutter_goldens_test.dart @@ -22,11 +22,12 @@ import 'json_templates.dart'; const String _kFlutterRoot = '/flutter'; // 1x1 transparent pixel -const List _kTestPngBytes = -[137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, +const List _kTestPngBytes = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 11, 73, 68, 65, 84, 120, 1, 99, 97, 0, 2, 0, 0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, - 78, 68, 174, 66, 96, 130]; + 78, 68, 174, 66, 96, 130, +]; void main() { late MemoryFileSystem fs; @@ -547,7 +548,7 @@ void main() { 'SWARMING_TASK_ID' : '12345678990', 'GOLDCTL' : 'goldctl', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform), @@ -561,7 +562,7 @@ void main() { 'FLUTTER_ROOT': _kFlutterRoot, 'SWARMING_TASK_ID' : '12345678990', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform), @@ -575,9 +576,9 @@ void main() { 'FLUTTER_ROOT': _kFlutterRoot, 'SWARMING_TASK_ID' : '12345678990', 'GOLDCTL' : 'goldctl', - 'GOLD_TRYJOB' : 'git/ref/12345/head' + 'GOLD_TRYJOB' : 'git/ref/12345/head', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform), @@ -592,9 +593,9 @@ void main() { 'CIRRUS_CI': 'true', 'CIRRUS_PR': '', 'CIRRUS_BRANCH': 'master', - 'GOLD_SERVICE_ACCOUNT': 'service account...' + 'GOLD_SERVICE_ACCOUNT': 'service account...', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform), @@ -664,9 +665,9 @@ void main() { 'FLUTTER_ROOT': _kFlutterRoot, 'SWARMING_TASK_ID' : '12345678990', 'GOLDCTL' : 'goldctl', - 'GOLD_TRYJOB' : 'git/ref/12345/head' + 'GOLD_TRYJOB' : 'git/ref/12345/head', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPreSubmitFileComparator.isAvailableForEnvironment(platform), @@ -679,7 +680,7 @@ void main() { environment: { 'FLUTTER_ROOT': _kFlutterRoot, }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPreSubmitFileComparator.isAvailableForEnvironment(platform), @@ -692,9 +693,9 @@ void main() { environment: { 'FLUTTER_ROOT': _kFlutterRoot, 'SWARMING_TASK_ID' : '12345678990', - 'GOLD_TRYJOB' : 'git/ref/12345/head' + 'GOLD_TRYJOB' : 'git/ref/12345/head', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPreSubmitFileComparator.isAvailableForEnvironment(platform), @@ -709,7 +710,7 @@ void main() { 'SWARMING_TASK_ID' : '12345678990', 'GOLDCTL' : 'goldctl', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPreSubmitFileComparator.isAvailableForEnvironment(platform), @@ -724,9 +725,9 @@ void main() { 'CIRRUS_CI': 'true', 'CIRRUS_PR': '', 'CIRRUS_BRANCH': 'master', - 'GOLD_SERVICE_ACCOUNT': 'service account...' + 'GOLD_SERVICE_ACCOUNT': 'service account...', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform), @@ -744,7 +745,7 @@ void main() { 'FLUTTER_ROOT': _kFlutterRoot, 'CIRRUS_CI' : 'yep', }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterSkippingFileComparator.isAvailableForEnvironment(platform), @@ -771,7 +772,7 @@ void main() { environment: { 'FLUTTER_ROOT': _kFlutterRoot, }, - operatingSystem: 'macos' + operatingSystem: 'macos', ); expect( FlutterSkippingFileComparator.isAvailableForEnvironment( @@ -795,7 +796,7 @@ void main() { fs: fs, platform: FakePlatform( environment: {'FLUTTER_ROOT': _kFlutterRoot}, - operatingSystem: 'macos' + operatingSystem: 'macos', ), ); diff --git a/packages/flutter_goldens/test/json_templates.dart b/packages/flutter_goldens/test/json_templates.dart index 2791a23c0ac68..d6e7d624e878a 100644 --- a/packages/flutter_goldens/test/json_templates.dart +++ b/packages/flutter_goldens/test/json_templates.dart @@ -20,10 +20,14 @@ String authTemplate({ /// https://flutter-gold.skia.org/img/images/[imageHash].png List> imageResponseTemplate() { return >[ - [137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, - 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0], - [0, 0, 11, 73, 68, 65, 84, 120, 1, 99, 97, 0, 2, 0, + [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, + 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, + ], + [ + 0, 0, 11, 73, 68, 65, 84, 120, 1, 99, 97, 0, 2, 0, 0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, - 130], + 130, + ], ]; } diff --git a/packages/flutter_test/lib/src/controller.dart b/packages/flutter_test/lib/src/controller.dart index c208559fb8cfb..f7b8162ab8e3c 100644 --- a/packages/flutter_test/lib/src/controller.dart +++ b/packages/flutter_test/lib/src/controller.dart @@ -722,7 +722,7 @@ abstract class WidgetController { delta: offsets[t+1] - offsets[t], pointer: pointer, buttons: buttons, - ) + ), ]), ], PointerEventRecord(duration, [ @@ -734,7 +734,7 @@ abstract class WidgetController { // change = PointerChange.up, which translates to PointerUpEvent, // doesn't provide the button field. // buttons: buttons, - ) + ), ]), ]; return TestAsyncUtils.guard(() async { diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart index 5434b0be538fe..c6ae9df17c744 100644 --- a/packages/flutter_test/lib/src/matchers.dart +++ b/packages/flutter_test/lib/src/matchers.dart @@ -604,7 +604,7 @@ Matcher matchesSemantics({ if (hasToggledState) SemanticsFlag.hasToggledState, if (isToggled) SemanticsFlag.isToggled, if (hasImplicitScrolling) SemanticsFlag.hasImplicitScrolling, - if (isSlider) SemanticsFlag.isSlider + if (isSlider) SemanticsFlag.isSlider, ]; final List actions = [ diff --git a/packages/flutter_test/lib/src/test_async_utils.dart b/packages/flutter_test/lib/src/test_async_utils.dart index 2a4003d3202a4..c5e81394828d3 100644 --- a/packages/flutter_test/lib/src/test_async_utils.dart +++ b/packages/flutter_test/lib/src/test_async_utils.dart @@ -274,7 +274,7 @@ class TestAsyncUtils { if (_scopeStack.isNotEmpty) { final List information = [ ErrorSummary('Asynchronous call to guarded function leaked.'), - ErrorHint('You must use "await" with all Future-returning test APIs.') + ErrorHint('You must use "await" with all Future-returning test APIs.'), ]; for (final _AsyncScope scope in _scopeStack) { final _StackEntry? guarder = _findResponsibleMethod(scope.creationStack, 'guard', information); diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart index b7d87cb7df565..7ee9027a862f5 100644 --- a/packages/flutter_test/lib/src/widget_tester.dart +++ b/packages/flutter_test/lib/src/widget_tester.dart @@ -977,7 +977,7 @@ class WidgetTester extends WidgetController implements HitTestDispatcher, Ticker 'should be disposed by calling dispose() on the AnimationController itself. ' 'Otherwise, the ticker will leak.' ), - ticker.describeForError('The offending ticker was') + ticker.describeForError('The offending ticker was'), ]); } } @@ -1002,7 +1002,7 @@ class WidgetTester extends WidgetController implements HitTestDispatcher, Ticker 'If your test uses SemanticsTester, it is ' 'sufficient to call dispose() on SemanticsTester. Otherwise, the ' 'existing handle will leak into another test and alter its behavior.' - ) + ), ]); } _lastRecordedSemanticsHandles = null; diff --git a/packages/flutter_test/test/bindings_environment/flutter_test_variable_is_false_test.dart b/packages/flutter_test/test/bindings_environment/flutter_test_variable_is_false_test.dart index 394954841f8e9..b4acfab5fbaa3 100644 --- a/packages/flutter_test/test/bindings_environment/flutter_test_variable_is_false_test.dart +++ b/packages/flutter_test/test/bindings_environment/flutter_test_variable_is_false_test.dart @@ -10,6 +10,6 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized({'FLUTTER_TEST': 'false'}); expect(WidgetsBinding.instance, isA()); }, onPlatform: const { - 'browser': [Skip('Browser will not use the live binding')] + 'browser': [Skip('Browser will not use the live binding')], }); } diff --git a/packages/flutter_test/test/goldens_test.dart b/packages/flutter_test/test/goldens_test.dart index c5b431c88ff31..c6c3ec4499e94 100644 --- a/packages/flutter_test/test/goldens_test.dart +++ b/packages/flutter_test/test/goldens_test.dart @@ -12,25 +12,28 @@ import 'package:flutter_test/flutter_test.dart' hide test; import 'package:flutter_test/flutter_test.dart' as test_package; // 1x1 transparent pixel -const List _kExpectedPngBytes = - [137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, - 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 11, 73, 68, 65, 84, - 120, 1, 99, 97, 0, 2, 0, 0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, - 78, 68, 174, 66, 96, 130]; +const List _kExpectedPngBytes = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, + 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 11, 73, 68, 65, 84, + 120, 1, 99, 97, 0, 2, 0, 0, 25, 0, 5, 144, 240, 54, 245, 0, 0, 0, 0, 73, 69, + 78, 68, 174, 66, 96, 130, +]; // 1x1 colored pixel -const List _kColorFailurePngBytes = - [137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, - 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 13, 73, 68, 65, 84, - 120, 1, 99, 249, 207, 240, 255, 63, 0, 7, 18, 3, 2, 164, 147, 160, 197, 0, - 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]; +const List _kColorFailurePngBytes = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, + 1, 0, 0, 0, 1, 8, 6, 0, 0, 0, 31, 21, 196, 137, 0, 0, 0, 13, 73, 68, 65, 84, + 120, 1, 99, 249, 207, 240, 255, 63, 0, 7, 18, 3, 2, 164, 147, 160, 197, 0, + 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, +]; // 1x2 transparent pixel -const List _kSizeFailurePngBytes = - [137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, - 1, 0, 0,0, 2, 8, 6, 0, 0, 0, 153, 129, 182, 39, 0, 0, 0, 14, 73, 68, 65, 84, - 120, 1, 99, 97, 0, 2, 22, 16, 1, 0, 0, 70, 0, 9, 112, 117, 150, 160, 0, 0, - 0, 0, 73, 69, 78, 68, 174, 66, 96, 130]; +const List _kSizeFailurePngBytes = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, + 1, 0, 0,0, 2, 8, 6, 0, 0, 0, 153, 129, 182, 39, 0, 0, 0, 14, 73, 68, 65, 84, + 120, 1, 99, 97, 0, 2, 22, 16, 1, 0, 0, 70, 0, 9, 112, 117, 150, 160, 0, 0, + 0, 0, 73, 69, 78, 68, 174, 66, 96, 130, +]; void main() { late MemoryFileSystem fs; diff --git a/packages/flutter_test/test/live_widget_controller_test.dart b/packages/flutter_test/test/live_widget_controller_test.dart index 8aa4e909bf5a1..e0da50bcca0d8 100644 --- a/packages/flutter_test/test/live_widget_controller_test.dart +++ b/packages/flutter_test/test/live_widget_controller_test.dart @@ -129,8 +129,8 @@ void main() { position: location, buttons: kSecondaryMouseButton, pointer: 1, - ) - ]) + ), + ]), ], PointerEventRecord(const Duration(milliseconds: 80), [ PointerUpEvent( @@ -138,8 +138,8 @@ void main() { position: location, buttons: kSecondaryMouseButton, pointer: 1, - ) - ]) + ), + ]), ]; final List timeDiffs = await controller.handlePointerEventRecord(records); diff --git a/packages/flutter_test/test/matchers_test.dart b/packages/flutter_test/test/matchers_test.dart index 2477313a06484..6a5500883b7fb 100644 --- a/packages/flutter_test/test/matchers_test.dart +++ b/packages/flutter_test/test/matchers_test.dart @@ -105,23 +105,31 @@ void main() { '├─B\n' '│\n'), isNot(hasAGoodToStringDeep)); - expect(_MockToStringDeep.fromLines( - ['Paragraph#00000\n', - ' │ size: (400x200)\n', - ' ╘═╦══ text ═══\n', - ' ║ TextSpan:\n', - ' ║ "I polished up that handle so carefullee\n', - ' ║ That now I am the Ruler of the Queen\'s Navee!"\n', - ' ╚═══════════\n']), hasAGoodToStringDeep); + expect( + _MockToStringDeep.fromLines([ + 'Paragraph#00000\n', + ' │ size: (400x200)\n', + ' ╘═╦══ text ═══\n', + ' ║ TextSpan:\n', + ' ║ "I polished up that handle so carefullee\n', + ' ║ That now I am the Ruler of the Queen\'s Navee!"\n', + ' ╚═══════════\n', + ]), + hasAGoodToStringDeep, + ); // Text span - expect(_MockToStringDeep.fromLines( - ['Paragraph#00000\n', - ' │ size: (400x200)\n', - ' ╘═╦══ text ═══\n', - ' ║ TextSpan:\n', - ' ║ "I polished up that handle so carefullee\nThat now I am the Ruler of the Queen\'s Navee!"\n', - ' ╚═══════════\n']), isNot(hasAGoodToStringDeep)); + expect( + _MockToStringDeep.fromLines([ + 'Paragraph#00000\n', + ' │ size: (400x200)\n', + ' ╘═╦══ text ═══\n', + ' ║ TextSpan:\n', + ' ║ "I polished up that handle so carefullee\nThat now I am the Ruler of the Queen\'s Navee!"\n', + ' ╚═══════════\n', + ]), + isNot(hasAGoodToStringDeep), + ); }); test('normalizeHashCodesEquals', () { diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart index a8a46c83c6a5a..c10992fbdcf2d 100644 --- a/packages/flutter_test/test/widget_tester_test.dart +++ b/packages/flutter_test/test/widget_tester_test.dart @@ -526,8 +526,8 @@ void main() { position: location, buttons: kSecondaryMouseButton, pointer: 1, - ) - ]) + ), + ]), ], PointerEventRecord(const Duration(milliseconds: 80), [ PointerUpEvent( @@ -535,8 +535,8 @@ void main() { position: location, buttons: kSecondaryMouseButton, pointer: 1, - ) - ]) + ), + ]), ]; final List timeDiffs = await tester.handlePointerEventRecord(records); expect(timeDiffs.length, records.length); diff --git a/packages/flutter_tools/bin/tool_backend.dart b/packages/flutter_tools/bin/tool_backend.dart index 5b4b66585356a..411d53e962e53 100644 --- a/packages/flutter_tools/bin/tool_backend.dart +++ b/packages/flutter_tools/bin/tool_backend.dart @@ -59,7 +59,7 @@ or if (Platform.isWindows) 'flutter.bat' else - 'flutter' + 'flutter', ]); final String bundlePlatform = targetPlatform.startsWith('windows') ? 'windows' : targetPlatform; final String target = '${buildMode}_bundle_${bundlePlatform}_assets'; diff --git a/packages/flutter_tools/bin/xcode_backend.dart b/packages/flutter_tools/bin/xcode_backend.dart index 37ad2a4fd022f..a0df4560740d8 100644 --- a/packages/flutter_tools/bin/xcode_backend.dart +++ b/packages/flutter_tools/bin/xcode_backend.dart @@ -260,7 +260,7 @@ class Context { 'NSBonjourServices.0', '-string', '_dartobservatory._tcp', - builtProductsPlist + builtProductsPlist, ], ); } else { diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart index 49345ccea72a5..e820b584f379d 100644 --- a/packages/flutter_tools/lib/src/android/android_device.dart +++ b/packages/flutter_tools/lib/src/android/android_device.dart @@ -380,7 +380,7 @@ class AndroidDevice extends Device { 'packages', if (userIdentifier != null) ...['--user', userIdentifier], - app.id + app.id, ]); return LineSplitter.split(listOut.stdout).contains('package:${app.id}'); } on Exception catch (error) { @@ -447,7 +447,7 @@ class AndroidDevice extends Device { '-r', if (userIdentifier != null) ...['--user', userIdentifier], - app.applicationPackage.path + app.applicationPackage.path, ])); status.stop(); // Some versions of adb exit with exit code 0 even on failure :( @@ -494,7 +494,8 @@ class AndroidDevice extends Device { 'uninstall', if (userIdentifier != null) ...['--user', userIdentifier], - app.id]), + app.id, + ]), throwOnError: true, ); uninstallOut = uninstallResult.stdout; @@ -805,7 +806,7 @@ class AndroidDevice extends Device { RunResult output; try { output = await runAdbCheckedAsync([ - 'shell', '-x', 'logcat', '-v', 'time', '-t', '1' + 'shell', '-x', 'logcat', '-v', 'time', '-t', '1', ]); } on Exception catch (error) { _logger.printError('Failed to extract the most recent timestamp from the Android log: $error.'); diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart index 45f1d2925704a..115eecefa8bf7 100644 --- a/packages/flutter_tools/lib/src/android/android_emulator.dart +++ b/packages/flutter_tools/lib/src/android/android_emulator.dart @@ -158,7 +158,7 @@ class AndroidEmulator extends Emulator { '-avd', id, if (coldBoot) - '-no-snapshot-load' + '-no-snapshot-load', ]; final Process process = await _processUtils.start(command); diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index d5caca41af480..fddbe1d4e0f72 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -589,7 +589,7 @@ class AndroidGradleBuilder implements AndroidBuilder { '-Pflutter-root=$flutterRoot', '-Poutput-dir=${outputDirectory.path}', '-Pis-plugin=${manifest.isPlugin}', - '-PbuildNumber=$buildNumber' + '-PbuildNumber=$buildNumber', ]; if (_logger.isVerbose) { command.add('--full-stacktrace'); @@ -851,15 +851,15 @@ Iterable listApkPaths( [ 'app', getNameForAndroidArch(androidArch), - ...apkPartialName - ].join('-') + ...apkPartialName, + ].join('-'), ]; } return [ [ 'app', ...apkPartialName, - ].join('-') + ].join('-'), ]; } diff --git a/packages/flutter_tools/lib/src/base/analyze_size.dart b/packages/flutter_tools/lib/src/base/analyze_size.dart index e76c5bd8f931b..36fe57ce4ea6a 100644 --- a/packages/flutter_tools/lib/src/base/analyze_size.dart +++ b/packages/flutter_tools/lib/src/base/analyze_size.dart @@ -467,7 +467,7 @@ class _SymbolNode { Map toJson() { final Map json = { 'n': name, - 'value': byteSize + 'value': byteSize, }; final List> childrenAsJson = >[]; for (final _SymbolNode child in children) { diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart index 92bf17d27f8d3..96600b4889303 100644 --- a/packages/flutter_tools/lib/src/base/build.dart +++ b/packages/flutter_tools/lib/src/base/build.dart @@ -197,7 +197,7 @@ class AOTSnapshotter { // Faster async/await if (shouldSplitDebugInfo) ...[ '--dwarf-stack-traces', - '--save-debugging-info=${_fileSystem.path.join(splitDebugInfo!, debugFilename)}' + '--save-debugging-info=${_fileSystem.path.join(splitDebugInfo!, debugFilename)}', ], if (dartObfuscation) '--obfuscate', diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart index a68ce06fc38c6..b102fe84abb05 100644 --- a/packages/flutter_tools/lib/src/base/logger.dart +++ b/packages/flutter_tools/lib/src/base/logger.dart @@ -901,7 +901,7 @@ class BufferLogger extends Logger { void sendEvent(String name, [Map? args]) { _events.write(json.encode({ 'name': name, - 'args': args + 'args': args, })); } } diff --git a/packages/flutter_tools/lib/src/build_system/hash.dart b/packages/flutter_tools/lib/src/build_system/hash.dart index 3f836331240a7..6b6285b89cbc7 100644 --- a/packages/flutter_tools/lib/src/build_system/hash.dart +++ b/packages/flutter_tools/lib/src/build_system/hash.dart @@ -17,7 +17,7 @@ final Uint32List _noise = Uint32List.fromList([ 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391, ]); /// Per-round shift amounts. @@ -25,7 +25,7 @@ const List _shiftAmounts = [ 07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, 07, 12, 17, 22, 05, 09, 14, 20, 05, 09, 14, 20, 05, 09, 14, 20, 05, 09, 14, 20, 04, 11, 16, 23, 04, 11, 16, 23, 04, 11, 16, 23, 04, 11, 16, 23, 06, 10, 15, 21, 06, 10, 15, 21, 06, - 10, 15, 21, 06, 10, 15, 21 + 10, 15, 21, 06, 10, 15, 21, ]; /// A bitmask that limits an integer to 32 bits. diff --git a/packages/flutter_tools/lib/src/build_system/targets/assets.dart b/packages/flutter_tools/lib/src/build_system/targets/assets.dart index 68a4cd02570b1..ceb9075480131 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/assets.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/assets.dart @@ -265,7 +265,7 @@ class CopyAssets extends Target { @override List get depfiles => const [ - 'flutter_assets.d' + 'flutter_assets.d', ]; @override diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart index 9c00dce02342a..899c2da15bd1f 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/common.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart @@ -44,7 +44,7 @@ class CopyFlutterBundle extends Target { @override List get depfiles => [ - 'flutter_assets.d' + 'flutter_assets.d', ]; @override diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart index b3c7fa0db8640..5f73e26a0d9c3 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/ios.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart @@ -335,7 +335,7 @@ abstract class UnpackIOS extends Target { 'lipo', frameworkBinaryPath, '-verify_arch', - ...archList + ...archList, ]); if (verifyResult.exitCode != 0) { @@ -444,7 +444,7 @@ abstract class IosAssetBundle extends Target { @override List get outputs => const [ Source.pattern('{OUTPUT_DIR}/App.framework/App'), - Source.pattern('{OUTPUT_DIR}/App.framework/Info.plist') + Source.pattern('{OUTPUT_DIR}/App.framework/Info.plist'), ]; @override diff --git a/packages/flutter_tools/lib/src/build_system/targets/localizations.dart b/packages/flutter_tools/lib/src/build_system/targets/localizations.dart index 2e558be531583..af0f0077927d1 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/localizations.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/localizations.dart @@ -71,12 +71,12 @@ class GenerateLocalizationsTarget extends Target { configFile, if (inputs != null) for (Object inputFile in inputs.whereType()) - environment.fileSystem.file(inputFile) + environment.fileSystem.file(inputFile), ], [ if (outputs != null) for (Object outputFile in outputs.whereType()) - environment.fileSystem.file(outputFile) + environment.fileSystem.file(outputFile), ], ); depfileService.writeToFile( diff --git a/packages/flutter_tools/lib/src/build_system/targets/macos.dart b/packages/flutter_tools/lib/src/build_system/targets/macos.dart index d29fadad190e3..ac5ffc591e438 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/macos.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/macos.dart @@ -93,7 +93,7 @@ abstract class UnpackMacOS extends Target { 'lipo', frameworkBinaryPath, '-verify_arch', - ...archList + ...archList, ]); if (verifyResult.exitCode != 0) { diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart index 4f7d9c01cb7bb..33499acac5a09 100644 --- a/packages/flutter_tools/lib/src/commands/assemble.dart +++ b/packages/flutter_tools/lib/src/commands/assemble.dart @@ -179,12 +179,12 @@ class AssembleCommand extends FlutterCommand { final String name = argumentResults.rest.first; final Map targetMap = { for (final Target target in _kDefaultTargets) - target.name: target + target.name: target, }; final List results = [ for (final String targetName in argumentResults.rest) if (targetMap.containsKey(targetName)) - targetMap[targetName]! + targetMap[targetName]!, ]; if (results.isEmpty) { throwToolExit('No target named "$name" defined.'); @@ -386,8 +386,8 @@ void writePerformanceData(Iterable measurements, File ou 'skipped': measurement.skipped, 'succeeded': measurement.succeeded, 'elapsedMilliseconds': measurement.elapsedMilliseconds, - } - ] + }, + ], }; if (!outFile.parent.existsSync()) { outFile.parent.createSync(recursive: true); diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index ce2cc0432e760..daaaafd34287b 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -490,7 +490,7 @@ end podProduct as Directory, simulatorBuildConfiguration .childDirectory(builtProduct.basename) - .childDirectory(podFrameworkName) + .childDirectory(podFrameworkName), ]; await _produceXCFramework(frameworks, binaryName, modeDirectory); @@ -520,10 +520,10 @@ end entity.basename.endsWith('dSYM')) .map((FileSystemEntity entity) => ['-debug-symbols', entity.path]) - .expand((List parameter) => parameter) + .expand((List parameter) => parameter), ], '-output', - outputDirectory.childDirectory('$frameworkBinaryName.xcframework').path + outputDirectory.childDirectory('$frameworkBinaryName.xcframework').path, ]; final RunResult xcframeworkResult = await globals.processUtils.run( diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index ae8b55bf0c2ce..8ae8fb5df3799 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -665,7 +665,7 @@ Your $application code is in $relativeAppMain. List _getSupportedPlatformsFromTemplateContext(Map templateContext) { return [ for (String platform in kAllCreatePlatforms) - if (templateContext[platform] == true) platform + if (templateContext[platform] == true) platform, ]; } diff --git a/packages/flutter_tools/lib/src/commands/custom_devices.dart b/packages/flutter_tools/lib/src/commands/custom_devices.dart index fbc52fe615922..af6c3ac8c0c5c 100644 --- a/packages/flutter_tools/lib/src/commands/custom_devices.dart +++ b/packages/flutter_tools/lib/src/commands/custom_devices.dart @@ -529,7 +529,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { final String exampleOrDefault = [ if (example != null) 'example: $example', - if (defaultsTo != null) 'empty for $defaultsTo' + if (defaultsTo != null) 'empty for $defaultsTo', ].join(', '); if (exampleOrDefault.isNotEmpty) { @@ -710,7 +710,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { '-o', 'BatchMode=yes', if (ipv6) '-6', r'${localPath}', - '$sshTarget:/tmp/\${appName}' + '$sshTarget:/tmp/\${appName}', ], uninstallCommand: [ @@ -718,7 +718,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { '-o', 'BatchMode=yes', if (ipv6) '-6', sshTarget, - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: [ @@ -726,7 +726,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { '-o', 'BatchMode=yes', if (ipv6) '-6', sshTarget, - remoteRunDebugCommand + remoteRunDebugCommand, ], forwardPortCommand: usePortForwarding @@ -737,7 +737,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { if (ipv6) '-6', '-L', '$formattedLoopbackIp:\${hostPort}:$formattedLoopbackIp:\${devicePort}', sshTarget, - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ] : null, forwardPortSuccessRegex: usePortForwarding @@ -750,7 +750,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { '-o', 'BatchMode=yes', if (ipv6) '-6', sshTarget, - screenshotCommand + screenshotCommand, ] : null ); @@ -762,7 +762,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { if (ipv6) '-6', '-n', '1', '-w', '500', - targetStr + targetStr, ], explicitPingSuccessRegex: true, pingSuccessRegex: RegExp(r'[<=]\d+ms') @@ -774,7 +774,7 @@ class CustomDevicesAddCommand extends CustomDevicesCommandBase { if (ipv6) '-6', '-c', '1', '-w', '1', - targetStr + targetStr, ], explicitPingSuccessRegex: true, pingSuccessRegex: null diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 246cdc6ba2f05..607a512b51fe7 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -1103,7 +1103,7 @@ Future> _deviceToMap(Device device) async { 'flutterExit': device.supportsFlutterExit, 'hardwareRendering': await device.supportsHardwareRendering, 'startPaused': device.supportsStartPaused, - } + }, }; } diff --git a/packages/flutter_tools/lib/src/commands/format.dart b/packages/flutter_tools/lib/src/commands/format.dart index 986dc7ba22b75..69f4ef4988ae8 100644 --- a/packages/flutter_tools/lib/src/commands/format.dart +++ b/packages/flutter_tools/lib/src/commands/format.dart @@ -51,7 +51,7 @@ class FormatCommand extends FlutterCommand { if (arg == '--dry-run' || arg == '-n') '--output=none' else - arg + arg, ]); } diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index dfab73928d90a..739efc8a1a53d 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -87,7 +87,7 @@ class PrecacheCommand extends FlutterCommand { 'android_gen_snapshot', 'android_maven', 'android_internal_build', - ] + ], }; /// Returns a reverse mapping of _expandedArtifacts, from child artifact name @@ -96,7 +96,7 @@ class PrecacheCommand extends FlutterCommand { return { for (final MapEntry> entry in _expandedArtifacts.entries) for (final String childArtifactName in entry.value) - childArtifactName: entry.key + childArtifactName: entry.key, }; } diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index fca00b4b39c75..026529165ded3 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -277,7 +277,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { if (globals.fs.isDirectorySync(path)) ..._findTests(globals.fs.directory(path)) else - globals.fs.path.normalize(globals.fs.path.absolute(path)) + globals.fs.path.normalize(globals.fs.path.absolute(path)), ]; } diff --git a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart index 8373d2c882a1e..e663cfc60b511 100644 --- a/packages/flutter_tools/lib/src/custom_devices/custom_device.dart +++ b/packages/flutter_tools/lib/src/custom_devices/custom_device.dart @@ -156,7 +156,7 @@ class CustomDevicePortForwarder extends DevicePortForwarder { _forwardPortCommand, { 'devicePort': '$devicePort', - 'hostPort': '$hostPort' + 'hostPort': '$hostPort', }, additionalReplacementValues: _additionalReplacementValues ); @@ -394,7 +394,7 @@ class CustomDeviceAppSession { { 'remotePath': '/tmp/', 'appName': packageName, - 'engineOptions': _getEngineOptionsForCmdline(debuggingOptions, traceStartup, route) + 'engineOptions': _getEngineOptionsForCmdline(debuggingOptions, traceStartup, route), } ); @@ -587,7 +587,7 @@ class CustomDevice extends Device { _config.postBuildCommand!, { 'appName': appName, - 'localPath': localPath + 'localPath': localPath, }, additionalReplacementValues: additionalReplacementValues ); @@ -621,7 +621,7 @@ class CustomDevice extends Device { final List interpolated = interpolateCommand( _config.uninstallCommand, { - 'appName': appName + 'appName': appName, }, additionalReplacementValues: additionalReplacementValues ); @@ -657,7 +657,7 @@ class CustomDevice extends Device { _config.installCommand, { 'localPath': localPath, - 'appName': appName + 'appName': appName, }, additionalReplacementValues: additionalReplacementValues ); diff --git a/packages/flutter_tools/lib/src/custom_devices/custom_device_config.dart b/packages/flutter_tools/lib/src/custom_devices/custom_device_config.dart index ea69950651c5f..7f5c031141d2b 100644 --- a/packages/flutter_tools/lib/src/custom_devices/custom_device_config.dart +++ b/packages/flutter_tools/lib/src/custom_devices/custom_device_config.dart @@ -283,7 +283,7 @@ class CustomDeviceConfig { 'ping', '-w', '1', '-c', '1', - 'raspberrypi' + 'raspberrypi', ], explicitPingSuccessRegex: true ); diff --git a/packages/flutter_tools/lib/src/custom_devices/custom_devices_config.dart b/packages/flutter_tools/lib/src/custom_devices/custom_devices_config.dart index ec9192a9b845a..cb68c6cfe3471 100644 --- a/packages/flutter_tools/lib/src/custom_devices/custom_devices_config.dart +++ b/packages/flutter_tools/lib/src/custom_devices/custom_devices_config.dart @@ -186,7 +186,7 @@ class CustomDevicesConfig { _kCustomDevicesConfigKey, [ ...?_getDevicesJsonValue(), - config.toJson() + config.toJson(), ] ); } diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 40652d80d16d4..8698acf08317b 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -158,7 +158,7 @@ abstract class DeviceManager { }, onError: (dynamic error, StackTrace stackTrace) { // Return matches from other discoverers even if one fails. _logger.printTrace('Ignored error discovering $deviceId: $error'); - }) + }), ]; // Wait for an exact match, or for all discoverers to return results. @@ -722,7 +722,7 @@ abstract class Device { 'flutterExit': supportsFlutterExit, 'hardwareRendering': isLocalEmu && await supportsHardwareRendering, 'startPaused': supportsStartPaused, - } + }, }; } diff --git a/packages/flutter_tools/lib/src/drive/web_driver_service.dart b/packages/flutter_tools/lib/src/drive/web_driver_service.dart index fb596428894a6..8f99f96763fd7 100644 --- a/packages/flutter_tools/lib/src/drive/web_driver_service.dart +++ b/packages/flutter_tools/lib/src/drive/web_driver_service.dart @@ -258,14 +258,14 @@ Map getDesiredCapabilities(Browser browser, bool headless, [Str '--no-default-browser-check', '--no-sandbox', '--no-first-run', - if (headless) '--headless' + if (headless) '--headless', ], 'perfLoggingPrefs': { 'traceCategories': 'devtools.timeline,' - 'v8,blink.console,benchmark,blink,' - 'blink.user_timing' - } + 'v8,blink.console,benchmark,blink,' + 'blink.user_timing', + }, }, }; break; @@ -275,7 +275,7 @@ Map getDesiredCapabilities(Browser browser, bool headless, [Str 'browserName': 'firefox', 'moz:firefoxOptions' : { 'args': [ - if (headless) '-headless' + if (headless) '-headless', ], 'prefs': { 'dom.file.createInChild': true, @@ -285,10 +285,10 @@ Map getDesiredCapabilities(Browser browser, bool headless, [Str 'media.gmp-provider.enabled': false, 'network.captive-portal-service.enabled': false, 'security.insecure_field_warning.contextual.enabled': false, - 'test.currentTimeOffsetSeconds': 11491200 + 'test.currentTimeOffsetSeconds': 11491200, }, - 'log': {'level': 'trace'} - } + 'log': {'level': 'trace'}, + }, }; break; case Browser.edge: @@ -306,7 +306,7 @@ Map getDesiredCapabilities(Browser browser, bool headless, [Str return { 'platformName': 'ios', 'browserName': 'safari', - 'safari:useSimulator': true + 'safari:useSimulator': true, }; case Browser.androidChrome: return { @@ -314,7 +314,7 @@ Map getDesiredCapabilities(Browser browser, bool headless, [Str 'platformName': 'android', 'goog:chromeOptions': { 'androidPackage': 'com.android.chrome', - 'args': ['--disable-fullscreen'] + 'args': ['--disable-fullscreen'], }, }; } diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index d2aa00347e3c5..5b4fd6fed47da 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -14,7 +14,7 @@ import 'base/utils.dart'; import 'plugins.dart'; const Set _kValidPluginPlatforms = { - 'android', 'ios', 'web', 'windows', 'linux', 'macos' + 'android', 'ios', 'web', 'windows', 'linux', 'macos', }; /// A wrapper around the `flutter` section in the `pubspec.yaml` file. diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_ffx.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_ffx.dart index 4bb65497f3e91..d790b7612b3c7 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_ffx.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_ffx.dart @@ -58,7 +58,7 @@ class FuchsiaFfx { 'target', 'list', '--format', - 's' + 's', ]; final RunResult result = await _processUtils.run(command); if (result.exitCode != 0) { diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart index f7731fbf944f6..b971ed416a8b5 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_kernel_compiler.dart @@ -63,7 +63,7 @@ class FuchsiaKernelCompiler { globals.fs.path.join(outDir, '$appName.dil'), '--component-name', appName, - ...getBuildInfoFlags(buildInfo: buildInfo, manifestPath: manifestPath) + ...getBuildInfoFlags(buildInfo: buildInfo, manifestPath: manifestPath), ]; flags += [ @@ -104,12 +104,12 @@ class FuchsiaKernelCompiler { // AOT/JIT: if (buildInfo.usesAot) ...[ '--aot', - '--tfa' + '--tfa', ] else ...[ '--no-link-platform', '--split-output-by-packages', '--manifest', - manifestPath + manifestPath, ], // debug, profile, jit release, release: diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart index b4780a3847e91..bc1db285b263d 100644 --- a/packages/flutter_tools/lib/src/ios/devices.dart +++ b/packages/flutter_tools/lib/src/ios/devices.dart @@ -133,7 +133,7 @@ class IOSDevices extends PollingDeviceDiscovery { Future> getDiagnostics() async { if (!_platform.isMacOS) { return const [ - 'Control of iOS devices or simulators only supported on macOS.' + 'Control of iOS devices or simulators only supported on macOS.', ]; } diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 5b7653d5bd3eb..25606dd5e82f6 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -359,7 +359,7 @@ Future buildXcodeProject({ '-resultBundlePath', tempDir.childFile(_kResultBundlePath).absolute.path, '-resultBundleVersion', - _kResultBundleVersion + _kResultBundleVersion, ]); // Don't log analytics for downstream Flutter commands. diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 407a70bf42a05..ea8d1fc7afe95 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart @@ -473,7 +473,7 @@ class IOSSimulator extends Device { if (debuggingOptions.traceSkiaAllowlist != null) '--trace-skia-allowlist="${debuggingOptions.traceSkiaAllowlist}"', if (dartVmFlags.isNotEmpty) '--dart-flags=$dartVmFlags', '--observatory-port=${debuggingOptions.hostVmServicePort ?? 0}', - if (route != null) '--route=$route' + if (route != null) '--route=$route', ], ]; diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 8afba4c76b5d6..47f8575740873 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart @@ -194,7 +194,7 @@ class XcodeProjectInterpreter { 'generic/platform=iOS Simulator', '-showBuildSettings', 'BUILD_DIR=${_fileSystem.path.absolute(getIosBuildDirectory())}', - ...environmentVariablesAsXcodeBuildSettings(_platform) + ...environmentVariablesAsXcodeBuildSettings(_platform), ]; try { // showBuildSettings is reported to occasionally timeout. Here, we give it @@ -290,7 +290,7 @@ class XcodeProjectInterpreter { if (!verbose) '-quiet', 'clean', - ...environmentVariablesAsXcodeBuildSettings(_platform) + ...environmentVariablesAsXcodeBuildSettings(_platform), ], workingDirectory: _fileSystem.currentDirectory.path); } diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index 7539977abd3ed..3a82a98a470b8 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -267,7 +267,7 @@ class WebAssetServer implements AssetReader { final String result = await globals.fs.file(uri.toFilePath()).readAsString(); return shelf.Response.ok(result, headers: { - HttpHeaders.contentTypeHeader: 'application/javascript' + HttpHeaders.contentTypeHeader: 'application/javascript', }); } return innerHandler(request); diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart index 81c86d5122f4d..6150f43553205 100644 --- a/packages/flutter_tools/lib/src/linux/build_linux.dart +++ b/packages/flutter_tools/lib/src/linux/build_linux.dart @@ -145,7 +145,7 @@ Future _runCmake(String buildModeName, Directory sourceDir, Directory buil workingDirectory: buildDir.path, environment: { 'CC': 'clang', - 'CXX': 'clang++' + 'CXX': 'clang++', }, trace: true, ); diff --git a/packages/flutter_tools/lib/src/linux/linux_doctor.dart b/packages/flutter_tools/lib/src/linux/linux_doctor.dart index c21d4f83dcaf1..fae34766b369d 100644 --- a/packages/flutter_tools/lib/src/linux/linux_doctor.dart +++ b/packages/flutter_tools/lib/src/linux/linux_doctor.dart @@ -65,7 +65,7 @@ class LinuxDoctorValidator extends DoctorValidator { final Map installedVersions = { // Sort the check to make the call order predictable for unit tests. for (String binary in _requiredBinaryVersions.keys.toList()..sort()) - binary: await _getBinaryVersion(binary) + binary: await _getBinaryVersion(binary), }; // Determine overall validation level. diff --git a/packages/flutter_tools/lib/src/macos/build_macos.dart b/packages/flutter_tools/lib/src/macos/build_macos.dart index 0b31ea57bbf0b..1af3b7b009223 100644 --- a/packages/flutter_tools/lib/src/macos/build_macos.dart +++ b/packages/flutter_tools/lib/src/macos/build_macos.dart @@ -114,7 +114,7 @@ Future buildMacOS({ else '-quiet', 'COMPILER_INDEX_STORE_ENABLE=NO', - ...environmentVariablesAsXcodeBuildSettings(globals.platform) + ...environmentVariablesAsXcodeBuildSettings(globals.platform), ], trace: true, stdoutErrorMatcher: verboseLogging ? null : _filteredOutput, diff --git a/packages/flutter_tools/lib/src/macos/xcdevice.dart b/packages/flutter_tools/lib/src/macos/xcdevice.dart index a7fd11c20b588..2f25e3caede55 100644 --- a/packages/flutter_tools/lib/src/macos/xcdevice.dart +++ b/packages/flutter_tools/lib/src/macos/xcdevice.dart @@ -186,11 +186,11 @@ class XCDevice { final String identifier = match.group(2)!; if (verb.startsWith('attach')) { _deviceIdentifierByEvent?.add({ - XCDeviceEvent.attach: identifier + XCDeviceEvent.attach: identifier, }); } else if (verb.startsWith('detach')) { _deviceIdentifierByEvent?.add({ - XCDeviceEvent.detach: identifier + XCDeviceEvent.detach: identifier, }); } } diff --git a/packages/flutter_tools/lib/src/persistent_tool_state.dart b/packages/flutter_tools/lib/src/persistent_tool_state.dart index 34ff213525964..d9eed49eeef89 100644 --- a/packages/flutter_tools/lib/src/persistent_tool_state.dart +++ b/packages/flutter_tools/lib/src/persistent_tool_state.dart @@ -84,7 +84,7 @@ class _DefaultPersistentToolState implements PersistentToolState { static const Map _lastActiveVersionKeys = { Channel.master: 'last-active-master-version', Channel.beta: 'last-active-beta-version', - Channel.stable: 'last-active-stable-version' + Channel.stable: 'last-active-stable-version', }; static const String _kBotKey = 'is-bot'; static const String _kLicenseHash = 'license-hash'; diff --git a/packages/flutter_tools/lib/src/platform_plugins.dart b/packages/flutter_tools/lib/src/platform_plugins.dart index 58d5e3cae2700..9a773b53768e6 100644 --- a/packages/flutter_tools/lib/src/platform_plugins.dart +++ b/packages/flutter_tools/lib/src/platform_plugins.dart @@ -180,7 +180,7 @@ class AndroidPlugin extends PluginPlatform implements NativeOrDartPlugin { 'kotlin', package.replaceAll('.', _fileSystem.path.separator), '$pluginClass.kt', - ) + ), ]; File? mainPluginClass; diff --git a/packages/flutter_tools/lib/src/resident_devtools_handler.dart b/packages/flutter_tools/lib/src/resident_devtools_handler.dart index 2b26ac53cab39..7c419185c50d0 100644 --- a/packages/flutter_tools/lib/src/resident_devtools_handler.dart +++ b/packages/flutter_tools/lib/src/resident_devtools_handler.dart @@ -169,7 +169,7 @@ class FlutterResidentDevtoolsHandler implements ResidentDevtoolsHandler { Future> _devicesWithExtensions(List flutterDevices) async { final List devices = await Future.wait(>[ - for (final FlutterDevice device in flutterDevices) _waitForExtensionsForDevice(device) + for (final FlutterDevice device in flutterDevices) _waitForExtensionsForDevice(device), ]); return devices.where((FlutterDevice device) => device != null).toList(); } diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 6351f430de844..e51ab68bab39c 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -614,7 +614,7 @@ class HotRunner extends ResidentRunner { device.vmService.service.setIsolatePauseMode(isolate.id, exceptionPauseMode: vm_service.ExceptionPauseMode.kNone), for (final vm_service.Breakpoint breakpoint in isolate.breakpoints) - device.vmService.service.removeBreakpoint(isolate.id, breakpoint.id) + device.vmService.service.removeBreakpoint(isolate.id, breakpoint.id), ]; await Future.wait(breakpointAndExceptionRemoval); await device.vmService.service.resume(view.uiIsolate.id); @@ -1186,7 +1186,7 @@ Future>> _reloadDeviceSources( isolateRef.id, pause: pause, rootLibUri: deviceEntryUri, - ) + ), ]; } diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index 21bab0ccfd9cd..d5acfc01abd36 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -153,11 +153,11 @@ abstract class FlutterCommand extends Command { ], 'canvaskit': [ 'FLUTTER_WEB_AUTO_DETECT=false', - 'FLUTTER_WEB_USE_SKIA=true' + 'FLUTTER_WEB_USE_SKIA=true', ], 'html': [ 'FLUTTER_WEB_AUTO_DETECT=false', - 'FLUTTER_WEB_USE_SKIA=false' + 'FLUTTER_WEB_USE_SKIA=false', ], }; diff --git a/packages/flutter_tools/lib/src/template.dart b/packages/flutter_tools/lib/src/template.dart index 9af0106fbd1f8..d32fa9642d7c2 100644 --- a/packages/flutter_tools/lib/src/template.dart +++ b/packages/flutter_tools/lib/src/template.dart @@ -122,12 +122,12 @@ class Template { return Template._( [ for (final String name in names) - _templateDirectoryInPackage(name, fileSystem) + _templateDirectoryInPackage(name, fileSystem), ], [ for (final String name in names) if ((await _templateImageDirectory(name, fileSystem, logger)).existsSync()) - await _templateImageDirectory(name, fileSystem, logger) + await _templateImageDirectory(name, fileSystem, logger), ], fileSystem: fileSystem, logger: logger, @@ -304,7 +304,7 @@ class Template { final List potentials = [ for (final Directory imageSourceDir in imageSourceDirectories) _fileSystem.file(_fileSystem.path - .join(imageSourceDir.path, relativeDestinationPath.replaceAll(imageTemplateExtension, ''))) + .join(imageSourceDir.path, relativeDestinationPath.replaceAll(imageTemplateExtension, ''))), ]; if (potentials.any((File file) => file.existsSync())) { diff --git a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart index b0350be8e3ce2..0ea468628886f 100644 --- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart @@ -367,7 +367,7 @@ class FlutterWebPlatform extends PlatformPlugin { 'width': width.toDouble(), 'height': height.toDouble(), 'scale': 1.0, - } + }, }); bytes = base64.decode(response.result['data'] as String); } on WipError catch (ex) { diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart index 2aa2d1b3ca6aa..8662321a0f63c 100644 --- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart +++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart @@ -174,7 +174,7 @@ class FlutterTesterDevice extends Device { '--disable-service-auth-codes', if (debuggingOptions.hasObservatoryPort) '--observatory-port=${debuggingOptions.hostVmServicePort}', - applicationKernelFilePath + applicationKernelFilePath, ]; ProtocolDiscovery? observatoryDiscovery; diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart index 59b7e776b66f9..2a34556d42ad3 100644 --- a/packages/flutter_tools/lib/src/vmservice.dart +++ b/packages/flutter_tools/lib/src/vmservice.dart @@ -198,7 +198,7 @@ Future setUpVmService( return { 'result': { 'type': 'Success', - } + }, }; }); registrationRequests.add(vmService.registerService('reloadSources', 'Flutter Tools')); @@ -211,7 +211,7 @@ Future setUpVmService( return { 'result': { 'type': 'Success', - } + }, }; }); registrationRequests.add(vmService.registerService('hotRestart', 'Flutter Tools')); @@ -226,7 +226,7 @@ Future setUpVmService( 'result': { 'type': 'Success', ...versionJson, - } + }, }; }); registrationRequests.add(vmService.registerService('flutterVersion', 'Flutter Tools')); @@ -258,7 +258,7 @@ Future setUpVmService( 'result': { 'type': 'Success', ...result.toJson(), - } + }, }; }); registrationRequests.add(vmService.registerService('flutterMemoryInfo', 'Flutter Tools')); @@ -270,7 +270,7 @@ Future setUpVmService( 'result': { 'type': 'Success', 'filename': filename, - } + }, }; }); registrationRequests.add(vmService.registerService('flutterGetSkSL', 'Flutter Tools')); @@ -847,7 +847,7 @@ class FlutterVmService { final List views = [ if (rawViews != null) for (final Map rawView in rawViews.whereType>()) - FlutterView.parse(rawView) + FlutterView.parse(rawView), ]; if (views.isNotEmpty || returnEarly) { return views; diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart index ce4abbb399c88..ed41e392a921f 100644 --- a/packages/flutter_tools/lib/src/windows/build_windows.dart +++ b/packages/flutter_tools/lib/src/windows/build_windows.dart @@ -168,11 +168,11 @@ Future _runBuild( if (install) ...['--target', 'INSTALL'], if (globals.logger.isVerbose) - '--verbose' + '--verbose', ], environment: { if (globals.logger.isVerbose) - 'VERBOSE_SCRIPT_LOGGING': 'true' + 'VERBOSE_SCRIPT_LOGGING': 'true', }, trace: true, stdoutErrorMatcher: errorMatcher, diff --git a/packages/flutter_tools/lib/src/windows/visual_studio.dart b/packages/flutter_tools/lib/src/windows/visual_studio.dart index 5c0c928786b36..ea1e3bdd4c42f 100644 --- a/packages/flutter_tools/lib/src/windows/visual_studio.dart +++ b/packages/flutter_tools/lib/src/windows/visual_studio.dart @@ -208,7 +208,7 @@ class VisualStudio { /// See https://docs.microsoft.com/en-us/visualstudio/install/workload-and-component-ids static const List _requiredWorkloads = [ 'Microsoft.VisualStudio.Workload.NativeDesktop', - 'Microsoft.VisualStudio.Workload.VCTools' + 'Microsoft.VisualStudio.Workload.VCTools', ]; /// Components for use with vswhere requirements. @@ -301,7 +301,7 @@ class VisualStudio { '-requires', requiredWorkload, ], - ..._requiredComponents(_minimumSupportedVersion).keys + ..._requiredComponents(_minimumSupportedVersion).keys, ] : []; try { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart index c29e76b0d99a9..beb713cde5d58 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/assemble_test.dart @@ -271,7 +271,7 @@ void main() { skipped: false, succeeded: true, elapsedMilliseconds: 123, - ) + ), ]; final FileSystem fileSystem = MemoryFileSystem.test(); final File outFile = fileSystem.currentDirectory diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart index 9af19152271a7..d4f96a5bfbce7 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart @@ -713,7 +713,7 @@ VMServiceConnector getFakeVmServiceFactory({ 'views': [ { 'id': '1', - 'isolate': fakeUnpausedIsolate.toJson() + 'isolate': fakeUnpausedIsolate.toJson(), }, ], }, @@ -740,7 +740,7 @@ VMServiceConnector getFakeVmServiceFactory({ 'views': [ { 'id': '1', - 'isolate': fakeUnpausedIsolate.toJson() + 'isolate': fakeUnpausedIsolate.toJson(), }, ], }, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart index de6c528321401..30faad0cb5913 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart @@ -40,7 +40,7 @@ void main() { final Platform windowsPlatform = FakePlatform( operatingSystem: 'windows', environment: const { - 'FLUTTER_ROOT': '/' + 'FLUTTER_ROOT': '/', }, ); FakeFuchsiaSdk fuchsiaSdk; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart index 9cd15a4c58626..071f0f4b5c040 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart @@ -87,7 +87,7 @@ void main() { } const FakeCommand xattrCommand = FakeCommand(command: [ - 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/' + 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/', ]); FakeCommand _setUpRsyncCommand({void Function() onRun}) { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart index 68bce82851f50..6f31be30790f8 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart @@ -83,7 +83,7 @@ void main() { } const FakeCommand xattrCommand = FakeCommand(command: [ - 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/' + 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/', ]); FakeCommand _setUpXCResultCommand({String stdout = '', void Function() onRun}) { @@ -296,8 +296,8 @@ void main() { _exportOptionsPlist, ], exitCode: 1, - stderr: 'error: exportArchive: "Runner.app" requires a provisioning profile.' - ) + stderr: 'error: exportArchive: "Runner.app" requires a provisioning profile.', + ), ]); _createMinimalMockProjectFiles(); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart index 0d73157cd1c1d..12755e61c8f06 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart @@ -299,7 +299,7 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg cmakeCommand('debug'), ninjaCommand('debug', environment: const { - 'VERBOSE_SCRIPT_LOGGING': 'true' + 'VERBOSE_SCRIPT_LOGGING': 'true', }, stdout: 'STDOUT STUFF', ), diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart index cc8b1b4d332bd..a5b0bf639f197 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart @@ -202,7 +202,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Debug') + setUpFakeXcodeBuildHandler('Debug'), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -218,7 +218,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Debug') + setUpFakeXcodeBuildHandler('Debug'), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -234,7 +234,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Debug', verbose: true) + setUpFakeXcodeBuildHandler('Debug', verbose: true), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -251,7 +251,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Profile') + setUpFakeXcodeBuildHandler('Profile'), ]), Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithProfile(), @@ -268,7 +268,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Release') + setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -323,7 +323,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Release') + setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -333,7 +333,7 @@ STDERR STUFF testUsingContext('build settings contains Flutter Xcode environment variables', () async { macosPlatformCustomEnv.environment = Map.unmodifiable({ - 'FLUTTER_XCODE_ASSETCATALOG_COMPILER_APPICON_NAME': 'AppIcon.special' + 'FLUTTER_XCODE_ASSETCATALOG_COMPILER_APPICON_NAME': 'AppIcon.special', }); final FlutterProject flutterProject = FlutterProject.fromDirectory(fileSystem.currentDirectory); @@ -398,7 +398,7 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - setUpFakeXcodeBuildHandler('Debug') + setUpFakeXcodeBuildHandler('Debug'), ]), Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart index 8eddeb6defafd..254b26dd76653 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart @@ -26,8 +26,8 @@ void main() { FileSystem fileSystem; final Platform fakePlatform = FakePlatform( environment: { - 'FLUTTER_ROOT': '/' - } + 'FLUTTER_ROOT': '/', + }, ); setUpAll(() { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index db1f92c49ba82..cfa19cbfe7414 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -105,11 +105,11 @@ void main() { buildMode, ...['--target', 'INSTALL'], if (verbose) - '--verbose' + '--verbose', ], environment: { if (verbose) - 'VERBOSE_SCRIPT_LOGGING': 'true' + 'VERBOSE_SCRIPT_LOGGING': 'true', }, onRun: onRun, stdout: stdout, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart index 25d9f044dc356..8c4377d3d237d 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/config_test.dart @@ -156,7 +156,7 @@ void main() { await commandRunner.run([ 'config', - '--enable-web' + '--enable-web', ]); expect( diff --git a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart index 6616b0ac25867..523c3b2defd37 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/create_usage_test.dart @@ -142,7 +142,8 @@ void main() { final CommandRunner runner = createTestCommandRunner(command); await runner.run([ - 'create', '--no-pub', '--template=app', 'testy']); + 'create', '--no-pub', '--template=app', 'testy', + ]); expect((await command.usageValues).commandCreateIosLanguage, 'swift'); await runner.run([ diff --git a/packages/flutter_tools/test/commands.shard/hermetic/custom_devices_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/custom_devices_test.dart index 3799d9a944e81..28da76116029c 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/custom_devices_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/custom_devices_test.dart @@ -283,7 +283,7 @@ class FakeCommandRunner extends FlutterCommandRunner { return context.run( overrides: { - Logger: () => logger + Logger: () => logger, }, body: () { Cache.flutterRoot ??= Cache.defaultFlutterRoot( @@ -552,7 +552,7 @@ void main() { 'ping', '-c', '1', '-w', '1', - 'testhostname' + 'testhostname', ], postBuildCommand: null, // ignore: avoid_redundant_argument_values installCommand: const [ @@ -560,19 +560,19 @@ void main() { '-r', '-o', 'BatchMode=yes', r'${localPath}', - r'testuser@testhostname:/tmp/${appName}' + r'testuser@testhostname:/tmp/${appName}', ], uninstallCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testrundebug' + 'testrundebug', ], forwardPortCommand: const [ 'ssh', @@ -580,14 +580,14 @@ void main() { '-o', 'ExitOnForwardFailure=yes', '-L', r'127.0.0.1:${hostPort}:127.0.0.1:${devicePort}', 'testuser@testhostname', - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ], forwardPortSuccessRegex: RegExp('Port forwarding success'), screenshotCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testscreenshot' + 'testscreenshot', ], ) ) @@ -642,7 +642,7 @@ void main() { 'ping', '-c', '1', '-w', '1', - '192.168.178.1' + '192.168.178.1', ], postBuildCommand: null, // ignore: avoid_redundant_argument_values installCommand: const [ @@ -650,19 +650,19 @@ void main() { '-r', '-o', 'BatchMode=yes', r'${localPath}', - r'testuser@192.168.178.1:/tmp/${appName}' + r'testuser@192.168.178.1:/tmp/${appName}', ], uninstallCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@192.168.178.1', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@192.168.178.1', - 'testrundebug' + 'testrundebug', ], forwardPortCommand: const [ 'ssh', @@ -670,19 +670,19 @@ void main() { '-o', 'ExitOnForwardFailure=yes', '-L', r'127.0.0.1:${hostPort}:127.0.0.1:${devicePort}', 'testuser@192.168.178.1', - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ], forwardPortSuccessRegex: RegExp('Port forwarding success'), screenshotCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@192.168.178.1', - 'testscreenshot' - ] - ) - ) + 'testscreenshot', + ], + ), + ), ); - } + }, ); testUsingContext( @@ -732,7 +732,7 @@ void main() { '-6', '-c', '1', '-w', '1', - '::1' + '::1', ], postBuildCommand: null, // ignore: avoid_redundant_argument_values installCommand: const [ @@ -741,21 +741,21 @@ void main() { '-o', 'BatchMode=yes', '-6', r'${localPath}', - r'testuser@[::1]:/tmp/${appName}' + r'testuser@[::1]:/tmp/${appName}', ], uninstallCommand: const [ 'ssh', '-o', 'BatchMode=yes', '-6', 'testuser@[::1]', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: const [ 'ssh', '-o', 'BatchMode=yes', '-6', 'testuser@[::1]', - 'testrundebug' + 'testrundebug', ], forwardPortCommand: const [ 'ssh', @@ -764,7 +764,7 @@ void main() { '-6', '-L', r'[::1]:${hostPort}:[::1]:${devicePort}', 'testuser@[::1]', - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ], forwardPortSuccessRegex: RegExp('Port forwarding success'), screenshotCommand: const [ @@ -772,12 +772,12 @@ void main() { '-o', 'BatchMode=yes', '-6', 'testuser@[::1]', - 'testscreenshot' - ] - ) - ) + 'testscreenshot', + ], + ), + ), ); - } + }, ); testUsingContext( @@ -826,7 +826,7 @@ void main() { 'ping', '-c', '1', '-w', '1', - 'testhostname' + 'testhostname', ], postBuildCommand: null, // ignore: avoid_redundant_argument_values installCommand: [ @@ -834,30 +834,30 @@ void main() { '-r', '-o', 'BatchMode=yes', r'${localPath}', - r'testuser@testhostname:/tmp/${appName}' + r'testuser@testhostname:/tmp/${appName}', ], uninstallCommand: [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testrundebug' + 'testrundebug', ], screenshotCommand: [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testscreenshot' - ] - ) - ) + 'testscreenshot', + ], + ), + ), ); - } + }, ); testUsingContext( @@ -880,12 +880,12 @@ void main() { apply: 'y', ), fileSystem: fs, - featureEnabled: true + featureEnabled: true, ); await expectLater( runner.run(const ['custom-devices', 'add', '--no-check']), - completes + completes, ); final CustomDevicesConfig config = CustomDevicesConfig.test( @@ -906,7 +906,7 @@ void main() { 'ping', '-c', '1', '-w', '1', - 'testhostname' + 'testhostname', ], postBuildCommand: null, // ignore: avoid_redundant_argument_values installCommand: const [ @@ -914,19 +914,19 @@ void main() { '-r', '-o', 'BatchMode=yes', r'${localPath}', - r'testuser@testhostname:/tmp/${appName}' + r'testuser@testhostname:/tmp/${appName}', ], uninstallCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testrundebug' + 'testrundebug', ], forwardPortCommand: const [ 'ssh', @@ -934,7 +934,7 @@ void main() { '-o', 'ExitOnForwardFailure=yes', '-L', r'127.0.0.1:${hostPort}:127.0.0.1:${devicePort}', 'testuser@testhostname', - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ], forwardPortSuccessRegex: RegExp('Port forwarding success'), ) @@ -1230,7 +1230,7 @@ void main() { 'ping', '-n', '1', '-w', '500', - 'testhostname' + 'testhostname', ], pingSuccessRegex: RegExp(r'[<=]\d+ms'), postBuildCommand: null, // ignore: avoid_redundant_argument_values @@ -1239,19 +1239,19 @@ void main() { '-r', '-o', 'BatchMode=yes', r'${localPath}', - r'testuser@testhostname:/tmp/${appName}' + r'testuser@testhostname:/tmp/${appName}', ], uninstallCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - r'rm -rf "/tmp/${appName}"' + r'rm -rf "/tmp/${appName}"', ], runDebugCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testrundebug' + 'testrundebug', ], forwardPortCommand: const [ 'ssh', @@ -1259,17 +1259,17 @@ void main() { '-o', 'ExitOnForwardFailure=yes', '-L', r'127.0.0.1:${hostPort}:127.0.0.1:${devicePort}', 'testuser@testhostname', - "echo 'Port forwarding success'; read" + "echo 'Port forwarding success'; read", ], forwardPortSuccessRegex: RegExp('Port forwarding success'), screenshotCommand: const [ 'ssh', '-o', 'BatchMode=yes', 'testuser@testhostname', - 'testscreenshot' - ] - ) - ) + 'testscreenshot', + ], + ), + ), ); }, ); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart index 427f66cfadc74..ca3ffe87c21f8 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/devices_test.dart @@ -82,8 +82,8 @@ void main() { 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, - 'startPaused': true - } + 'startPaused': true, + }, }, { 'name': 'webby', @@ -99,10 +99,10 @@ void main() { 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, - 'startPaused': true - } - } - ] + 'startPaused': true, + }, + }, + ], ); }, overrides: { DeviceManager: () => _FakeDeviceManager(), diff --git a/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart index 127744eaa1f0f..a2ad7121d0a8d 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/downgrade_test.dart @@ -68,10 +68,10 @@ void main() { processManager: FakeProcessManager.list([ const FakeCommand( command: [ - 'git', 'describe', '--tags', 'abcd' + 'git', 'describe', '--tags', 'abcd', ], - stdout: 'v1.2.3' - ) + stdout: 'v1.2.3', + ), ]), terminal: terminal, stdio: stdio, @@ -96,10 +96,10 @@ void main() { processManager: FakeProcessManager.list([ const FakeCommand( command: [ - 'git', 'describe', '--tags', 'invalid' + 'git', 'describe', '--tags', 'invalid', ], exitCode: 1, - ) + ), ]), terminal: terminal, stdio: stdio, @@ -188,19 +188,19 @@ void main() { processManager: FakeProcessManager.list([ const FakeCommand( command: [ - 'git', 'describe', '--tags', 'g6b00b5e88' + 'git', 'describe', '--tags', 'g6b00b5e88', ], stdout: 'v1.2.3', ), const FakeCommand( command: [ - 'git', 'reset', '--hard', 'g6b00b5e88' + 'git', 'reset', '--hard', 'g6b00b5e88', ], ), const FakeCommand( command: [ - 'git', 'checkout', 'master', '--' - ] + 'git', 'checkout', 'master', '--', + ], ), ]), terminal: terminal, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/proxy_validator_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/proxy_validator_test.dart index be600cba5fa67..012c8b149e114 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/proxy_validator_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/proxy_validator_test.dart @@ -22,11 +22,11 @@ void main() { }) async { final List interfaces = [ FakeNetworkInterface([ - const FakeInternetAddress('127.0.0.1') + const FakeInternetAddress('127.0.0.1'), ]), FakeNetworkInterface([ - const FakeInternetAddress('::1') - ]) + const FakeInternetAddress('::1'), + ]), ]; return Future>.value(interfaces); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart index 493f046fa0a08..c58c14aab74f8 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/symbolize_test.dart @@ -128,7 +128,8 @@ void main() { expect( createTestCommandRunner(command).run(const [ - 'symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']), + 'symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result', + ]), throwsToolExit(message: 'test'), ); }, overrides: { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index 17762d3954e4d..58004aad2be9f 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -40,18 +40,18 @@ final String _packageConfigContents = json.encode({ 'name': 'test_api', 'rootUri': 'file:///path/to/pubcache/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.19', 'packageUri': 'lib/', - 'languageVersion': '2.12' + 'languageVersion': '2.12', }, { 'name': 'integration_test', 'rootUri': 'file:///path/to/flutter/packages/integration_test', 'packageUri': 'lib/', - 'languageVersion': '2.12' + 'languageVersion': '2.12', }, ], 'generated': '2021-02-24T07:55:20.084834Z', 'generator': 'pub', - 'generatorVersion': '2.13.0-68.0.dev' + 'generatorVersion': '2.13.0-68.0.dev', }); void main() { @@ -108,12 +108,12 @@ dev_dependencies: 'name': 'test_api', 'rootUri': 'file:///path/to/pubcache/.pub-cache/hosted/pub.dartlang.org/test_api-0.2.19', 'packageUri': 'lib/', - 'languageVersion': '2.12' + 'languageVersion': '2.12', }, ], 'generated': '2021-02-24T07:55:20.084834Z', 'generator': 'pub', - 'generatorVersion': '2.13.0-68.0.dev' + 'generatorVersion': '2.13.0-68.0.dev', })); final FakePackageTest fakePackageTest = FakePackageTest(); final TestCommand testCommand = TestCommand(testWrapper: fakePackageTest); @@ -122,7 +122,7 @@ dev_dependencies: expect(() => commandRunner.run(const [ 'test', '--no-pub', - 'integration_test' + 'integration_test', ]), throwsToolExit()); }, overrides: { FileSystem: () => fs, @@ -510,7 +510,7 @@ dev_dependencies: await commandRunner.run(const [ 'test', '--no-pub', - '--platform=chrome' + '--platform=chrome', ]); expect(await testCommand.requiredArtifacts, [DevelopmentArtifact.web]); diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart index d2beafda51707..27c26878e489d 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart @@ -170,7 +170,7 @@ void main() { '--split-debug-info', '/project-name/v1.2.3/', '--obfuscate', - '--dart-define=foo=bar' + '--dart-define=foo=bar', ], ); diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart index 8bb4cc8503753..b114d4a100420 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart @@ -53,7 +53,7 @@ void main() { 'bundle', ...?arguments, '--target=$projectPath/lib/main.dart', - '--no-pub' + '--no-pub', ]); return command; } @@ -215,7 +215,7 @@ void main() { '--no-pub', '--debug', '--target-platform=android-arm', - '--track-widget-creation' + '--track-widget-creation', ]); }, overrides: { BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { @@ -245,7 +245,7 @@ void main() { '--no-pub', '--debug', '--target-platform=android-arm', - '--dart-define=foo=bar' + '--dart-define=foo=bar', ]); }, overrides: { BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { @@ -306,7 +306,7 @@ void main() { '--no-pub', '--debug', '--target-platform=android-arm', - '--filesystem-root=test1,test2' + '--filesystem-root=test1,test2', ]); }, overrides: { BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { @@ -337,7 +337,7 @@ void main() { '--no-pub', '--debug', '--target-platform=android-arm', - '--extra-front-end-options=--testflag,--testflag2' + '--extra-front-end-options=--testflag,--testflag2', ]); }, overrides: { BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { @@ -368,7 +368,7 @@ void main() { '--no-pub', '--debug', '--target-platform=android-arm', - '--extra-gen-snapshot-options=--testflag,--testflag2' + '--extra-gen-snapshot-options=--testflag,--testflag2', ]); }, overrides: { BuildSystem: () => TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 9fcd22515850d..fe69d009f3da3 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -1034,7 +1034,7 @@ void main() { projectDir.childDirectory('example').childDirectory('web'), isNot(exists)); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: const [ - 'windows' + 'windows', ], pluginClass: 'FlutterProjectPluginCApi', unexpectedPlatforms: ['some_platform']); expect(logger.errorText, isNot(contains(_kNoPlatformsMessage))); @@ -1317,7 +1317,7 @@ void main() { command: const ['openssl', 'x509', '-subject'], stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US', - ) + ), ]); controller.stream.listen((List chunk) { @@ -1764,7 +1764,7 @@ void main() { '--org', 'com.bar.foo', '-i', 'objc', '-a', 'java', - '--platforms', 'ios,android' + '--platforms', 'ios,android', ], [], ); @@ -1918,7 +1918,7 @@ void main() { FakeRequest( Uri.parse('https://master-api.flutter.dev/snippets/foo.bar.Baz.dart'), response: FakeResponse(body: utf8.encode('void main() {}')), - ) + ), ]); }; }, @@ -1941,7 +1941,7 @@ void main() { FakeRequest( Uri.parse('https://master-api.flutter.dev/snippets/foo.bar.Baz.dart'), response: FakeResponse(body: utf8.encode('void main() { String? foo; print(foo); } // ignore: avoid_print')), - ) + ), ]); }; }, @@ -1968,7 +1968,7 @@ void main() { FakeRequest( Uri.parse('https://master-api.flutter.dev/snippets/index.json'), response: FakeResponse(body: utf8.encode(samplesIndexJson)), - ) + ), ]); }; }, @@ -1996,7 +1996,7 @@ void main() { return FakeHttpClient.list([ FakeRequest( Uri.parse('https://master-api.flutter.dev/snippets/index.json'), - ) + ), ]); }; }, @@ -2021,7 +2021,7 @@ void main() { FakeRequest( Uri.parse('https://master-api.flutter.dev/snippets/index.json'), response: const FakeResponse(statusCode: HttpStatus.notFound), - ) + ), ]); }; }, @@ -2055,7 +2055,7 @@ void main() { expect(projectDir.childDirectory('example').childDirectory('macos'), isNot(exists)); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: [ - 'some_platform' + 'some_platform', ], pluginClass: 'somePluginClass', unexpectedPlatforms: [ 'ios', 'android', 'web', 'linux', 'windows', 'macos']); }, overrides: { @@ -2141,7 +2141,7 @@ void main() { expect( projectDir.childDirectory('example').childDirectory('android'), exists); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: const [ - 'android' + 'android', ], pluginClass: 'FlutterProjectPlugin', unexpectedPlatforms: ['some_platform'], androidIdentifier: 'com.example.flutter_project'); @@ -2162,7 +2162,7 @@ void main() { projectDir.childDirectory('lib').childFile('flutter_project_web.dart'), exists); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: const [ - 'web' + 'web', ], pluginClass: 'FlutterProjectWeb', unexpectedPlatforms: ['some_platform'], androidIdentifier: 'com.example.flutter_project', @@ -2188,7 +2188,7 @@ void main() { projectDir.childDirectory('lib').childFile('flutter_project_web.dart'), isNot(exists)); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: const [ - 'some_platform' + 'some_platform', ], pluginClass: 'somePluginClass', unexpectedPlatforms: ['web']); expect(logger.errorText, contains(_kNoPlatformsMessage)); @@ -2324,7 +2324,7 @@ void main() { expect(projectDir.childDirectory('ios'), exists); expect(projectDir.childDirectory('example').childDirectory('ios'), exists); validatePubspecForPlugin(projectDir: projectDir.absolute.path, expectedPlatforms: const [ - 'ios', 'android' + 'ios', 'android', ], pluginClass: 'FlutterProjectPlugin', unexpectedPlatforms: ['some_platform'], androidIdentifier: 'com.example.flutter_project'); diff --git a/packages/flutter_tools/test/commands.shard/permeable/devices_test.dart b/packages/flutter_tools/test/commands.shard/permeable/devices_test.dart index 8df718fa17617..a73f7a1b198fe 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/devices_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/devices_test.dart @@ -71,9 +71,9 @@ void main() { 'fastStart': false, 'flutterExit': false, 'hardwareRendering': false, - 'startPaused': true - } - } + 'startPaused': true, + }, + }, )), ); }, overrides: { diff --git a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart index 590c65a030d8d..8ca503852b29e 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/packages_test.dart @@ -503,8 +503,10 @@ void main() { globals.fs.file('pubspec.yaml').createSync(); final IOSink stdin = IOSink(StreamController>().sink); processManager.addCommand( - FakeCommand(command: const [ - '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'run', '--foo', 'bar'], + FakeCommand( + command: const [ + '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'run', '--foo', 'bar', + ], stdin: stdin, ), ); @@ -531,8 +533,10 @@ void main() { globals.fs.file('pubspec.yaml').createSync(); final IOSink stdin = IOSink(StreamController>().sink); processManager.addCommand( - FakeCommand(command: const [ - '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'token', 'list'], + FakeCommand( + command: const [ + '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'token', 'list', + ], stdin: stdin, ), ); @@ -557,8 +561,10 @@ void main() { testUsingContext('upgrade does not check for pubspec.yaml if -h/--help is passed', () async { Cache.flutterRoot = ''; processManager.addCommand( - FakeCommand(command: const [ - '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'upgrade', '-h'], + FakeCommand( + command: const [ + '/bin/cache/dart-sdk/bin/dart', '__deprecated_pub', 'upgrade', '-h', + ], stdin: IOSink(StreamController>().sink), ), ); diff --git a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart index c98fe640801dc..b905b8aaa240b 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/upgrade_test.dart @@ -157,7 +157,7 @@ void main() { processManager.addCommands([ const FakeCommand(command: [ - 'git', 'fetch', '--tags' + 'git', 'fetch', '--tags', ]), const FakeCommand(command: [ 'git', 'rev-parse', '--verify', '@{upstream}', @@ -185,7 +185,7 @@ void main() { testUsingContext('fetchLatestVersion throws toolExit if HEAD is detached', () async { processManager.addCommands(const [ FakeCommand(command: [ - 'git', 'fetch', '--tags' + 'git', 'fetch', '--tags', ]), FakeCommand( command: ['git', 'rev-parse', '--verify', '@{upstream}'], @@ -214,7 +214,7 @@ void main() { testUsingContext('fetchLatestVersion throws toolExit if no upstream configured', () async { processManager.addCommands(const [ FakeCommand(command: [ - 'git', 'fetch', '--tags' + 'git', 'fetch', '--tags', ]), FakeCommand( command: ['git', 'rev-parse', '--verify', '@{upstream}'], diff --git a/packages/flutter_tools/test/general.shard/android/adb_log_reader_test.dart b/packages/flutter_tools/test/general.shard/android/adb_log_reader_test.dart index 8c284c083b2d7..31de85406c5b9 100644 --- a/packages/flutter_tools/test/general.shard/android/adb_log_reader_test.dart +++ b/packages/flutter_tools/test/general.shard/android/adb_log_reader_test.dart @@ -34,7 +34,7 @@ void main() { '-T', "'$kLastLogcatTimestamp'", ], - ) + ), ]); await AdbLogReader.createLogReader( createFakeDevice(kLollipopVersionCode), @@ -57,7 +57,7 @@ void main() { '-v', 'time', ], - ) + ), ]); await AdbLogReader.createLogReader( createFakeDevice(kLollipopVersionCode - 1), @@ -80,7 +80,7 @@ void main() { '-v', 'time', ], - ) + ), ]); await AdbLogReader.createLogReader( createFakeDevice(null), @@ -105,7 +105,7 @@ void main() { '-s', 'flutter', ], - ) + ), ]); await AdbLogReader.createLogReader( createFakeDevice(null), @@ -131,7 +131,7 @@ void main() { ], completer: Completer.sync(), stdout: 'Hello There\n', - ) + ), ]); final AdbLogReader logReader = await AdbLogReader.createLogReader( createFakeDevice(null), @@ -165,7 +165,7 @@ void main() { '05-11 12:54:46.665 E/AndroidRuntime(11787): Process: com.example.foobar, PID: 11787\n' '05-11 12:54:46.665 java.lang.RuntimeException: Unable to instantiate application ' 'io.flutter.app.FlutterApplication2: java.lang.ClassNotFoundException:\n', - ) + ), ]); final AdbLogReader logReader = await AdbLogReader.createLogReader( createFakeDevice(null), diff --git a/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart index 986e12411b594..bf04c5637fa9a 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_discovery_test.dart @@ -93,7 +93,7 @@ void main() { const FakeCommand( command: ['adb', 'devices', '-l'], exitCode: 1, - ) + ), ]); final AndroidDevices androidDevices = AndroidDevices( androidSdk: FakeAndroidSdk(), @@ -143,7 +143,7 @@ List of devices attached 05a02bac device usb:336592896X product:razor model:Nexus_7 device:flo ''', - ) + ), ]), platform: FakePlatform(), fileSystem: MemoryFileSystem.test(), @@ -172,7 +172,7 @@ localhost:36790 device emulator-5612 host features:shell_2 ''', - ) + ), ]), platform: FakePlatform(), fileSystem: MemoryFileSystem.test(), @@ -200,7 +200,7 @@ List of devices attached ZX1G22JJWR device usb:3-3 product:shamu model:Nexus_6 device:shamu features:cmd,shell_v2 ''', - ) + ), ]), platform: FakePlatform(), fileSystem: MemoryFileSystem.test(), @@ -226,7 +226,7 @@ It appears you do not have 'Android SDK Platform-tools' installed. Use the 'android' tool to install them: android update sdk --no-ui --filter 'platform-tools' ''', - ) + ), ]), platform: FakePlatform(), fileSystem: MemoryFileSystem.test(), diff --git a/packages/flutter_tools/test/general.shard/android/android_device_port_forwarder_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_port_forwarder_test.dart index 8197ccdd917d9..410a02c93d320 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_port_forwarder_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_port_forwarder_test.dart @@ -19,7 +19,7 @@ void main() { const FakeCommand( command: ['adb', '-s', '1', 'forward', 'tcp:0', 'tcp:123'], stdout: '456', - ) + ), ]), logger: BufferLogger.test(), ); @@ -35,7 +35,7 @@ void main() { processManager: FakeProcessManager.list([ const FakeCommand( command: ['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'], - ) + ), ]), logger: BufferLogger.test(), ); @@ -52,7 +52,7 @@ void main() { const FakeCommand( command: ['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'], stdout: '456', - ) + ), ]), logger: BufferLogger.test(), ); @@ -69,7 +69,7 @@ void main() { const FakeCommand( command: ['adb', '-s', '1', 'forward', 'tcp:456', 'tcp:123'], stdout: '123456', - ) + ), ]), logger: BufferLogger.test(), ); @@ -86,7 +86,7 @@ void main() { const FakeCommand( command: ['adb', '-s', '1', 'forward', '--list'], exitCode: 1, - ) + ), ]), logger: BufferLogger.test(), ); @@ -106,7 +106,7 @@ void main() { ), const FakeCommand( command: ['adb', '-s', '1', 'forward', '--remove', 'tcp:456'], - ) + ), ]); final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder( adbPath: 'adb', @@ -128,7 +128,7 @@ void main() { command: ['adb', '-s', '1', 'forward', '--remove', 'tcp:456'], stderr: "error: listener 'tcp:456' not found", exitCode: 1, - ) + ), ]); final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder( adbPath: 'adb', @@ -146,7 +146,7 @@ void main() { command: ['adb', '-s', '1', 'forward', '--remove', 'tcp:456'], stderr: 'error: everything is broken!', exitCode: 1, - ) + ), ]); final BufferLogger logger = BufferLogger.test(); final AndroidDevicePortForwarder forwarder = AndroidDevicePortForwarder( diff --git a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart index 030af3fbdae80..da058687d1309 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_start_test.dart @@ -198,7 +198,7 @@ void main() { '-r', '--user', '10', - 'app.apk' + 'app.apk', ], stdout: '\n\nThe Dart VM service is listening on http://127.0.0.1:456\n\n', )); diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart index d8450d8a275f1..b6bfdca661e48 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart @@ -45,7 +45,7 @@ void main() { stdout: '[ro.hardware]: [goldfish]\n[ro.build.characteristics]: [unused]', // Heap corruption exit code. exitCode: -1073740940, - ) + ), ]; final AndroidDevice windowsDevice = setUpAndroidDevice( @@ -88,8 +88,8 @@ void main() { FakeCommand( command: const ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.product.cpu.abi]: [${entry.key.first}]\n' - '[ro.product.cpu.abilist]: [${entry.key.last}]' - ) + '[ro.product.cpu.abilist]: [${entry.key.last}]', + ), ]), ); @@ -117,7 +117,7 @@ void main() { command: const ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.product.cpu.abi]: [${entry.key.first}]\n' '[ro.product.cpu.abilist]: [${entry.key.last}]' - ) + ), ]), ); @@ -234,7 +234,7 @@ flutter: const FakeCommand( command: ['adb', '-s', 'emulator-5555', 'shell', 'getprop'], stdout: '[ro.hardware]: [goldfish]' - ) + ), ]), id: 'emulator-5555', androidConsoleSocketFactory: (String host, int port) async => @@ -256,7 +256,7 @@ flutter: const FakeCommand( command: ['adb', '-s', 'emulator-5555', 'shell', 'getprop'], stdout: '[ro.hardware]: [samsungexynos7420]' - ) + ), ]), androidConsoleSocketFactory: (String host, int port) async { socketWasCreated = true; @@ -275,7 +275,7 @@ flutter: const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.hardware]: [goldfish]' - ) + ), ]), androidConsoleSocketFactory: (String host, int port) async { socketWasCreated = true; @@ -293,7 +293,7 @@ flutter: const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.hardware]: [goldfish]' - ) + ), ]), androidConsoleSocketFactory: (String host, int port) => throw Exception('Fake socket error'), ); @@ -307,7 +307,7 @@ flutter: const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.hardware]: [goldfish]' - ) + ), ]), androidConsoleSocketFactory: (String host, int port) async => FakeUnresponsiveAndroidConsoleSocket(), @@ -322,7 +322,7 @@ flutter: const FakeCommand( command: ['adb', '-s', '1234', 'shell', 'getprop'], stdout: '[ro.hardware]: [goldfish]' - ) + ), ]), androidConsoleSocketFactory: (String host, int port) async => FakeDisconnectingAndroidConsoleSocket() @@ -337,7 +337,7 @@ flutter: const FakeCommand( command: ['adb', '-s', '1234', 'shell', '-x', 'logcat', '-v', 'time', '-t', '1'], exitCode: 1, - ) + ), ]) ); @@ -357,7 +357,7 @@ flutter: ), const FakeCommand( command: ['adb', '-s', '1234', 'shell', '-x', 'logcat', '-v', 'time'], - ) + ), ]) ); diff --git a/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart b/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart index c85b6e2c0a366..027164dcc3d7a 100644 --- a/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_emulator_test.dart @@ -145,7 +145,7 @@ void main() { testWithoutContext('succeeds with coldboot launch', () async { final List kEmulatorLaunchColdBootCommand = [ ...kEmulatorLaunchCommand, - '-no-snapshot-load' + '-no-snapshot-load', ]; final AndroidEmulator emulator = AndroidEmulator(emulatorID, processManager: FakeProcessManager.list([ diff --git a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart index bd90fa1730346..37246c9362b4f 100644 --- a/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_gradle_builder_test.dart @@ -60,7 +60,7 @@ void main() { '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', - 'assembleRelease' + 'assembleRelease', ], exitCode: 1, stderr: '\nSome gradle message\n', @@ -150,7 +150,7 @@ void main() { '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', - 'assembleRelease' + 'assembleRelease', ], )); @@ -656,7 +656,7 @@ void main() { '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', - 'assembleRelease' + 'assembleRelease', ], )); fileSystem.directory('android') @@ -788,7 +788,7 @@ void main() { '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', '-Ptarget-platform=android-arm,android-arm64,android-x64', - 'assembleAarRelease' + 'assembleAarRelease', ], )); @@ -841,7 +841,7 @@ void main() { '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', '-Ptarget-platform=android-arm,android-arm64,android-x64', - 'assembleAarRelease' + 'assembleAarRelease', ], exitCode: 108, stderr: 'Gradle task assembleAarRelease failed with exit code 108.', @@ -1119,7 +1119,7 @@ void main() { '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', - 'assembleRelease' + 'assembleRelease', ], exitCode: 1, )); @@ -1192,7 +1192,7 @@ void main() { '-Pdart-obfuscation=false', '-Ptrack-widget-creation=false', '-Ptree-shake-icons=false', - 'assembleRelease' + 'assembleRelease', ], )); fileSystem.file('android/gradlew').createSync(recursive: true); @@ -1253,7 +1253,7 @@ void main() { '-Plocal-engine-build-mode=release', '-Plocal-engine-out=out/android_arm', '-Ptarget-platform=android-arm', - 'assembleAarRelease' + 'assembleAarRelease', ], )); @@ -1337,7 +1337,7 @@ void main() { '-Plocal-engine-build-mode=release', '-Plocal-engine-out=out/android_arm64', '-Ptarget-platform=android-arm64', - 'assembleAarRelease' + 'assembleAarRelease', ], )); @@ -1421,7 +1421,7 @@ void main() { '-Plocal-engine-build-mode=release', '-Plocal-engine-out=out/android_x86', '-Ptarget-platform=android-x86', - 'assembleAarRelease' + 'assembleAarRelease', ], )); @@ -1505,7 +1505,7 @@ void main() { '-Plocal-engine-build-mode=release', '-Plocal-engine-out=out/android_x64', '-Ptarget-platform=android-x64', - 'assembleAarRelease' + 'assembleAarRelease', ], )); diff --git a/packages/flutter_tools/test/general.shard/android/android_install_test.dart b/packages/flutter_tools/test/general.shard/android/android_install_test.dart index 8e889d852ddc0..ca6fc9670da99 100644 --- a/packages/flutter_tools/test/general.shard/android/android_install_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_install_test.dart @@ -31,7 +31,7 @@ const FakeCommand kInstallCommand = FakeCommand( '-r', '--user', '10', - 'app.apk' + 'app.apk', ], ); const FakeCommand kStoreShaCommand = FakeCommand( @@ -182,7 +182,7 @@ void main() { '-r', '--user', 'jane', - 'app.apk' + 'app.apk', ], exitCode: 1, stderr: 'Exception occurred while executing: java.lang.IllegalArgumentException: Bad user number: jane', diff --git a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart index 9276230d043ba..219c945974244 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_errors_test.dart @@ -427,7 +427,7 @@ Execution failed for task ':app:mergeDexDebug'. }, overrides: { FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), - AnsiTerminal: () => _TestPromptTerminal('y') + AnsiTerminal: () => _TestPromptTerminal('y'), }); testUsingContext('exits if multidex support skipped', () async { @@ -493,7 +493,7 @@ Execution failed for task ':app:mergeDexDebug'. }, overrides: { FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), - AnsiTerminal: () => _TestPromptTerminal('n') + AnsiTerminal: () => _TestPromptTerminal('n'), }); testUsingContext('exits if multidex support disabled', () async { diff --git a/packages/flutter_tools/test/general.shard/android/template_test.dart b/packages/flutter_tools/test/general.shard/android/template_test.dart index 138e7d505c883..4b6e031fb9d4b 100644 --- a/packages/flutter_tools/test/general.shard/android/template_test.dart +++ b/packages/flutter_tools/test/general.shard/android/template_test.dart @@ -36,7 +36,7 @@ void main() { ); final Map context = { - 'androidIdentifier': 'in.when.there' + 'androidIdentifier': 'in.when.there', }; template.render(destination, context); diff --git a/packages/flutter_tools/test/general.shard/artifact_updater_test.dart b/packages/flutter_tools/test/general.shard/artifact_updater_test.dart index 12bfef989b393..1470c0ed746e1 100644 --- a/packages/flutter_tools/test/general.shard/artifact_updater_test.dart +++ b/packages/flutter_tools/test/general.shard/artifact_updater_test.dart @@ -123,7 +123,7 @@ void main() { headers: >{ 'x-goog-hash': [ 'foo-bar-baz', - 'md5=k7iFrf4NoInN9jSQT9WfcQ==' + 'md5=k7iFrf4NoInN9jSQT9WfcQ==', ], } )), @@ -159,7 +159,7 @@ void main() { headers: >{ 'x-goog-hash': [ 'foo-bar-baz', - 'md5=k7iFrf4SQT9WfcQ==' + 'md5=k7iFrf4SQT9WfcQ==', ], } )), @@ -167,7 +167,7 @@ void main() { headers: >{ 'x-goog-hash': [ 'foo-bar-baz', - 'md5=k7iFrf4SQT9WfcQ==' + 'md5=k7iFrf4SQT9WfcQ==', ], } )), @@ -254,11 +254,11 @@ void main() { operatingSystemUtils: operatingSystemUtils, platform: FakePlatform( environment: { - 'FLUTTER_STORAGE_BASE_URL': 'foo-bar' + 'FLUTTER_STORAGE_BASE_URL': 'foo-bar', }, ), httpClient: FakeHttpClient.list([ - FakeRequest(Uri.parse('http://foo-bar/test.zip'), responseError: ArgumentError()) + FakeRequest(Uri.parse('http://foo-bar/test.zip'), responseError: ArgumentError()), ]), tempStorage: fileSystem.currentDirectory.childDirectory('temp') ..createSync(), diff --git a/packages/flutter_tools/test/general.shard/base/build_test.dart b/packages/flutter_tools/test/general.shard/base/build_test.dart index b5d95d554312f..39161065f8d81 100644 --- a/packages/flutter_tools/test/general.shard/base/build_test.dart +++ b/packages/flutter_tools/test/general.shard/base/build_test.dart @@ -76,7 +76,7 @@ void main() { FakeCommand( command: [ artifacts.getArtifactPath(Artifact.genSnapshot, platform: TargetPlatform.android_x64, mode: BuildMode.release), - '--additional_arg' + '--additional_arg', ], ), ); diff --git a/packages/flutter_tools/test/general.shard/build_info_test.dart b/packages/flutter_tools/test/general.shard/build_info_test.dart index 5ad63db9044c2..53a4e2578b581 100644 --- a/packages/flutter_tools/test/general.shard/build_info_test.dart +++ b/packages/flutter_tools/test/general.shard/build_info_test.dart @@ -210,7 +210,7 @@ void main() { '-Pbundle-sksl-path=foo/bar/baz.sksl.json', '-Pcode-size-directory=foo/code-size', '-Pfoo=bar', - '-Pfizz=bazz' + '-Pfizz=bazz', ]); }); @@ -224,19 +224,19 @@ void main() { testWithoutContext('decodeDartDefines decodes base64 encoded dart defines', () { expect(decodeDartDefines({ - kDartDefines: 'ImhlbGxvIg==' + kDartDefines: 'ImhlbGxvIg==', }, kDartDefines), ['"hello"']); expect(decodeDartDefines({ - kDartDefines: 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbQ==' + kDartDefines: 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbQ==', }, kDartDefines), ['https://www.google.com']); expect(decodeDartDefines({ - kDartDefines: 'MiwzLDQ=,NQ==' + kDartDefines: 'MiwzLDQ=,NQ==', }, kDartDefines), ['2,3,4', '5']); expect(decodeDartDefines({ - kDartDefines: 'dHJ1ZQ==,ZmFsc2U=,Zmxhc2U=' + kDartDefines: 'dHJ1ZQ==,ZmFsc2U=,Zmxhc2U=', }, kDartDefines), ['true', 'false', 'flase']); expect(decodeDartDefines({ - kDartDefines: 'MTIzMiw0NTY=,Mg==' + kDartDefines: 'MTIzMiw0NTY=,Mg==', }, kDartDefines), ['1232,456', '2']); }); } diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart index 574949724e3d4..d5b873280653e 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/android_test.dart @@ -78,7 +78,7 @@ void main() { kBuildMode: 'debug', }, inputs: { - kBundleSkSLPath: 'bundle.sksl' + kBundleSkSLPath: 'bundle.sksl', }, processManager: processManager, artifacts: artifacts, @@ -93,8 +93,8 @@ void main() { 'platform': 'android', 'data': { 'A': 'B', - } - } + }, + }, )); // create pre-requisites. @@ -265,7 +265,7 @@ void main() { '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', '--strip', - environment.buildDir.childFile('app.dill').path + environment.buildDir.childFile('app.dill').path, ], )); environment.buildDir.createSync(recursive: true); @@ -303,7 +303,7 @@ void main() { 'bar', '--snapshot_kind=app-aot-elf', '--elf=${environment.buildDir.childDirectory('arm64-v8a').childFile('app.so').path}', - environment.buildDir.childFile('app.dill').path + environment.buildDir.childFile('app.dill').path, ], )); environment.buildDir.createSync(recursive: true); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart index 4d5f6a266de78..ed20556a8cbd4 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/assets_test.dart @@ -181,8 +181,8 @@ flutter: final BufferLogger logger = BufferLogger.test(); fileSystem.file('bundle.sksl').writeAsStringSync(json.encode( { - 'engineRevision': '1' - } + 'engineRevision': '1', + }, )); expect(() => processSkSLBundle( @@ -204,7 +204,7 @@ flutter: { 'engineRevision': '2', 'platform': 'fuchsia-arm64', - 'data': {} + 'data': {}, } )); @@ -228,8 +228,8 @@ flutter: { 'engineRevision': '2', 'platform': 'android', - 'data': {} - } + 'data': {}, + }, )); final DevFSContent content = processSkSLBundle( diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart index 257f1f70f1213..a4c34293b6a21 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart @@ -369,7 +369,7 @@ void main() { '--no-sim-use-hardfp', '--no-use-integer-division', '$build/app.dill', - ]) + ]), ]); androidEnvironment.buildDir.childFile('app.dill').createSync(recursive: true); @@ -397,7 +397,7 @@ void main() { '--no-sim-use-hardfp', '--no-use-integer-division', '$build/app.dill', - ]) + ]), ]); androidEnvironment.buildDir.childFile('app.dill').createSync(recursive: true); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/ios_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/ios_test.dart index 38bdb0501736e..2603e69425a5b 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/ios_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/ios_test.dart @@ -186,8 +186,8 @@ void main() { 'platform': 'ios', 'data': { 'A': 'B', - } - } + }, + }, )); final Directory frameworkDirectory = environment.outputDir.childDirectory('App.framework'); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart index 4f29ea1a74740..963c217e9c03a 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/linux_test.dart @@ -123,8 +123,8 @@ void main() { 'platform': 'ios', 'data': { 'A': 'B', - } - } + }, + }, )); await const DebugBundleLinuxAssets(TargetPlatform.linux_x64).build(testEnvironment); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart index ff8463760a4cf..6922195b9c9f6 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/macos_test.dart @@ -229,8 +229,8 @@ void main() { 'platform': 'ios', 'data': { 'A': 'B', - } - } + }, + }, )); final String inputKernel = '${environment.buildDir.path}/app.dill'; @@ -389,7 +389,7 @@ void main() { '--snapshot_kind=app-aot-assembly', '--assembly=${environment.buildDir.childFile('arm64/snapshot_assembly.S').path}', '--strip', - environment.buildDir.childFile('app.dill').path + environment.buildDir.childFile('app.dill').path, ]), FakeCommand(command: [ 'Artifact.genSnapshot.TargetPlatform.darwin.release_x64', @@ -397,17 +397,17 @@ void main() { '--snapshot_kind=app-aot-assembly', '--assembly=${environment.buildDir.childFile('x86_64/snapshot_assembly.S').path}', '--strip', - environment.buildDir.childFile('app.dill').path + environment.buildDir.childFile('app.dill').path, ]), FakeCommand(command: [ 'xcrun', 'cc', '-arch', 'arm64', '-c', environment.buildDir.childFile('arm64/snapshot_assembly.S').path, - '-o', environment.buildDir.childFile('arm64/snapshot_assembly.o').path + '-o', environment.buildDir.childFile('arm64/snapshot_assembly.o').path, ]), FakeCommand(command: [ 'xcrun', 'cc', '-arch', 'x86_64', '-c', environment.buildDir.childFile('x86_64/snapshot_assembly.S').path, - '-o', environment.buildDir.childFile('x86_64/snapshot_assembly.o').path + '-o', environment.buildDir.childFile('x86_64/snapshot_assembly.o').path, ]), FakeCommand(command: [ 'xcrun', 'clang', '-arch', 'arm64', '-dynamiclib', '-Xlinker', '-rpath', @@ -415,7 +415,7 @@ void main() { '-Xlinker', '@loader_path/Frameworks', '-install_name', '@rpath/App.framework/App', '-o', environment.buildDir.childFile('arm64/App.framework/App').path, - environment.buildDir.childFile('arm64/snapshot_assembly.o').path + environment.buildDir.childFile('arm64/snapshot_assembly.o').path, ]), FakeCommand(command: [ 'xcrun', 'clang', '-arch', 'x86_64', '-dynamiclib', '-Xlinker', '-rpath', @@ -423,7 +423,7 @@ void main() { '-Xlinker', '@loader_path/Frameworks', '-install_name', '@rpath/App.framework/App', '-o', environment.buildDir.childFile('x86_64/App.framework/App').path, - environment.buildDir.childFile('x86_64/snapshot_assembly.o').path + environment.buildDir.childFile('x86_64/snapshot_assembly.o').path, ]), FakeCommand(command: [ 'lipo', diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart index d88647f7dd2fc..e3f09feb55194 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart @@ -156,8 +156,8 @@ void main() { 'platform': 'ios', 'data': { 'A': 'B', - } - } + }, + }, )); await const DebugBundleWindowsAssets().build(environment); diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart index a21cafc1e33d3..9de6f614c203b 100644 --- a/packages/flutter_tools/test/general.shard/cache_test.dart +++ b/packages/flutter_tools/test/general.shard/cache_test.dart @@ -499,7 +499,7 @@ void main() { const FakeCommand( command: [ 'which', - 'sysctl' + 'sysctl', ], stdout: '/sbin/sysctl', ), @@ -798,7 +798,7 @@ void main() { fileSystem: fileSystem, platform: FakePlatform( environment: { - 'FLUTTER_STORAGE_BASE_URL': 'https://flutter.storage.com/override' + 'FLUTTER_STORAGE_BASE_URL': 'https://flutter.storage.com/override', }, ), ); @@ -820,7 +820,7 @@ void main() { expect(downloads, [ 'https://flutter.storage.com/override/flutter_infra_release/flutter/hijklmnop/flutter-web-sdk-linux-x64.zip', - 'https://flutter.storage.com/override/flutter_infra_release/cipd/flutter/web/canvaskit_bundle/+/abcdefg' + 'https://flutter.storage.com/override/flutter_infra_release/cipd/flutter/web/canvaskit_bundle/+/abcdefg', ]); }); @@ -1006,9 +1006,9 @@ void main() { '--project-cache-dir', 'cache/bin/cache/flutter_gradle_wrapper.rand0', 'resolveDependencies', - ]) + ]), ]), - AndroidSdk: () => fakeAndroidSdk + AndroidSdk: () => fakeAndroidSdk, }); testUsingContext('AndroidMavenArtifacts is a no-op if the Android SDK is absent', () async { @@ -1022,7 +1022,7 @@ void main() { Cache: () => cache, FileSystem: () => memoryFileSystem, ProcessManager: () => FakeProcessManager.empty(), - AndroidSdk: () => null // Android SDK was not located. + AndroidSdk: () => null, // Android SDK was not located. }); }); } diff --git a/packages/flutter_tools/test/general.shard/commands/flutter_root_test.dart b/packages/flutter_tools/test/general.shard/commands/flutter_root_test.dart index 5a44537f3eded..0a5aa8c1fd80d 100644 --- a/packages/flutter_tools/test/general.shard/commands/flutter_root_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/flutter_root_test.dart @@ -13,13 +13,13 @@ import '../../src/common.dart'; void main() { testWithoutContext('Cache can initialize flutter root from environment variable', () { final String defaultFlutterRoot = Cache.defaultFlutterRoot( - fileSystem: MemoryFileSystem.test(), - userMessages: UserMessages(), - platform: FakePlatform( - environment: { - 'FLUTTER_ROOT': 'path/to/flutter' - } - ) + fileSystem: MemoryFileSystem.test(), + userMessages: UserMessages(), + platform: FakePlatform( + environment: { + 'FLUTTER_ROOT': 'path/to/flutter', + }, + ), ); expect(defaultFlutterRoot, '/path/to/flutter'); diff --git a/packages/flutter_tools/test/general.shard/compile_batch_test.dart b/packages/flutter_tools/test/general.shard/compile_batch_test.dart index cb2700305742f..3c9d3f4b07747 100644 --- a/packages/flutter_tools/test/general.shard/compile_batch_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_batch_test.dart @@ -66,7 +66,7 @@ void main() { '--no-link-platform', '--packages', '.packages', - 'file:///path/to/main.dart' + 'file:///path/to/main.dart', ], completer: completer), ]), stdoutHandler: stdoutHandler, @@ -111,7 +111,7 @@ void main() { '--no-link-platform', '--packages', '.packages', - 'file:///path/to/main.dart' + 'file:///path/to/main.dart', ], completer: completer), ]), stdoutHandler: stdoutHandler, @@ -156,7 +156,7 @@ void main() { '--no-link-platform', '--packages', '.packages', - 'file:///path/to/main.dart' + 'file:///path/to/main.dart', ], completer: completer, exitCode: 127), ]), stdoutHandler: stdoutHandler, @@ -202,7 +202,7 @@ void main() { '--tfa', '--packages', '.packages', - 'file:///path/to/main.dart' + 'file:///path/to/main.dart', ], completer: completer), ]), stdoutHandler: stdoutHandler, @@ -249,7 +249,7 @@ void main() { '--tfa', '--packages', '.packages', - 'file:///path/to/main.dart' + 'file:///path/to/main.dart', ], completer: completer), ]), stdoutHandler: stdoutHandler, diff --git a/packages/flutter_tools/test/general.shard/compile_expression_test.dart b/packages/flutter_tools/test/general.shard/compile_expression_test.dart index 981989eb1f5b0..c91e04380906b 100644 --- a/packages/flutter_tools/test/general.shard/compile_expression_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_expression_test.dart @@ -68,7 +68,9 @@ void main() { processManager.process.stdout = Stream>.fromFutures( >>[ compileResponseCompleter.future, - compileExpressionResponseCompleter.future]); + compileExpressionResponseCompleter.future, + ], + ); compileResponseCompleter.complete(Future>.value(utf8.encode( 'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0\n' ))); diff --git a/packages/flutter_tools/test/general.shard/coverage_collector_test.dart b/packages/flutter_tools/test/general.shard/coverage_collector_test.dart index 488ba6c8fd0bf..df502786f6fdc 100644 --- a/packages/flutter_tools/test/general.shard/coverage_collector_test.dart +++ b/packages/flutter_tools/test/general.shard/coverage_collector_test.dart @@ -23,7 +23,7 @@ void main() { jsonResponse: (VM.parse({}) ..isolates = [ IsolateRef.parse({ - 'id': '1' + 'id': '1', }), ] ).toJson(), @@ -34,9 +34,9 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'type': 'Sentinel' - } - ) + 'type': 'Sentinel', + }, + ), ], ); @@ -64,7 +64,7 @@ void main() { jsonResponse: (VM.parse({}) ..isolates = [ IsolateRef.parse({ - 'id': '1' + 'id': '1', }), ] ).toJson(), @@ -131,19 +131,22 @@ void main() { }, ); - expect(result, {'type': 'CodeCoverage', 'coverage': [ - { - 'source': 'foo.dart', - 'script': { - 'type': '@Script', - 'fixedId': true, - 'id': 'libraries/1/scripts/foo.dart', - 'uri': 'foo.dart', - '_kind': 'library', + expect(result, { + 'type': 'CodeCoverage', + 'coverage': [ + { + 'source': 'foo.dart', + 'script': { + 'type': '@Script', + 'fixedId': true, + 'id': 'libraries/1/scripts/foo.dart', + 'uri': 'foo.dart', + '_kind': 'library', + }, + 'hits': [], }, - 'hits': [], - }, - ]}); + ], + }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); @@ -159,7 +162,7 @@ void main() { jsonResponse: (VM.parse({}) ..isolates = [ IsolateRef.parse({ - 'id': '1' + 'id': '1', }), ] ).toJson(), @@ -214,19 +217,22 @@ void main() { }, ); - expect(result, {'type': 'CodeCoverage', 'coverage': [ - { - 'source': 'foo.dart', - 'script': { - 'type': '@Script', - 'fixedId': true, - 'id': 'libraries/1/scripts/foo.dart', - 'uri': 'foo.dart', - '_kind': 'library', + expect(result, { + 'type': 'CodeCoverage', + 'coverage': [ + { + 'source': 'foo.dart', + 'script': { + 'type': '@Script', + 'fixedId': true, + 'id': 'libraries/1/scripts/foo.dart', + 'uri': 'foo.dart', + '_kind': 'library', + }, + 'hits': [1, 1, 3, 1, 2, 0], }, - 'hits': [1, 1, 3, 1, 2, 0], - }, - ]}); + ], + }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }); } diff --git a/packages/flutter_tools/test/general.shard/custom_devices/custom_device_test.dart b/packages/flutter_tools/test/general.shard/custom_devices/custom_device_test.dart index 53c32cba22f8f..34e550abb59b7 100644 --- a/packages/flutter_tools/test/general.shard/custom_devices/custom_device_test.dart +++ b/packages/flutter_tools/test/general.shard/custom_devices/custom_device_test.dart @@ -36,7 +36,7 @@ void _writeCustomDevicesConfigFile(Directory dir, List confi final File file = dir.childFile('.flutter_custom_devices.json'); file.writeAsStringSync(jsonEncode( { - 'custom-devices': configs.map((CustomDeviceConfig c) => c.toJson()).toList() + 'custom-devices': configs.map((CustomDeviceConfig c) => c.toJson()).toList(), } )); } @@ -56,11 +56,11 @@ void main() { ['scp', r'${localPath}', r'/tmp/${appName}', 'pi@raspberrypi'], { 'localPath': 'build/flutter_assets', - 'appName': 'hello_world' - } + 'appName': 'hello_world', + }, ), [ - 'scp', 'build/flutter_assets', '/tmp/hello_world', 'pi@raspberrypi' + 'scp', 'build/flutter_assets', '/tmp/hello_world', 'pi@raspberrypi', ] ); @@ -69,11 +69,11 @@ void main() { [r'${test1}', r' ${test2}', r'${test3}'], { 'test1': '_test1', - 'test2': '_test2' - } + 'test2': '_test2', + }, ), [ - '_test1', ' _test2', r'' + '_test1', ' _test2', r'', ] ); @@ -82,15 +82,15 @@ void main() { [r'${test1}', r' ${test2}', r'${test3}'], { 'test1': '_test1', - 'test2': '_test2' + 'test2': '_test2', }, additionalReplacementValues: { 'test2': '_nottest2', - 'test3': '_test3' + 'test3': '_test3', } ), [ - '_test1', ' _test2', r'_test3' + '_test1', ' _test2', r'_test3', ] ); }); @@ -108,7 +108,7 @@ void main() { runDebugCommand: const ['testrundebug'], forwardPortCommand: const ['testforwardport'], forwardPortSuccessRegex: RegExp('testforwardportsuccess'), - screenshotCommand: const ['testscreenshot'] + screenshotCommand: const ['testscreenshot'], ); const String testConfigPingSuccessOutput = 'testpingsuccess\n'; @@ -150,7 +150,7 @@ void main() { }, overrides: { FileSystem: () => MemoryFileSystem.test(), - ProcessManager: () => FakeProcessManager.any() + ProcessManager: () => FakeProcessManager.any(), } ); @@ -321,7 +321,7 @@ void main() { logger: BufferLogger.test(), processManager: FakeProcessManager.list([ FakeCommand(command: testConfig.uninstallCommand), - FakeCommand(command: testConfig.installCommand, onRun: () => bothCommandsWereExecuted = true) + FakeCommand(command: testConfig.installCommand, onRun: () => bothCommandsWereExecuted = true), ]) ); @@ -330,7 +330,7 @@ void main() { }, overrides: { FileSystem: () => MemoryFileSystem.test(), - ProcessManager: () => FakeProcessManager.any() + ProcessManager: () => FakeProcessManager.any(), } ); @@ -346,8 +346,8 @@ void main() { FakeCommand( command: testConfig.forwardPortCommand, stdout: testConfigForwardPortSuccessOutput, - completer: forwardPortCommandCompleter - ) + completer: forwardPortCommandCompleter, + ), ]) ); @@ -376,7 +376,7 @@ void main() { command: testConfig.forwardPortCommand, completer: forwardPortCompleter, stdout: testConfigForwardPortSuccessOutput, - ) + ), ]); final CustomDeviceAppSession appSession = CustomDeviceAppSession( @@ -461,8 +461,8 @@ void main() { FakeCommand( command: testConfig.forwardPortCommand, completer: forwardPortCompleter, - stdout: testConfigForwardPortSuccessOutput - ) + stdout: testConfigForwardPortSuccessOutput, + ), ] ); @@ -515,7 +515,7 @@ void main() { }, overrides: { FileSystem: () => MemoryFileSystem.test(), - ProcessManager: () => FakeProcessManager.any() + ProcessManager: () => FakeProcessManager.any(), } ); @@ -526,7 +526,7 @@ void main() { FakeCommand( command: testConfig.screenshotCommand, onRun: () => screenshotCommandWasExecuted = true, - ) + ), ]); final MemoryFileSystem fs = MemoryFileSystem.test(); @@ -552,7 +552,7 @@ void main() { FakeCommand( command: testConfig.screenshotCommand, onRun: () => screenshotCommandWasExecuted = true, - ) + ), ]); final MemoryFileSystem fs = MemoryFileSystem.test(); diff --git a/packages/flutter_tools/test/general.shard/custom_devices/custom_devices_config_test.dart b/packages/flutter_tools/test/general.shard/custom_devices/custom_devices_config_test.dart index 38eefe97c53d0..bc7fbc03c66b5 100644 --- a/packages/flutter_tools/test/general.shard/custom_devices/custom_devices_config_test.dart +++ b/packages/flutter_tools/test/general.shard/custom_devices/custom_devices_config_test.dart @@ -44,7 +44,7 @@ void main() { writeCustomDevicesConfigFile( directory, json: { - 'test': 'testvalue' + 'test': 'testvalue', } ); @@ -78,7 +78,7 @@ void main() { writeCustomDevicesConfigFile( directory, json: [ - testConfigJson + testConfigJson, ], ); @@ -105,7 +105,7 @@ void main() { copyJsonObjectWith( testConfigJson, { - 'id': null + 'id': null, }, ), ], @@ -114,7 +114,7 @@ void main() { final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( fileSystem: fileSystem, directory: directory, - logger: logger + logger: logger, ); const String msg = 'Could not load custom device from config index 0: Expected id to be a string.'; @@ -133,7 +133,7 @@ void main() { copyJsonObjectWith( testConfigJson, { - 'id': 1 + 'id': 1, }, ), ], @@ -142,7 +142,7 @@ void main() { final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( fileSystem: fileSystem, directory: directory, - logger: logger + logger: logger, ); const String msg = 'Could not load custom device from config index 0: Expected id to be a string.'; @@ -161,7 +161,7 @@ void main() { copyJsonObjectWith( testConfigJson, { - 'label': 1 + 'label': 1, }, ), ], @@ -170,7 +170,7 @@ void main() { final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( fileSystem: fileSystem, directory: directory, - logger: logger + logger: logger, ); const String msg = 'Could not load custom device from config index 0: Expected label to be a string.'; @@ -189,7 +189,7 @@ void main() { copyJsonObjectWith( testConfigJson, { - 'postBuild': null + 'postBuild': null, }, ), ], @@ -216,7 +216,7 @@ void main() { testConfigJson, { 'forwardPort': null, - 'forwardPortSuccessRegex': null + 'forwardPortSuccessRegex': null, }, ), ], @@ -245,7 +245,7 @@ void main() { copyJsonObjectWith( testConfigJson, { - 'forwardPortSuccessRegex': null + 'forwardPortSuccessRegex': null, }, ), ], diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart index 2876f8cf4ce1c..9770183e3c1e9 100644 --- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart +++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart @@ -55,7 +55,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -102,7 +102,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -149,7 +149,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -259,7 +259,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -297,7 +297,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -336,7 +336,7 @@ void main() { '--no-precompile', ], onRun: () { fileSystem.file('.dart_tool/package_config.json').createSync(recursive: true); - }) + }), ]); final BufferLogger logger = BufferLogger.test(); @@ -406,7 +406,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); @@ -444,7 +444,7 @@ void main() { '--verbosity=warning', 'get', '--no-precompile', - ]) + ]), ]); final BufferLogger logger = BufferLogger.test(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); diff --git a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart index 0bd3de9fcc733..74c1de28bf921 100644 --- a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart +++ b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart @@ -669,7 +669,7 @@ void main() { platforms: macos: dartPluginClass: AwesomeMacOS -''' +''', }); final Directory libDir = flutterProject.directory.childDirectory('lib'); @@ -803,7 +803,7 @@ void main() { platforms: macos: invalid: -''' +''', }); final Directory libDir = flutterProject.directory.childDirectory('lib'); @@ -844,7 +844,7 @@ void main() { flutter: plugin: implements: url_launcher -''' +''', }); final Directory libDir = flutterProject.directory.childDirectory('lib'); @@ -944,7 +944,7 @@ void main() { platforms: macos: dartPluginClass: MacOSPlugin -''' +''', }); final Directory libDir = flutterProject.directory.childDirectory('lib'); diff --git a/packages/flutter_tools/test/general.shard/desktop_device_test.dart b/packages/flutter_tools/test/general.shard/desktop_device_test.dart index 764049493e107..bd19c1b8956af 100644 --- a/packages/flutter_tools/test/general.shard/desktop_device_test.dart +++ b/packages/flutter_tools/test/general.shard/desktop_device_test.dart @@ -162,7 +162,7 @@ void main() { 'FLUTTER_ENGINE_SWITCH_17': 'dart-flags=--null_assertions', 'FLUTTER_ENGINE_SWITCH_18': 'use-test-fonts=true', 'FLUTTER_ENGINE_SWITCH_19': 'verbose-logging=true', - 'FLUTTER_ENGINE_SWITCHES': '19' + 'FLUTTER_ENGINE_SWITCHES': '19', } ), ]); @@ -209,7 +209,7 @@ void main() { 'FLUTTER_ENGINE_SWITCH_2': 'trace-startup=true', 'FLUTTER_ENGINE_SWITCH_3': 'trace-allowlist=foo,bar', 'FLUTTER_ENGINE_SWITCH_4': 'cache-sksl=true', - 'FLUTTER_ENGINE_SWITCHES': '4' + 'FLUTTER_ENGINE_SWITCHES': '4', } ), ]); diff --git a/packages/flutter_tools/test/general.shard/devfs_test.dart b/packages/flutter_tools/test/general.shard/devfs_test.dart index 620dd7ee8004e..9d1d2401554d5 100644 --- a/packages/flutter_tools/test/general.shard/devfs_test.dart +++ b/packages/flutter_tools/test/general.shard/devfs_test.dart @@ -212,7 +212,7 @@ void main() { FakeRequest(Uri.parse('http://localhost'), method: HttpMethod.put, responseError: const OSError('Connection Reset by peer')), FakeRequest(Uri.parse('http://localhost'), method: HttpMethod.put, responseError: const OSError('Connection Reset by peer')), // This is the value of `[1, 2, 3, 4, 5]` run through `osUtils.gzipLevel1Stream`. - FakeRequest(Uri.parse('http://localhost'), method: HttpMethod.put, body: [for (List chunk in expectedEncoded) ...chunk]) + FakeRequest(Uri.parse('http://localhost'), method: HttpMethod.put, body: [for (List chunk in expectedEncoded) ...chunk]), ]), uploadRetryThrottle: Duration.zero, ); diff --git a/packages/flutter_tools/test/general.shard/device_test.dart b/packages/flutter_tools/test/general.shard/device_test.dart index 3b498cd09cc3c..a21e3410e0569 100644 --- a/packages/flutter_tools/test/general.shard/device_test.dart +++ b/packages/flutter_tools/test/general.shard/device_test.dart @@ -222,7 +222,7 @@ void main() { final List filtered = await deviceManager.findTargetDevices(FakeFlutterProject()); expect(filtered, [ - nonEphemeralOne + nonEphemeralOne, ]); }); @@ -242,7 +242,7 @@ void main() { final List filtered = await deviceManager.findTargetDevices(FakeFlutterProject()); expect(filtered, [ - nonEphemeralTwo + nonEphemeralTwo, ]); }); @@ -263,7 +263,7 @@ void main() { final List filtered = await deviceManager.findTargetDevices(FakeFlutterProject()); expect(filtered, [ - ephemeralOne + ephemeralOne, ]); }); @@ -283,7 +283,7 @@ void main() { final List filtered = await deviceManager.findTargetDevices(FakeFlutterProject()); expect(filtered, [ - ephemeralTwo + ephemeralTwo, ]); }); @@ -307,7 +307,7 @@ void main() { final List filtered = await deviceManager.findTargetDevices(FakeFlutterProject()); expect(filtered, [ - nonEphemeralOne + nonEphemeralOne, ]); }); @@ -450,7 +450,7 @@ void main() { final DeviceManager deviceManager = TestDeviceManager( [], deviceDiscoveryOverrides: [ - deviceDiscovery + deviceDiscovery, ], logger: BufferLogger.test(), terminal: Terminal.test(), @@ -476,7 +476,7 @@ void main() { final DeviceManager deviceManager = TestDeviceManager( [], deviceDiscoveryOverrides: [ - deviceDiscovery + deviceDiscovery, ], logger: BufferLogger.test(), terminal: Terminal.test(), diff --git a/packages/flutter_tools/test/general.shard/devtools_launcher_test.dart b/packages/flutter_tools/test/general.shard/devtools_launcher_test.dart index 4b835cc0aa6b2..dfdfc3e639011 100644 --- a/packages/flutter_tools/test/general.shard/devtools_launcher_test.dart +++ b/packages/flutter_tools/test/general.shard/devtools_launcher_test.dart @@ -86,7 +86,7 @@ void main() { 'devtools', '--no-launch-browser', '--vm-uri=localhost:8181/abcdefg', - '--profile-memory=foo' + '--profile-memory=foo', ], stdout: 'Serving DevTools at http://127.0.0.1:9100\n', ), @@ -118,7 +118,7 @@ void main() { '--vm-uri=http://127.0.0.1:1234/abcdefg', ], exception: ProcessException('pub', []), - ) + ), ]), ); diff --git a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart index 16d453af7c4ba..a10344e5c46d8 100644 --- a/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart +++ b/packages/flutter_tools/test/general.shard/drive/drive_service_test.dart @@ -141,7 +141,7 @@ void main() { exitCode: 23, environment: { 'FOO': 'BAR', - 'VM_SERVICE_URL': 'http://127.0.0.1:1234/' // dds forwarded URI + 'VM_SERVICE_URL': 'http://127.0.0.1:1234/', // dds forwarded URI }, ), ]); @@ -166,7 +166,7 @@ void main() { exitCode: 23, environment: { 'FOO': 'BAR', - 'VM_SERVICE_URL': 'http://127.0.0.1:1234/' // dds forwarded URI + 'VM_SERVICE_URL': 'http://127.0.0.1:1234/', // dds forwarded URI }, ), ]); @@ -196,7 +196,7 @@ void main() { exitCode: 23, environment: { 'FOO': 'BAR', - 'VM_SERVICE_URL': 'http://127.0.0.1:1234/' // dds forwarded URI + 'VM_SERVICE_URL': 'http://127.0.0.1:1234/', // dds forwarded URI }, ), ]); @@ -229,7 +229,7 @@ void main() { exitCode: 23, environment: { 'FOO': 'BAR', - 'VM_SERVICE_URL': 'http://127.0.0.1:1234/' // dds forwarded URI + 'VM_SERVICE_URL': 'http://127.0.0.1:1234/', // dds forwarded URI }, ), ]); @@ -259,7 +259,7 @@ void main() { command: ['dart', 'foo.test', '-rexpanded'], exitCode: 11, environment: { - 'VM_SERVICE_URL': 'http://127.0.0.1:63426/1UasC_ihpXY=/' + 'VM_SERVICE_URL': 'http://127.0.0.1:63426/1UasC_ihpXY=/', }, ), ]); @@ -311,13 +311,13 @@ void main() { const FakeVmServiceRequest( method: '_flutter.getSkSLs', args: { - 'viewId': 'a' + 'viewId': 'a', }, jsonResponse: { 'SkSLs': { 'A': 'B', - } - } + }, + }, ), ]); final FakeProcessManager processManager = FakeProcessManager.empty(); @@ -335,10 +335,10 @@ void main() { 'platform': 'android', 'name': 'test', 'engineRevision': 'abcdefghijklmnopqrstuvwxyz', - 'data': {'A': 'B'} + 'data': {'A': 'B'}, }); }, overrides: { - FlutterVersion: () => FakeFlutterVersion() + FlutterVersion: () => FakeFlutterVersion(), }); testWithoutContext('Can connect to existing application and stop it during cleanup', () async { @@ -349,8 +349,8 @@ void main() { method: 'ext.flutter.exit', args: { 'isolateId': '1', - } - ) + }, + ), ]); final FakeProcessManager processManager = FakeProcessManager.empty(); final DriverService driverService = setUpDriverService(processManager: processManager, vmService: fakeVmServiceHost.vmService); @@ -373,8 +373,8 @@ void main() { method: 'ext.flutter.exit', args: { 'isolateId': '1', - } - ) + }, + ), ]); final FakeProcessManager processManager = FakeProcessManager.empty(); final DriverService driverService = setUpDriverService(processManager: processManager, vmService: fakeVmServiceHost.vmService); @@ -397,8 +397,8 @@ void main() { method: 'ext.flutter.exit', args: { 'isolateId': '1', - } - ) + }, + ), ]); final FakeProcessManager processManager = FakeProcessManager.empty(); final DriverService driverService = setUpDriverService(processManager: processManager, vmService: fakeVmServiceHost.vmService); @@ -421,8 +421,8 @@ void main() { method: 'ext.flutter.exit', args: { 'isolateId': '1', - } - ) + }, + ), ]); final FakeProcessManager processManager = FakeProcessManager.empty(); final DriverService driverService = setUpDriverService(processManager: processManager, vmService: fakeVmServiceHost.vmService); diff --git a/packages/flutter_tools/test/general.shard/drive/web_driver_service_test.dart b/packages/flutter_tools/test/general.shard/drive/web_driver_service_test.dart index af6adb2359dbe..dad555c138214 100644 --- a/packages/flutter_tools/test/general.shard/drive/web_driver_service_test.dart +++ b/packages/flutter_tools/test/general.shard/drive/web_driver_service_test.dart @@ -45,15 +45,15 @@ void main() { '--no-default-browser-check', '--no-sandbox', '--no-first-run', - '--headless' + '--headless', ], 'perfLoggingPrefs': { 'traceCategories': 'devtools.timeline,' - 'v8,blink.console,benchmark,blink,' - 'blink.user_timing' - } - } + 'v8,blink.console,benchmark,blink,' + 'blink.user_timing', + }, + }, }; expect(getDesiredCapabilities(Browser.chrome, true), expected); @@ -85,10 +85,10 @@ void main() { 'perfLoggingPrefs': { 'traceCategories': 'devtools.timeline,' - 'v8,blink.console,benchmark,blink,' - 'blink.user_timing' - } - } + 'v8,blink.console,benchmark,blink,' + 'blink.user_timing', + }, + }, }; expect(getDesiredCapabilities(Browser.chrome, false, chromeBinary), expected); @@ -109,10 +109,10 @@ void main() { 'media.gmp-provider.enabled': false, 'network.captive-portal-service.enabled': false, 'security.insecure_field_warning.contextual.enabled': false, - 'test.currentTimeOffsetSeconds': 11491200 + 'test.currentTimeOffsetSeconds': 11491200, }, - 'log': {'level': 'trace'} - } + 'log': {'level': 'trace'}, + }, }; expect(getDesiredCapabilities(Browser.firefox, true), expected); @@ -132,10 +132,10 @@ void main() { 'media.gmp-provider.enabled': false, 'network.captive-portal-service.enabled': false, 'security.insecure_field_warning.contextual.enabled': false, - 'test.currentTimeOffsetSeconds': 11491200 + 'test.currentTimeOffsetSeconds': 11491200, }, - 'log': {'level': 'trace'} - } + 'log': {'level': 'trace'}, + }, }; expect(getDesiredCapabilities(Browser.firefox, false), expected); @@ -162,7 +162,7 @@ void main() { final Map expected = { 'platformName': 'ios', 'browserName': 'safari', - 'safari:useSimulator': true + 'safari:useSimulator': true, }; expect(getDesiredCapabilities(Browser.iosSafari, false), expected); @@ -174,7 +174,7 @@ void main() { 'platformName': 'android', 'goog:chromeOptions': { 'androidPackage': 'com.android.chrome', - 'args': ['--disable-fullscreen'] + 'args': ['--disable-fullscreen'], }, }; diff --git a/packages/flutter_tools/test/general.shard/emulator_test.dart b/packages/flutter_tools/test/general.shard/emulator_test.dart index d8ab35ef4bba3..2dd966e7392a5 100644 --- a/packages/flutter_tools/test/general.shard/emulator_test.dart +++ b/packages/flutter_tools/test/general.shard/emulator_test.dart @@ -170,7 +170,7 @@ void main() { '-d', 'pixel', ], - ) + ), ]), androidSdk: sdk, androidWorkflow: AndroidWorkflow( @@ -207,7 +207,7 @@ void main() { '-d', 'pixel', ], - ) + ), ]), androidSdk: sdk, androidWorkflow: AndroidWorkflow( @@ -245,8 +245,8 @@ void main() { ], exitCode: 1, stderr: "Error: Android Virtual Device 'existing-avd-1' already exists.\n" - 'Use --force if you want to replace it.' - ) + 'Use --force if you want to replace it.', + ), ]), androidSdk: sdk, androidWorkflow: AndroidWorkflow( @@ -288,7 +288,7 @@ void main() { '-d', 'pixel', ], - ) + ), ]), androidSdk: sdk, androidWorkflow: AndroidWorkflow( @@ -323,7 +323,7 @@ void main() { 'open', '-a', '/fake/Xcode.app/Contents/Developer/Applications/Simulator.app', - ]) + ]), ], ); diff --git a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart index b2817aec32aba..b9cb05d25d576 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -1066,11 +1066,11 @@ flutter: expect(flutterManifest.isPlugin, true); final Map validSupportedPlatforms = flutterManifest.validSupportedPlatforms!; - expect(validSupportedPlatforms['ios'], - {'pluginClass': 'SomeClass'}); - expect(validSupportedPlatforms['android'], - {'pluginClass': 'SomeClass', - 'package': 'com.example'}); + expect(validSupportedPlatforms['ios'], {'pluginClass': 'SomeClass'}); + expect(validSupportedPlatforms['android'], { + 'pluginClass': 'SomeClass', + 'package': 'com.example', + }); }); testWithoutContext('FlutterManifest validates a platform section that is a list ' diff --git a/packages/flutter_tools/test/general.shard/flutter_tester_device_test.dart b/packages/flutter_tools/test/general.shard/flutter_tester_device_test.dart index 57965ed2fa6f6..a2adeca2cda21 100644 --- a/packages/flutter_tools/test/general.shard/flutter_tester_device_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_tester_device_test.dart @@ -132,7 +132,7 @@ void main() { '--non-interactive', '--use-test-fonts', '--packages=.dart_tool/package_config.json', - 'example.dill' + 'example.dill', ], environment: { 'FLUTTER_TEST': expectedFlutterTestValue, 'FONTCONFIG_FILE': device.fontConfigManager.fontConfigFile.path, @@ -206,11 +206,11 @@ void main() { '--packages=.dart_tool/package_config.json', '--foo', '--bar', - 'example.dill' + 'example.dill', ], stdout: 'success', stderr: 'failure', - ) + ), ]); device = createDevice(dartEntrypointArgs: ['--foo', '--bar']); }); @@ -245,11 +245,11 @@ void main() { '--non-interactive', '--use-test-fonts', '--packages=.dart_tool/package_config.json', - 'example.dill' + 'example.dill', ], stdout: 'The Dart VM service is listening on http://localhost:1234', stderr: 'failure', - ) + ), ]); device = createDevice(enableObservatory: true); }); diff --git a/packages/flutter_tools/test/general.shard/flutter_validator_test.dart b/packages/flutter_tools/test/general.shard/flutter_validator_test.dart index fa8db110cc471..abb7e95c5c136 100644 --- a/packages/flutter_tools/test/general.shard/flutter_validator_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_validator_test.dart @@ -54,7 +54,7 @@ void main() { const FakeCommand( command: ['Artifact.genSnapshot'], exitCode: 1, - ) + ), ]) ); fileSystem.file(artifacts.getArtifactPath(Artifact.genSnapshot)).createSync(recursive: true); diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_start_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_start_test.dart index a395ab2aa2b7e..f87718c4b5fbe 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_start_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_start_test.dart @@ -267,7 +267,7 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/fuchsia/elf.aotsnapshot', - 'build/fuchsia/app_name.dil' + 'build/fuchsia/app_name.dil', ], ), FakeCommand( @@ -300,7 +300,7 @@ void main() { '--deterministic', '--snapshot_kind=app-aot-elf', '--elf=build/fuchsia/elf.aotsnapshot', - 'build/fuchsia/app_name.dil' + 'build/fuchsia/app_name.dil', ], ), FakeCommand( diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index be5f9b5fdd350..8a4361d171c4a 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart @@ -657,7 +657,7 @@ void main() { jsonResponse: { 'views': [ for (FlutterView view in views) - view.toJson() + view.toJson(), ], }, ), diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_pm_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_pm_test.dart index 26cba71d67655..834e023d50256 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_pm_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_pm_test.dart @@ -55,7 +55,7 @@ void main() { '-l', '[fe80::ec4:7aff:fecc:ea8f%eno2]:43819', '-c', - '2' + '2', ])); await FuchsiaPM().serve('', 'fe80::ec4:7aff:fecc:ea8f%eno2', 43819); diff --git a/packages/flutter_tools/test/general.shard/intellij/intellij_validator_test.dart b/packages/flutter_tools/test/general.shard/intellij/intellij_validator_test.dart index 3792c0474c31f..c8b91054186ba 100644 --- a/packages/flutter_tools/test/general.shard/intellij/intellij_validator_test.dart +++ b/packages/flutter_tools/test/general.shard/intellij/intellij_validator_test.dart @@ -22,7 +22,7 @@ final Platform macPlatform = FakePlatform( ); final Platform linuxPlatform = FakePlatform( environment: { - 'HOME': '/foo/bar' + 'HOME': '/foo/bar', }, ); final Platform windowsPlatform = FakePlatform( @@ -30,7 +30,7 @@ final Platform windowsPlatform = FakePlatform( environment: { 'USERPROFILE': r'C:\Users\foo', 'APPDATA': r'C:\Users\foo\AppData\Roaming', - 'LOCALAPPDATA': r'C:\Users\foo\AppData\Local' + 'LOCALAPPDATA': r'C:\Users\foo\AppData\Local', }, ); @@ -49,7 +49,7 @@ void main() { ValidationMessage.error('Flutter plugin version 0.1.3 - the recommended minimum version is 16.0.0'), ValidationMessage('Dart plugin version 162.2485'), ValidationMessage('For information about installing plugins, see\n' - 'https://flutter.dev/intellij-setup/#installing-the-plugins') + 'https://flutter.dev/intellij-setup/#installing-the-plugins'), ]); }); diff --git a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart index ef23d3b6fb140..d22ee5ec214df 100644 --- a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart @@ -174,7 +174,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -228,7 +228,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -279,7 +279,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 1 (1111AAAA11)/OU=3333CCCC33/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -328,7 +328,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -385,7 +385,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 3 (1111AAAA11)/OU=5555EEEE55/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -437,7 +437,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. @@ -494,7 +494,7 @@ void main() { stdin: IOSink(controller.sink), stdout: 'subject= /CN=iPhone Developer: Profile 3 (3333CCCC33)/OU=4444DDDD44/O=My Team/C=US', completer: completer, - ) + ), ]); // Verify that certificate value is passed into openssl command. diff --git a/packages/flutter_tools/test/general.shard/ios/devices_test.dart b/packages/flutter_tools/test/general.shard/ios/devices_test.dart index 9a892ef64d31c..c7964f13fe571 100644 --- a/packages/flutter_tools/test/general.shard/ios/devices_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/devices_test.dart @@ -436,7 +436,7 @@ void main() { expect(xcdevice.deviceEventController.hasListener, isTrue); xcdevice.deviceEventController.add({ - XCDeviceEvent.attach: 'd83d5bc53967baa0ee18626ba87b6254b2ab5418' + XCDeviceEvent.attach: 'd83d5bc53967baa0ee18626ba87b6254b2ab5418', }); await added.future; expect(iosDevices.deviceNotifier!.items.length, 2); @@ -444,7 +444,7 @@ void main() { expect(iosDevices.deviceNotifier!.items, contains(device2)); xcdevice.deviceEventController.add({ - XCDeviceEvent.detach: 'd83d5bc53967baa0ee18626ba87b6254b2ab5418' + XCDeviceEvent.detach: 'd83d5bc53967baa0ee18626ba87b6254b2ab5418', }); await removed.future; expect(iosDevices.deviceNotifier!.items, [device2]); @@ -452,7 +452,7 @@ void main() { // Remove stream will throw over-completion if called more than once // which proves this is ignored. xcdevice.deviceEventController.add({ - XCDeviceEvent.detach: 'bogus' + XCDeviceEvent.detach: 'bogus', }); expect(addedCount, 2); diff --git a/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart index b313e690f74c5..76dce321ccea7 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart @@ -114,7 +114,7 @@ void main () { 'Log on attach2', '', '', - 'Log after process stop' + 'Log after process stop', ])); expect(stdin.stream.transform(const Utf8Decoder()), emitsInOrder([ 'thread backtrace all', @@ -409,7 +409,7 @@ process continue '--uninstall_only', '--bundle_id', bundleId, - ]) + ]), ]); final IOSDeploy iosDeploy = setUpIOSDeploy(processManager, artifacts: artifacts); final int exitCode = await iosDeploy.uninstallApp( @@ -432,7 +432,7 @@ process continue '--uninstall_only', '--bundle_id', bundleId, - ], exitCode: 1) + ], exitCode: 1), ]); final IOSDeploy iosDeploy = setUpIOSDeploy(processManager, artifacts: artifacts); final int exitCode = await iosDeploy.uninstallApp( @@ -452,7 +452,7 @@ IOSDeploy setUpIOSDeploy(ProcessManager processManager, { final FakePlatform macPlatform = FakePlatform( operatingSystem: 'macos', environment: { - 'PATH': '/usr/local/bin:/usr/bin' + 'PATH': '/usr/local/bin:/usr/bin', } ); final Cache cache = Cache.test( diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_install_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_install_test.dart index 846ccde0a2c62..4a69d1763afe5 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_install_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_install_test.dart @@ -47,17 +47,20 @@ void main() { applicationPackage: bundleDirectory, ); final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--bundle', - '/', - '--no-wifi', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--bundle', + '/', + '--no-wifi', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + ), ]); final IOSDevice device = setUpIOSDevice( processManager: processManager, @@ -78,16 +81,19 @@ void main() { applicationPackage: bundleDirectory, ); final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--bundle', - '/', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--bundle', + '/', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + ), ]); final IOSDevice device = setUpIOSDevice( processManager: processManager, @@ -108,17 +114,20 @@ void main() { applicationPackage: bundleDirectory, ); final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--uninstall_only', - '--bundle_id', - 'app', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--uninstall_only', + '--bundle_id', + 'app', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + ), ]); final IOSDevice device = setUpIOSDevice(processManager: processManager, artifacts: artifacts); final bool wasUninstalled = await device.uninstallApp(iosApp); @@ -163,19 +172,22 @@ void main() { applicationPackage: bundleDirectory, ); final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--exists', - '--timeout', - '10', - '--bundle_id', - 'app', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--exists', + '--timeout', + '10', + '--bundle_id', + 'app', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + ), ]); final IOSDevice device = setUpIOSDevice(processManager: processManager, artifacts: artifacts); final bool isAppInstalled = await device.isAppInstalled(iosApp); @@ -191,19 +203,23 @@ void main() { applicationPackage: bundleDirectory, ); final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--exists', - '--timeout', - '10', - '--bundle_id', - 'app', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }, exitCode: 255) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--exists', + '--timeout', + '10', + '--bundle_id', + 'app', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + exitCode: 255, + ), ]); final BufferLogger logger = BufferLogger.test(); final IOSDevice device = setUpIOSDevice(processManager: processManager, logger: logger, artifacts: artifacts); @@ -222,20 +238,24 @@ void main() { ); const String stderr = '2020-03-26 17:48:43.484 ios-deploy[21518:5501783] [ !! ] Timed out waiting for device'; final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - iosDeployPath, - '--id', - '1234', - '--exists', - '--timeout', - '10', - '--bundle_id', - 'app', - ], environment: const { - 'PATH': '/usr/bin:null', - ...kDyLdLibEntry, - }, stderr: stderr, - exitCode: 253) + FakeCommand( + command: [ + iosDeployPath, + '--id', + '1234', + '--exists', + '--timeout', + '10', + '--bundle_id', + 'app', + ], + environment: const { + 'PATH': '/usr/bin:null', + ...kDyLdLibEntry, + }, + stderr: stderr, + exitCode: 253, + ), ]); final BufferLogger logger = BufferLogger.test(); final IOSDevice device = setUpIOSDevice(processManager: processManager, logger: logger, artifacts: artifacts); diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart index 61601e93c8379..1ea8d69eee622 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart @@ -231,7 +231,7 @@ Runner(libsystem_asl.dylib)[297] : libMobileGestalt iosDeployDebugger.debuggerAttached = true; final Stream debuggingLogs = Stream.fromIterable([ - 'Message from debugger' + 'Message from debugger', ]); iosDeployDebugger.logLines = debuggingLogs; logReader.debuggerStream = iosDeployDebugger; diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart index 0acb7ec80ce79..24ec5fbaf1e2c 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart @@ -209,7 +209,7 @@ void main() { const [ '--enable-dart-profiling', '--disable-service-auth-codes', - ].join(' ') + ].join(' '), ]) ); @@ -265,7 +265,7 @@ void main() { const [ '--enable-dart-profiling', '--disable-service-auth-codes', - ].join(' ') + ].join(' '), ]) ); diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart index 0bac487f5abcc..896721306d42b 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart @@ -58,7 +58,7 @@ const FakeCommand kLaunchDebugCommand = FakeCommand(command: [ '--no-wifi', '--justlaunch', '--args', - '--enable-dart-profiling --disable-service-auth-codes --enable-checked-mode --verify-entry-points' + '--enable-dart-profiling --disable-service-auth-codes --enable-checked-mode --verify-entry-points', ], environment: { 'PATH': '/usr/bin:null', 'DYLD_LIBRARY_PATH': '/path/to/libraries', @@ -299,12 +299,13 @@ void main() { '--purge-persistent-cache', '--enable-impeller', ].join(' '), - ], environment: const { - 'PATH': '/usr/bin:null', - 'DYLD_LIBRARY_PATH': '/path/to/libraries', - }, + ], + environment: const { + 'PATH': '/usr/bin:null', + 'DYLD_LIBRARY_PATH': '/path/to/libraries', + }, stdout: '(lldb) run\nsuccess', - ) + ), ]); final IOSDevice device = setUpIOSDevice( sdkVersion: '13.3', diff --git a/packages/flutter_tools/test/general.shard/ios/mac_test.dart b/packages/flutter_tools/test/general.shard/ios/mac_test.dart index 44845eae805f8..bcc4713ee85f3 100644 --- a/packages/flutter_tools/test/general.shard/ios/mac_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/mac_test.dart @@ -388,7 +388,7 @@ Could not build the precompiled application for the device.''', '-d', 'com.apple.FinderInfo', projectDirectory.path, - ]) + ]), ]); await removeFinderExtendedAttributes(projectDirectory, ProcessUtils(processManager: processManager, logger: logger), logger); @@ -397,14 +397,16 @@ Could not build the precompiled application for the device.''', testWithoutContext('ignores errors', () async { final FakeProcessManager processManager = FakeProcessManager.list([ - FakeCommand(command: [ - 'xattr', - '-r', - '-d', - 'com.apple.FinderInfo', - projectDirectory.path, - ], exitCode: 1, - ) + FakeCommand( + command: [ + 'xattr', + '-r', + '-d', + 'com.apple.FinderInfo', + projectDirectory.path, + ], + exitCode: 1, + ), ]); await removeFinderExtendedAttributes(projectDirectory, ProcessUtils(processManager: processManager, logger: logger), logger); diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart index 5f389bc9c63a3..f943ce552973c 100644 --- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart @@ -29,7 +29,7 @@ import '../../src/fakes.dart'; final Platform macosPlatform = FakePlatform( operatingSystem: 'macos', environment: { - 'HOME': '/' + 'HOME': '/', }, ); @@ -604,7 +604,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' 'Multi line message again', ' and it goes...', ' and goes...', - 'Single line message, not the part of the above' + 'Single line message, not the part of the above', ]); expect(fakeProcessManager.hasRemainingExpectations, isFalse); }, overrides: { @@ -670,7 +670,7 @@ Dec 20 17:04:32 md32-11-vm1 Another App[88374]: Ignore this text''' final List lines = await logReader.logLines.toList(); expect(lines, [ 'Single line message', 'Multi line message\n continues...\n continues...', - 'Single line message, not the part of the above' + 'Single line message, not the part of the above', ]); expect(fakeProcessManager.hasRemainingExpectations, isFalse); }, overrides: { diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart index 0eacb84f692d2..52046d48d8795 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart @@ -364,7 +364,7 @@ void main() { testUsingContext('xcodebuild build settings contains Flutter Xcode environment variables', () async { platform.environment = const { 'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual', - 'FLUTTER_XCODE_ARCHS': 'arm64' + 'FLUTTER_XCODE_ARCHS': 'arm64', }; fakeProcessManager.addCommands([ kWhichSysctlCommand, @@ -382,7 +382,7 @@ void main() { '-showBuildSettings', 'BUILD_DIR=${fileSystem.path.absolute('build', 'ios')}', 'CODE_SIGN_STYLE=Manual', - 'ARCHS=arm64' + 'ARCHS=arm64', ], ), ]); @@ -398,7 +398,7 @@ void main() { testWithoutContext('xcodebuild clean contains Flutter Xcode environment variables', () async { platform.environment = const { 'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual', - 'FLUTTER_XCODE_ARCHS': 'arm64' + 'FLUTTER_XCODE_ARCHS': 'arm64', }; fakeProcessManager.addCommands(const [ @@ -415,7 +415,7 @@ void main() { '-quiet', 'clean', 'CODE_SIGN_STYLE=Manual', - 'ARCHS=arm64' + 'ARCHS=arm64', ], ), ]); @@ -669,7 +669,7 @@ Information about project "Runner": 'Ignored': 'Bogus', 'FLUTTER_NOT_XCODE': 'Bogus', 'FLUTTER_XCODE_CODE_SIGN_STYLE': 'Manual', - 'FLUTTER_XCODE_ARCHS': 'arm64' + 'FLUTTER_XCODE_ARCHS': 'arm64', }; final List environmentVariablesAsBuildSettings = environmentVariablesAsXcodeBuildSettings(platform); expect(environmentVariablesAsBuildSettings, ['CODE_SIGN_STYLE=Manual', 'ARCHS=arm64']); diff --git a/packages/flutter_tools/test/general.shard/license_collector_test.dart b/packages/flutter_tools/test/general.shard/license_collector_test.dart index 8ba90228ecd2f..5bc1a3419e59e 100644 --- a/packages/flutter_tools/test/general.shard/license_collector_test.dart +++ b/packages/flutter_tools/test/general.shard/license_collector_test.dart @@ -271,19 +271,19 @@ void main() { 'name': 'foo', 'rootUri': 'file:///foo/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, { 'name': 'bar', 'rootUri': 'file:///bar/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, { 'name': 'fizz', 'rootUri': 'file:///fizz/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, ], } @@ -306,7 +306,7 @@ void main() { expect(filePaths, unorderedEquals([ '/foo/NOTICES', '/bar/NOTICES', - '/fizz/LICENSE' + '/fizz/LICENSE', ])); }); @@ -329,13 +329,13 @@ void main() { 'name': 'foo', 'rootUri': 'file:///foo/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, { 'name': 'bar', 'rootUri': 'file:///bar/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, ], } @@ -376,7 +376,7 @@ void main() { 'name': 'foo', 'rootUri': 'file:///foo/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, ], } @@ -391,7 +391,7 @@ void main() { expect(licenseResult.dependencies, isEmpty); expect(licenseResult.errorMessages, [ 'package foo specified an additional license at /foo.txt, but this file does not exist.', - 'package foo specified an additional license at /foo_2.txt, but this file does not exist.' + 'package foo specified an additional license at /foo_2.txt, but this file does not exist.', ]); }); @@ -412,7 +412,7 @@ void main() { 'name': 'foo', 'rootUri': 'file:///foo/', 'packageUri': 'lib/', - 'languageVersion': '2.2' + 'languageVersion': '2.2', }, ], } diff --git a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart index fba1bc5fda40d..abc5ee704f7af 100644 --- a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart @@ -61,7 +61,7 @@ void main() { stdout: 'Hello World\n', stderr: 'Goodnight, Moon\n', completer: completer, - ) + ), ]), logger: BufferLogger.test(), operatingSystemUtils: FakeOperatingSystemUtils(), diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index 9eeadf7dea580..521795cbc2d22 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -476,7 +476,7 @@ dependencies: 'plugin_d', 'plugin_a', '/local_plugins/plugin_c', - '/local_plugins/plugin_b' + '/local_plugins/plugin_b', ]); iosProject.testExists = true; @@ -530,7 +530,7 @@ dependencies: 'native_build': true, 'dependencies': [ 'plugin-b', - 'plugin-c' + 'plugin-c', ], }, { @@ -538,7 +538,7 @@ dependencies: 'path': '${pluginB.path}/', 'native_build': true, 'dependencies': [ - 'plugin-c' + 'plugin-c', ], }, { @@ -560,18 +560,18 @@ dependencies: 'name': 'plugin-a', 'dependencies': [ 'plugin-b', - 'plugin-c' - ] + 'plugin-c', + ], }, { 'name': 'plugin-b', 'dependencies': [ - 'plugin-c' - ] + 'plugin-c', + ], }, { 'name': 'plugin-c', - 'dependencies': [] + 'dependencies': [], }, ]; @@ -592,7 +592,7 @@ dependencies: FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), SystemClock: () => systemClock, - FlutterVersion: () => flutterVersion + FlutterVersion: () => flutterVersion, }); testUsingContext( @@ -637,7 +637,7 @@ dependencies: FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), SystemClock: () => systemClock, - FlutterVersion: () => flutterVersion + FlutterVersion: () => flutterVersion, }); testUsingContext('Changes to the plugin list invalidates the Cocoapod lockfiles', () async { @@ -654,7 +654,7 @@ dependencies: FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), SystemClock: () => systemClock, - FlutterVersion: () => flutterVersion + FlutterVersion: () => flutterVersion, }); testUsingContext('No changes to the plugin list does not invalidate the Cocoapod lockfiles', () async { @@ -677,7 +677,7 @@ dependencies: FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), SystemClock: () => systemClock, - FlutterVersion: () => flutterVersion + FlutterVersion: () => flutterVersion, }); }); @@ -1291,7 +1291,7 @@ flutter: 'plugin_d', 'plugin_a', '/local_plugins/plugin_c', - '/local_plugins/plugin_b' + '/local_plugins/plugin_b', ]); await injectPlugins(flutterProject, linuxPlatform: true); @@ -1376,7 +1376,7 @@ flutter: 'plugin_d', 'plugin_a', '/local_plugins/plugin_c', - '/local_plugins/plugin_b' + '/local_plugins/plugin_b', ]); await injectPlugins(flutterProject, windowsPlatform: true); @@ -1583,21 +1583,21 @@ flutter: '''; _createPubspecFile(pluginYaml); validatePubspecForPlugin(projectDir: projectDir.absolute.path, pluginClass: 'SomePlugin', expectedPlatforms: [ - 'ios', 'macos', 'windows', 'linux', 'android', 'web' + 'ios', 'macos', 'windows', 'linux', 'android', 'web', ], androidIdentifier: 'AndroidPackage', webFileName: 'lib/SomeFile.dart'); }); testUsingContext('createPlatformsYamlMap should create the correct map', () async { final YamlMap map = Plugin.createPlatformsYamlMap(['ios', 'android', 'linux'], 'PluginClass', 'some.android.package'); expect(map['ios'], { - 'pluginClass' : 'PluginClass' + 'pluginClass' : 'PluginClass', }); expect(map['android'], { 'pluginClass' : 'PluginClass', 'package': 'some.android.package', }); expect(map['linux'], { - 'pluginClass' : 'PluginClass' + 'pluginClass' : 'PluginClass', }); }); diff --git a/packages/flutter_tools/test/general.shard/preview_device_test.dart b/packages/flutter_tools/test/general.shard/preview_device_test.dart index ff6e9f34736f7..440d6e29856b7 100644 --- a/packages/flutter_tools/test/general.shard/preview_device_test.dart +++ b/packages/flutter_tools/test/general.shard/preview_device_test.dart @@ -59,11 +59,11 @@ void main() { processManager: FakeProcessManager.list([ FakeCommand( command: const [ - '/.tmp_rand0/flutter_preview.rand0/splash' + '/.tmp_rand0/flutter_preview.rand0/splash', ], stdout: 'The Dart VM service is listening on http://127.0.0.1:64494/fZ_B2N6JRwY=/\n', completer: completer, - ) + ), ]), logger: logger, platform: FakePlatform(), diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart index 12dbd9a298703..66478c729a592 100644 --- a/packages/flutter_tools/test/general.shard/project_test.dart +++ b/packages/flutter_tools/test/general.shard/project_test.dart @@ -571,14 +571,14 @@ apply plugin: 'kotlin-android' }, overrides: { FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), - XcodeProjectInterpreter: () => mockXcodeProjectInterpreter + XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, }); testUsingContext('app product name xcodebuild settings', () async { final FlutterProject project = await someProject(); project.ios.xcodeProject.createSync(); mockXcodeProjectInterpreter.buildSettings = { - 'FULL_PRODUCT_NAME': 'My App.app' + 'FULL_PRODUCT_NAME': 'My App.app', }; mockXcodeProjectInterpreter.xcodeProjectInfo = XcodeProjectInfo([], [], ['Runner'], logger); @@ -586,7 +586,7 @@ apply plugin: 'kotlin-android' }, overrides: { FileSystem: () => fs, ProcessManager: () => FakeProcessManager.any(), - XcodeProjectInterpreter: () => mockXcodeProjectInterpreter + XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, }); }); @@ -888,7 +888,7 @@ void _testInMemory(String description, Future Function() testMethod) { 'name': 'flutter_template_images', 'rootUri': dummyTemplateImagesDirectory.uri.toString(), 'packageUri': 'lib/', - 'languageVersion': '2.6' + 'languageVersion': '2.6', }, ], })); diff --git a/packages/flutter_tools/test/general.shard/resident_devtools_handler_test.dart b/packages/flutter_tools/test/general.shard/resident_devtools_handler_test.dart index 9e11593f00cca..95c90749117b6 100644 --- a/packages/flutter_tools/test/general.shard/resident_devtools_handler_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_devtools_handler_test.dart @@ -70,7 +70,7 @@ final FakeVmServiceRequest listViews = FakeVmServiceRequest( FlutterView( id: 'a', uiIsolate: isolate, - ).toJson() + ).toJson(), ], }, ); diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index 3204ff58b458f..092476d222406 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -587,7 +587,7 @@ void main() { args: { 'isolateId': '1', 'pause': false, - 'rootLibUri': 'main.dart.incremental.dill' + 'rootLibUri': 'main.dart.incremental.dill', }, jsonResponse: { 'type': 'ReloadReport', @@ -647,15 +647,15 @@ void main() { args: { 'isolateId': '1', 'pause': false, - 'rootLibUri': 'main.dart.incremental.dill' + 'rootLibUri': 'main.dart.incremental.dill', }, jsonResponse: { 'type': 'ReloadReport', 'success': false, 'notices': [ { - 'message': 'Failed to hot reload' - } + 'message': 'Failed to hot reload', + }, ], 'details': {}, }, @@ -711,7 +711,7 @@ void main() { args: { 'isolateId': '1', 'pause': false, - 'rootLibUri': 'main.dart.incremental.dill' + 'rootLibUri': 'main.dart.incremental.dill', }, jsonResponse: { 'type': 'ReloadReport', @@ -883,7 +883,7 @@ void main() { timestamp: 0, kind: vm_service.EventKind.kIsolateRunnable, ) - ) + ), ]); final Completer futureConnectionInfo = Completer.sync(); final Completer futureAppStart = Completer.sync(); @@ -962,8 +962,8 @@ void main() { event: vm_service.Event( timestamp: 0, kind: vm_service.EventKind.kIsolateRunnable, - ) - ) + ), + ), ]); final Completer futureConnectionInfo = Completer.sync(); final Completer futureAppStart = Completer.sync(); @@ -1084,7 +1084,7 @@ void main() { timestamp: 0, kind: vm_service.EventKind.kIsolateRunnable, ), - ) + ), ]); final Completer futureConnectionInfo = Completer.sync(); final Completer futureAppStart = Completer.sync(); @@ -1404,7 +1404,7 @@ flutter: commandHelp.hWithDetails, commandHelp.c, commandHelp.q, - '' + '', ].join('\n') )); })); @@ -1437,7 +1437,7 @@ flutter: commandHelp.hWithoutDetails, commandHelp.c, commandHelp.q, - '' + '', ].join('\n') )); })); @@ -1451,7 +1451,7 @@ flutter: 'viewId': fakeFlutterView.id, }, jsonResponse: { - 'SkSLs': {} + 'SkSLs': {}, } ), ]); @@ -1472,9 +1472,9 @@ flutter: jsonResponse: { 'SkSLs': { 'A': 'B', - } - } - ) + }, + }, + ), ]); await residentRunner.writeSkSL(); @@ -1484,7 +1484,7 @@ flutter: 'platform': 'android', 'name': 'FakeDevice', 'engineRevision': 'abcdefg', - 'data': {'A': 'B'} + 'data': {'A': 'B'}, }); expect(fakeVmServiceHost.hasRemainingExpectations, false); }, overrides: { @@ -1492,7 +1492,7 @@ flutter: fileSystem: globals.fs, platform: globals.platform, ), - FlutterVersion: () => FakeFlutterVersion(engineRevision: 'abcdefg') + FlutterVersion: () => FakeFlutterVersion(engineRevision: 'abcdefg'), })); testUsingContext('ResidentRunner ignores DevtoolsLauncher when attaching with enableDevTools: false - cold mode', () => testbed.run(() async { @@ -1868,7 +1868,7 @@ flutter: Artifacts: () => Artifacts.test(), FileSystem: () => MemoryFileSystem.test(), ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isSingleWidgetReloadEnabled: true) + FeatureFlags: () => TestFeatureFlags(isSingleWidgetReloadEnabled: true), }); testUsingContext('FlutterDevice passes alternative-invalidation-strategy flag', () async { diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart index 87a9fd14a2897..0bf8dcdebbf92 100644 --- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart @@ -55,14 +55,14 @@ const List kAttachLogExpectations = args: { 'streamId': 'Stderr', }, - ) + ), ]; const List kAttachIsolateExpectations = [ FakeVmServiceRequest( method: 'streamListen', args: { - 'streamId': 'Isolate' + 'streamId': 'Isolate', } ), FakeVmServiceRequest( @@ -732,8 +732,8 @@ void main() { method: 'hotRestart', jsonResponse: { 'type': 'Failed', - } - ) + }, + ), ]); _setupMocks(); final Completer connectionInfoCompleter = Completer(); diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart index c3dcd006bdeb3..7522d37fbb255 100644 --- a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart @@ -415,7 +415,7 @@ void main() { subForSigTerm: signalUnderTest, exitSignals: [signalUnderTest], ), - Usage: () => usage + Usage: () => usage, }); }); diff --git a/packages/flutter_tools/test/general.shard/runner/runner_test.dart b/packages/flutter_tools/test/general.shard/runner/runner_test.dart index 12177b2a17755..cef421e083192 100644 --- a/packages/flutter_tools/test/general.shard/runner/runner_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/runner_test.dart @@ -98,7 +98,7 @@ void main() { ProcessManager: () => FakeProcessManager.any(), Usage: () => CrashingUsage(), Artifacts: () => Artifacts.test(), - HttpClientFactory: () => () => FakeHttpClient.any() + HttpClientFactory: () => () => FakeHttpClient.any(), }); // This Completer completes when CrashingFlutterCommand.runCommand @@ -141,7 +141,7 @@ void main() { ProcessManager: () => FakeProcessManager.any(), CrashReporter: () => WaitingCrashReporter(commandCompleter.future), Artifacts: () => Artifacts.test(), - HttpClientFactory: () => () => FakeHttpClient.any() + HttpClientFactory: () => () => FakeHttpClient.any(), }); testUsingContext('create local report', () async { @@ -211,7 +211,7 @@ void main() { UserMessages: () => CustomBugInstructions(), Artifacts: () => Artifacts.test(), CrashReporter: () => WaitingCrashReporter(Future.value()), - HttpClientFactory: () => () => FakeHttpClient.any() + HttpClientFactory: () => () => FakeHttpClient.any(), }); }); } diff --git a/packages/flutter_tools/test/general.shard/terminal_handler_test.dart b/packages/flutter_tools/test/general.shard/terminal_handler_test.dart index bc86f07a01e5d..b821ec8ab43f0 100644 --- a/packages/flutter_tools/test/general.shard/terminal_handler_test.dart +++ b/packages/flutter_tools/test/general.shard/terminal_handler_test.dart @@ -148,17 +148,17 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'enabled': 'false' + 'enabled': 'false', }, ), const FakeVmServiceRequest( method: 'ext.flutter.profileWidgetBuilds', args: { 'isolateId': '1', - 'enabled': 'true' + 'enabled': 'true', }, jsonResponse: { - 'enabled': 'true' + 'enabled': 'true', }, ), ]); @@ -175,17 +175,17 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'enabled': 'false' + 'enabled': 'false', }, ), const FakeVmServiceRequest( method: 'ext.flutter.profileWidgetBuilds', args: { 'isolateId': '1', - 'enabled': 'true' + 'enabled': 'true', }, jsonResponse: { - 'enabled': 'true' + 'enabled': 'true', }, ), ], web: true); @@ -420,7 +420,7 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'value': 'iOS' + 'value': 'iOS', }, ), listViews, @@ -431,7 +431,7 @@ void main() { 'value': 'fuchsia', }, jsonResponse: { - 'value': 'fuchsia' + 'value': 'fuchsia', }, ), // Request 2. @@ -442,7 +442,7 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'value': 'android' + 'value': 'android', }, ), listViews, @@ -453,7 +453,7 @@ void main() { 'value': 'iOS', }, jsonResponse: { - 'value': 'iOS' + 'value': 'iOS', }, ), ]); @@ -474,7 +474,7 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'value': 'iOS' + 'value': 'iOS', }, ), listViews, @@ -485,7 +485,7 @@ void main() { 'value': 'fuchsia', }, jsonResponse: { - 'value': 'fuchsia' + 'value': 'fuchsia', }, ), // Request 2. @@ -496,7 +496,7 @@ void main() { 'isolateId': '1', }, jsonResponse: { - 'value': 'android' + 'value': 'android', }, ), listViews, @@ -507,7 +507,7 @@ void main() { 'value': 'iOS', }, jsonResponse: { - 'value': 'iOS' + 'value': 'iOS', }, ), ], web: true); @@ -971,7 +971,7 @@ void main() { 'isolateId': fakeUnpausedIsolate.id, 'enabled': 'true', }, - ) + ), ], logger: logger, supportsScreenshot: true); await terminalHandler.processTerminalInput('s'); @@ -1004,7 +1004,7 @@ void main() { 'isolateId': fakeUnpausedIsolate.id, 'enabled': 'true', }, - ) + ), ], logger: logger, fileSystem: fileSystem); await terminalHandler.processTerminalInput('s'); @@ -1038,7 +1038,7 @@ void main() { 'isolateId': fakeUnpausedIsolate.id, 'enabled': 'true', }, - ) + ), ], logger: logger, web: true, fileSystem: fileSystem); await terminalHandler.processTerminalInput('s'); diff --git a/packages/flutter_tools/test/general.shard/tracing_test.dart b/packages/flutter_tools/test/general.shard/tracing_test.dart index a3bf74aae0e50..966d979bc015e 100644 --- a/packages/flutter_tools/test/general.shard/tracing_test.dart +++ b/packages/flutter_tools/test/general.shard/tracing_test.dart @@ -71,7 +71,7 @@ final List vmServiceSetup = [ 'isolateId': '1', }, jsonResponse: { - 'enabled': 'true' + 'enabled': 'true', }, ), ]; diff --git a/packages/flutter_tools/test/general.shard/update_packages_test.dart b/packages/flutter_tools/test/general.shard/update_packages_test.dart index 52b7044fa37a4..a6fd150e6b351 100644 --- a/packages/flutter_tools/test/general.shard/update_packages_test.dart +++ b/packages/flutter_tools/test/general.shard/update_packages_test.dart @@ -190,7 +190,7 @@ void main() { 'sky_engine: ', 'gallery: ', 'flutter_test: ', - 'flutter_goldens: ' + 'flutter_goldens: ', })); expect( pubspecYaml.dependencies @@ -202,7 +202,7 @@ void main() { 'typed_data: 1.1.6', 'vector_math: 2.0.8', 'sky_engine: ', - 'gallery: ' + 'gallery: ', })); }); } diff --git a/packages/flutter_tools/test/general.shard/vmservice_test.dart b/packages/flutter_tools/test/general.shard/vmservice_test.dart index d391a8e8b03dd..3d1cda85d9a77 100644 --- a/packages/flutter_tools/test/general.shard/vmservice_test.dart +++ b/packages/flutter_tools/test/general.shard/vmservice_test.dart @@ -254,7 +254,7 @@ void main() { containsPair('viewId', 'abc'), containsPair('assetDirectory', '/abc'), containsPair('isolateId', 'def'), - ])) + ])), ])); }); @@ -276,7 +276,7 @@ void main() { containsPair('method', kGetSkSLsMethod), containsPair('params', allOf([ containsPair('viewId', 'abc'), - ])) + ])), ])); }); @@ -298,7 +298,7 @@ void main() { containsPair('method', kFlushUIThreadTasksMethod), containsPair('params', allOf([ containsPair('isolateId', 'def'), - ])) + ])), ])); }); @@ -306,7 +306,7 @@ void main() { final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost( requests: [ const FakeVmServiceRequest(method: 'streamListen', args: { - 'streamId': 'Isolate' + 'streamId': 'Isolate', }), const FakeVmServiceRequest(method: kRunInViewMethod, args: { 'viewId': '1234', @@ -337,7 +337,7 @@ void main() { const FakeVmServiceRequest( method: 'ext.flutter.debugDumpSemanticsTreeInTraversalOrder', args: { - 'isolateId': '1' + 'isolateId': '1', }, errorCode: RPCErrorCodes.kMethodNotFound, ), @@ -356,7 +356,7 @@ void main() { const FakeVmServiceRequest( method: 'ext.flutter.debugDumpSemanticsTreeInInverseHitTestOrder', args: { - 'isolateId': '1' + 'isolateId': '1', }, errorCode: RPCErrorCodes.kMethodNotFound, ), @@ -375,7 +375,7 @@ void main() { const FakeVmServiceRequest( method: 'ext.flutter.debugDumpLayerTree', args: { - 'isolateId': '1' + 'isolateId': '1', }, errorCode: RPCErrorCodes.kMethodNotFound, ), @@ -394,7 +394,7 @@ void main() { const FakeVmServiceRequest( method: 'ext.flutter.debugDumpRenderTree', args: { - 'isolateId': '1' + 'isolateId': '1', }, errorCode: RPCErrorCodes.kMethodNotFound, ), @@ -413,7 +413,7 @@ void main() { const FakeVmServiceRequest( method: 'ext.flutter.debugDumpApp', args: { - 'isolateId': '1' + 'isolateId': '1', }, errorCode: RPCErrorCodes.kMethodNotFound, ), @@ -523,7 +523,7 @@ void main() { { 'layer_unique_id':1512, 'duration_micros':477, - 'snapshot':'' + 'snapshot':'', }, ], }; diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart index cc0f158caecc7..ec9c38ab55b8a 100644 --- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart @@ -45,7 +45,7 @@ void main() { setUpAll(() async { packages = PackageConfig([ - Package('flutter_tools', Uri.file('/flutter_tools/lib/').normalizePath()) + Package('flutter_tools', Uri.file('/flutter_tools/lib/').normalizePath()), ]); }); @@ -110,17 +110,21 @@ void main() { // Missing ending offset. final File manifestMissingOffset = globals.fs.file('manifestA') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0], - 'sourcemap': [0], - 'metadata': [0], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0], + 'sourcemap': [0], + 'metadata': [0], + }, + })); final File manifestOutOfBounds = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0, 100], - 'sourcemap': [0], - 'metadata': [0], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0, 100], + 'sourcemap': [0], + 'metadata': [0], + }, + })); expect(webAssetServer.write(source, manifestMissingOffset, sourcemap, metadata), isEmpty); expect(webAssetServer.write(source, manifestOutOfBounds, sourcemap, metadata), isEmpty); @@ -134,11 +138,13 @@ void main() { final File metadata = globals.fs.file('metadata') ..writeAsStringSync('{}'); final File manifest = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, 2], - 'metadata': [0, 2], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, 2], + 'metadata': [0, 2], + }, + })); webAssetServer.write(source, manifest, sourcemap, metadata); final Response response = await webAssetServer @@ -147,7 +153,7 @@ void main() { expect(response.headers, allOf([ containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'application/javascript'), - containsPair(HttpHeaders.etagHeader, isNotNull) + containsPair(HttpHeaders.etagHeader, isNotNull), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); }, overrides: { @@ -163,11 +169,13 @@ void main() { final File metadata = globals.fs.file('metadata') ..writeAsStringSync(metadataContents); final File manifest = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, sourcemap.lengthSync()], - 'metadata': [0, metadata.lengthSync()], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, sourcemap.lengthSync()], + 'metadata': [0, metadata.lengthSync()], + }, + })); webAssetServer.write(source, manifest, sourcemap, metadata); final String merged = await webAssetServer.metadataContents('main_module.ddc_merged_metadata'); @@ -195,7 +203,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'image/png'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); })); @@ -219,7 +227,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'image/png'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); })); @@ -357,7 +365,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, '9'), containsPair(HttpHeaders.contentTypeHeader, 'application/javascript'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, utf8.encode('main() {}')); })); @@ -371,7 +379,7 @@ void main() { final Response cachedResponse = await webAssetServer .handleRequest(Request('GET', Uri.parse('http://foobar/foo.js'), headers: { - HttpHeaders.ifNoneMatchHeader: etag + HttpHeaders.ifNoneMatchHeader: etag, })); expect(cachedResponse.statusCode, HttpStatus.notModified); @@ -450,11 +458,13 @@ void main() { final File metadata = globals.fs.file('metadata') ..writeAsStringSync('{}'); final File manifest = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/foo.dart.lib.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, 2], - 'metadata': [0, 2], - }})); + ..writeAsStringSync(json.encode({ + '/foo.dart.lib.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, 2], + 'metadata': [0, 2], + }, + })); webAssetServer.write(source, manifest, sourcemap, metadata); final Response response = await webAssetServer @@ -471,11 +481,13 @@ void main() { final File metadata = globals.fs.file('metadata') ..writeAsStringSync('{}'); final File manifest = globals.fs.file('manifest') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, 2], - 'metadata': [0, 2], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, 2], + 'metadata': [0, 2], + }, + })); webAssetServer.write(source, manifest, sourcemap, metadata); final Response response = await webAssetServer .handleRequest(Request('GET', Uri.parse('http://localhost/foo.js'))); @@ -484,7 +496,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'application/javascript'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); }, overrides: { @@ -502,7 +514,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'image/png'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); })); @@ -517,7 +529,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'image/png'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); })); @@ -533,7 +545,7 @@ void main() { containsPair(HttpHeaders.contentLengthHeader, source.lengthSync().toString()), containsPair(HttpHeaders.contentTypeHeader, 'image/png'), containsPair(HttpHeaders.etagHeader, isNotNull), - containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate') + containsPair(HttpHeaders.cacheControlHeader, 'max-age=0, must-revalidate'), ])); expect((await response.read().toList()).first, source.readAsBytesSync()); }, overrides: { diff --git a/packages/flutter_tools/test/general.shard/web/devices_test.dart b/packages/flutter_tools/test/general.shard/web/devices_test.dart index 6f618b07c1b8a..79ce303d92aa9 100644 --- a/packages/flutter_tools/test/general.shard/web/devices_test.dart +++ b/packages/flutter_tools/test/general.shard/web/devices_test.dart @@ -197,8 +197,8 @@ void main() { kLinuxExecutable, '--version', ], - stdout: 'ABC' - ) + stdout: 'ABC', + ), ]); final WebDevices webDevices = WebDevices( featureFlags: TestFeatureFlags(isWebEnabled: true), @@ -243,7 +243,7 @@ void main() { 'version', ], stdout: r'HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon\ version REG_SZ 74.0.0 A', - ) + ), ]); final WebDevices webDevices = WebDevices( featureFlags: TestFeatureFlags(isWebEnabled: true), diff --git a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart index e1e5069c8736f..b5913c8723535 100644 --- a/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart +++ b/packages/flutter_tools/test/general.shard/web/golden_comparator_test.dart @@ -45,7 +45,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse)}\n', environment: const { @@ -79,7 +79,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse)}\n', )); @@ -112,7 +112,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse1)}\n${jsonEncode(expectedResponse2)}\n', )); @@ -148,7 +148,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse1)}\n', )); processManager.addCommand(FakeCommand( @@ -157,7 +157,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse2)}\n', )); @@ -191,7 +191,7 @@ void main() { '--disable-observatory', '--non-interactive', '--packages=.dart_tool/package_config.json', - 'compiler_output' + 'compiler_output', ], stdout: '${jsonEncode(expectedResponse)}\n', stdin: stdin, )); diff --git a/packages/flutter_tools/test/general.shard/web/memory_fs_test.dart b/packages/flutter_tools/test/general.shard/web/memory_fs_test.dart index 0a44755c50469..1626ed4bd156d 100644 --- a/packages/flutter_tools/test/general.shard/web/memory_fs_test.dart +++ b/packages/flutter_tools/test/general.shard/web/memory_fs_test.dart @@ -20,11 +20,13 @@ void main() { final File metadata = fileSystem.file('metadata') ..writeAsStringSync('{}'); final File manifest = fileSystem.file('manifest') - ..writeAsStringSync(json.encode({'/foo.js': { - 'code': [0, source.lengthSync()], - 'sourcemap': [0, 2], - 'metadata': [0, 2], - }})); + ..writeAsStringSync(json.encode({ + '/foo.js': { + 'code': [0, source.lengthSync()], + 'sourcemap': [0, 2], + 'metadata': [0, 2], + }, + })); final WebMemoryFS webMemoryFS = WebMemoryFS(); webMemoryFS.write(source, manifest, sourcemap, metadata); diff --git a/packages/flutter_tools/test/general.shard/web/web_asset_server_test.dart b/packages/flutter_tools/test/general.shard/web/web_asset_server_test.dart index 38764b78b70c0..97fb1dd63759f 100644 --- a/packages/flutter_tools/test/general.shard/web/web_asset_server_test.dart +++ b/packages/flutter_tools/test/general.shard/web/web_asset_server_test.dart @@ -23,7 +23,7 @@ const List kTransparentImage = [ final Platform platform = FakePlatform( environment: { - 'HOME': '/' + 'HOME': '/', }, ); diff --git a/packages/flutter_tools/test/general.shard/windows/plugins_test.dart b/packages/flutter_tools/test/general.shard/windows/plugins_test.dart index 45702779037ad..78497d60b2282 100644 --- a/packages/flutter_tools/test/general.shard/windows/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/plugins_test.dart @@ -48,7 +48,8 @@ void main() { name: 'test', pluginClass: 'Foo', variants: {PluginPlatformVariant.win32}, - )}, + ), + }, dependencies: [], isDirectDependency: true, ), diff --git a/packages/flutter_tools/test/integration.shard/analyze_once_test.dart b/packages/flutter_tools/test/integration.shard/analyze_once_test.dart index 7418a848a742a..21c2c67743bb7 100644 --- a/packages/flutter_tools/test/integration.shard/analyze_once_test.dart +++ b/packages/flutter_tools/test/integration.shard/analyze_once_test.dart @@ -119,7 +119,7 @@ void main() { 'Analyzing error.dart', "error $analyzerSeparator Target of URI doesn't exist", "error $analyzerSeparator Expected to find ';'", - 'error $analyzerSeparator Unterminated string literal' + 'error $analyzerSeparator Unterminated string literal', ], exitMessageContains: '3 issues found', exitCode: 1 @@ -133,7 +133,7 @@ void main() { 'Analyzing 2 items', "error $analyzerSeparator Target of URI doesn't exist", "error $analyzerSeparator Expected to find ';'", - 'error $analyzerSeparator Unterminated string literal' + 'error $analyzerSeparator Unterminated string literal', ], exitMessageContains: '3 issues found', exitCode: 1 diff --git a/packages/flutter_tools/test/integration.shard/analyze_size_test.dart b/packages/flutter_tools/test/integration.shard/analyze_size_test.dart index 949bf6fe30803..c6b08fa22dc51 100644 --- a/packages/flutter_tools/test/integration.shard/analyze_size_test.dart +++ b/packages/flutter_tools/test/integration.shard/analyze_size_test.dart @@ -26,7 +26,7 @@ void main() { 'build', 'apk', '--analyze-size', - '--target-platform=android-arm64' + '--target-platform=android-arm64', ], workingDirectory: workingDirectory); printOnFailure('Output of flutter build apk:'); @@ -165,7 +165,7 @@ void main() { 'apk', '--analyze-size', '--target-platform=android-arm64', - '--split-debug-info=infos' + '--split-debug-info=infos', ], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world')); expect(result.stderr.toString(), contains('"--analyze-size" cannot be combined with "--split-debug-info"')); diff --git a/packages/flutter_tools/test/integration.shard/debug_adapter/test_adapter_test.dart b/packages/flutter_tools/test/integration.shard/debug_adapter/test_adapter_test.dart index f1827a7778720..b3c2fe67dd6c5 100644 --- a/packages/flutter_tools/test/integration.shard/debug_adapter/test_adapter_test.dart +++ b/packages/flutter_tools/test/integration.shard/debug_adapter/test_adapter_test.dart @@ -50,7 +50,7 @@ void main() { output, [ startsWith('Connecting to VM Service at'), - ..._testsProjectExpectedOutput + ..._testsProjectExpectedOutput, ], allowExtras: true, // Allow for printed call stack etc. ); diff --git a/packages/flutter_tools/test/integration.shard/deferred_components_test.dart b/packages/flutter_tools/test/integration.shard/deferred_components_test.dart index 359059ba9d7e8..dc3fb5517a144 100644 --- a/packages/flutter_tools/test/integration.shard/deferred_components_test.dart +++ b/packages/flutter_tools/test/integration.shard/deferred_components_test.dart @@ -35,7 +35,7 @@ void main() { ...getLocalEngineArguments(), 'build', 'appbundle', - '--target-platform=android-arm64' + '--target-platform=android-arm64', ], workingDirectory: tempDir.path); expect(result.exitCode, 0); @@ -113,7 +113,7 @@ void main() { ...getLocalEngineArguments(), 'build', 'appbundle', - '--no-deferred-components' + '--no-deferred-components', ], workingDirectory: tempDir.path); expect(result.stdout.toString().contains('app-release.aab'), true); diff --git a/packages/flutter_tools/test/integration.shard/downgrade_upgrade_integration_test.dart b/packages/flutter_tools/test/integration.shard/downgrade_upgrade_integration_test.dart index 07497676fdc3c..395a117653400 100644 --- a/packages/flutter_tools/test/integration.shard/downgrade_upgrade_integration_test.dart +++ b/packages/flutter_tools/test/integration.shard/downgrade_upgrade_integration_test.dart @@ -86,7 +86,7 @@ void main() { flutterBin, 'upgrade', '--verbose', - '--working-directory=${testDirectory.path}' + '--working-directory=${testDirectory.path}', ], workingDirectory: testDirectory.path, trace: true); expect(exitCode, 0); @@ -107,7 +107,7 @@ void main() { flutterBin, 'downgrade', '--no-prompt', - '--working-directory=${testDirectory.path}' + '--working-directory=${testDirectory.path}', ], workingDirectory: testDirectory.path, trace: true); expect(exitCode, 0); diff --git a/packages/flutter_tools/test/integration.shard/test_data/deferred_components_project.dart b/packages/flutter_tools/test/integration.shard/test_data/deferred_components_project.dart index ea8af435671ac..27040a4115511 100644 --- a/packages/flutter_tools/test/integration.shard/test_data/deferred_components_project.dart +++ b/packages/flutter_tools/test/integration.shard/test_data/deferred_components_project.dart @@ -477,7 +477,7 @@ class BasicDeferredComponentsConfig extends DeferredComponentsConfig { 0xe5, 0x87, 0x64, 0x4d, 0x36, 0x12, 0x40, 0xc4, 0x67, 0x78, 0xce, 0x38, 0x60, 0x24, 0xdf, 0x3c, 0xc0, 0xbb, 0xf7, 0x7d, 0x2f, 0x66, 0x56, 0xfb, 0xfa, 0x75, 0x2a, 0xe5, 0x23, 0x7a, 0xad, 0x5c, 0xef, 0x2d, 0xa1, 0xb6, 0x7c, 0xbd, 0xfa, 0xb3, 0xdc, 0x68, 0x55, 0xd1, 0xa0, 0xac, 0x8c, 0x06, - 0x62, 0x21, 0xe9, 0x7d, 0x64, 0xd0, 0x60, 0xb3, 0x12, 0x2e, 0x6a, 0x50, 0xf4 + 0x62, 0x21, 0xe9, 0x7d, 0x64, 0xd0, 0x60, 0xb3, 0x12, 0x2e, 0x6a, 0x50, 0xf4, ]; @override diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart index 71ebbc27a200f..9ae3dc115a840 100644 --- a/packages/flutter_tools/test/integration.shard/test_driver.dart +++ b/packages/flutter_tools/test/integration.shard/test_driver.dart @@ -520,7 +520,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { ...[ 'chrome', '--web-run-headless', - if (!expressionEvaluation) '--no-web-enable-expression-evaluation' + if (!expressionEvaluation) '--no-web-enable-expression-evaluation', ] else 'flutter-tester', diff --git a/packages/flutter_tools/test/integration.shard/test_test.dart b/packages/flutter_tools/test/integration.shard/test_test.dart index c8aef8f09df4a..778b2171211e7 100644 --- a/packages/flutter_tools/test/integration.shard/test_test.dart +++ b/packages/flutter_tools/test/integration.shard/test_test.dart @@ -37,7 +37,7 @@ void main() { [ flutterBin, 'pub', - 'get' + 'get', ], workingDirectory: flutterTestDirectory ); @@ -45,7 +45,7 @@ void main() { [ flutterBin, 'pub', - 'get' + 'get', ], workingDirectory: missingDependencyDirectory ); diff --git a/packages/flutter_tools/test/src/custom_devices_common.dart b/packages/flutter_tools/test/src/custom_devices_common.dart index 18c2178a23685..4dcb19e5fb391 100644 --- a/packages/flutter_tools/test/src/custom_devices_common.dart +++ b/packages/flutter_tools/test/src/custom_devices_common.dart @@ -18,7 +18,7 @@ void writeCustomDevicesConfigFile( { 'custom-devices': configs != null ? configs.map((CustomDeviceConfig c) => c.toJson()).toList() : - json + json, }, )); } @@ -58,5 +58,5 @@ const Map testConfigJson = { 'uninstall': ['testuninstall'], 'runDebug': ['testrundebug'], 'forwardPort': ['testforwardport'], - 'forwardPortSuccessRegex': 'testforwardportsuccess' + 'forwardPortSuccessRegex': 'testforwardportsuccess', }; diff --git a/packages/flutter_tools/test/src/fake_devices.dart b/packages/flutter_tools/test/src/fake_devices.dart index ffa74fadc742f..7109d998a5fa4 100644 --- a/packages/flutter_tools/test/src/fake_devices.dart +++ b/packages/flutter_tools/test/src/fake_devices.dart @@ -28,8 +28,8 @@ List fakeDevices = [ 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, - 'startPaused': true - } + 'startPaused': true, + }, } ), FakeDeviceJsonData( @@ -50,9 +50,9 @@ List fakeDevices = [ 'fastStart': false, 'flutterExit': true, 'hardwareRendering': true, - 'startPaused': true - } - } + 'startPaused': true, + }, + }, ), ]; diff --git a/packages/flutter_tools/test/src/fake_vm_services.dart b/packages/flutter_tools/test/src/fake_vm_services.dart index 7a40580daf35d..f90bc3cd58e03 100644 --- a/packages/flutter_tools/test/src/fake_vm_services.dart +++ b/packages/flutter_tools/test/src/fake_vm_services.dart @@ -53,7 +53,7 @@ class FakeVmServiceHost { 'error': { 'code': fakeRequest.errorCode, 'message': 'error', - } + }, })); } _applyStreamListen(); diff --git a/packages/flutter_tools/test/src/fakes.dart b/packages/flutter_tools/test/src/fakes.dart index 230c0302c7d2a..0233240c1f788 100644 --- a/packages/flutter_tools/test/src/fakes.dart +++ b/packages/flutter_tools/test/src/fakes.dart @@ -22,7 +22,7 @@ class FakeDyldEnvironmentArtifact extends ArtifactSet { FakeDyldEnvironmentArtifact() : super(DevelopmentArtifact.iOS); @override Map get environment => { - 'DYLD_LIBRARY_PATH': '/path/to/libraries' + 'DYLD_LIBRARY_PATH': '/path/to/libraries', }; @override diff --git a/packages/flutter_tools/test/web.shard/chrome_test.dart b/packages/flutter_tools/test/web.shard/chrome_test.dart index 56225b365b62a..12d498d650379 100644 --- a/packages/flutter_tools/test/web.shard/chrome_test.dart +++ b/packages/flutter_tools/test/web.shard/chrome_test.dart @@ -214,7 +214,7 @@ void main() { 'example_url', ], stderr: kDevtoolsStderr, - ) + ), ]); await expectReturnsNormallyLater( @@ -253,7 +253,7 @@ void main() { 'example_url', ], stderr: kDevtoolsStderr, - ) + ), ]); await expectReturnsNormallyLater( diff --git a/packages/flutter_tools/test/web.shard/vm_service_web_test.dart b/packages/flutter_tools/test/web.shard/vm_service_web_test.dart index a0f5bd7a01ddf..6c81d04bcacf5 100644 --- a/packages/flutter_tools/test/web.shard/vm_service_web_test.dart +++ b/packages/flutter_tools/test/web.shard/vm_service_web_test.dart @@ -60,8 +60,8 @@ void main() { await Future.wait(>[ validateFlutterVersion(client1), - validateFlutterVersion(client2)] - ); + validateFlutterVersion(client2), + ]); }, skip: true); // https://github.com/flutter/flutter/issues/99003 }); diff --git a/packages/flutter_tools/tool/daemon_client.dart b/packages/flutter_tools/tool/daemon_client.dart index 8e31d7f155263..bb9ebefc05ac2 100644 --- a/packages/flutter_tools/tool/daemon_client.dart +++ b/packages/flutter_tools/tool/daemon_client.dart @@ -73,7 +73,7 @@ Future main() async { 'params': { 'emulatorId': words[1], if (words.contains('coldBoot')) - 'coldBoot': true + 'coldBoot': true, }, }); } else if (line == 'enable') { diff --git a/packages/fuchsia_remote_debug_protocol/test/src/common/network_test.dart b/packages/fuchsia_remote_debug_protocol/test/src/common/network_test.dart index cd250280dfa51..46477c57c2bbf 100644 --- a/packages/fuchsia_remote_debug_protocol/test/src/common/network_test.dart +++ b/packages/fuchsia_remote_debug_protocol/test/src/common/network_test.dart @@ -8,8 +8,11 @@ import '../../common.dart'; void main() { final List ipv4Addresses = ['127.0.0.1', '8.8.8.8']; - final List ipv6Addresses = ['::1', - 'fe80::8eae:4cff:fef4:9247', 'fe80::8eae:4cff:fef4:9247%e0']; + final List ipv6Addresses = [ + '::1', + 'fe80::8eae:4cff:fef4:9247', + 'fe80::8eae:4cff:fef4:9247%e0', + ]; group('test validation', () { test('isIpV4Address', () { diff --git a/packages/integration_test/lib/common.dart b/packages/integration_test/lib/common.dart index 67a61c3f22f54..6e0f818bae729 100644 --- a/packages/integration_test/lib/common.dart +++ b/packages/integration_test/lib/common.dart @@ -65,7 +65,7 @@ class Response { String toJson() => json.encode({ 'result': allTestsPassed.toString(), 'failureDetails': _failureDetailsAsString(), - if (data != null) 'data': data + if (data != null) 'data': data, }); /// Deserializes the result from JSON. diff --git a/packages/integration_test/lib/integration_test.dart b/packages/integration_test/lib/integration_test.dart index 157ea497e886e..d4fe3a3309055 100644 --- a/packages/integration_test/lib/integration_test.dart +++ b/packages/integration_test/lib/integration_test.dart @@ -60,7 +60,7 @@ class IntegrationTestWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding return MapEntry(name, result.details); } return MapEntry(name, result); - }) + }), }, ); } on MissingPluginException { diff --git a/packages/integration_test/test/binding_fail_test.dart b/packages/integration_test/test/binding_fail_test.dart index d293f56cc0625..f28d1f9dd98b4 100644 --- a/packages/integration_test/test/binding_fail_test.dart +++ b/packages/integration_test/test/binding_fail_test.dart @@ -80,7 +80,7 @@ Future?> _runTest(String scriptPath) async { } return >[ if (json != null) - json as Map + json as Map, ]; }) .where((Map testEvent) => testEvent['type'] == 'print') From 4cf60f7659cba379200b7d80ceb45d020dae560e Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Wed, 27 Apr 2022 03:19:05 -0400 Subject: [PATCH 108/108] Roll Engine from fcc15947754b to 189cdc7df7ae (1 revision) (#102623) --- bin/internal/engine.version | 2 +- bin/internal/fuchsia-linux.version | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/internal/engine.version b/bin/internal/engine.version index 88810bbaa4a9f..c47e0a37cbac1 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -fcc15947754bb12321a260908ab8bf5bc445a5f9 +189cdc7df7ae7fbe4786407af33f867b76bf2dc9 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 7099c48b4dcac..83894ac690d5e 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -GPkj69-XiXEkbjYX9L7LD42YJVhQq51Tlt8Fjs3GXtsC +iisykXnbM-9g3DFfH6SEX7v1HeT9dckHjjgxXMogGR0C