From 6e66f064f8ed2d6fa60f33a5db3f8b3e12c5471f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 11:20:05 -0400 Subject: [PATCH 01/29] Roll Flutter Engine from 29fe33348b9e to 7db434b2087d (1 revision) (#109862) --- 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 100cb3e82b100..992babdd7a781 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -29fe33348b9e39282fa5e06beeee797253084d9f +7db434b2087d09689eb3ce6a3a46fbb06e9b0879 From 5aad12cab1e9c0863ea5fbc9a770b2734d7772db Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 19 Aug 2022 09:16:41 -0700 Subject: [PATCH 02/29] Generate syntax for plugin registration that works both with and without null safety. (#109480) --- .../lib/src/flutter_plugins.dart | 1 + .../web_plugin_registrant_test.dart | 143 +++++++++++++++--- 2 files changed, 120 insertions(+), 24 deletions(-) diff --git a/packages/flutter_tools/lib/src/flutter_plugins.dart b/packages/flutter_tools/lib/src/flutter_plugins.dart index aaa7e2ef9d0a4..e350ab3cb9be1 100644 --- a/packages/flutter_tools/lib/src/flutter_plugins.dart +++ b/packages/flutter_tools/lib/src/flutter_plugins.dart @@ -567,6 +567,7 @@ const String _dartPluginRegistryTemplate = ''' // Generated file. Do not edit. // +// @dart = 2.13 // ignore_for_file: type=lint {{#methodChannelPlugins}} diff --git a/packages/flutter_tools/test/integration.shard/web_plugin_registrant_test.dart b/packages/flutter_tools/test/integration.shard/web_plugin_registrant_test.dart index 314c69baf145d..b79701b141c86 100644 --- a/packages/flutter_tools/test/integration.shard/web_plugin_registrant_test.dart +++ b/packages/flutter_tools/test/integration.shard/web_plugin_registrant_test.dart @@ -44,8 +44,8 @@ void main() { testUsingContext('generated plugin registrant passes analysis', () async { await _createProject(projectDir, []); // We need a dependency so the plugin registrant is not completely empty. - await _addDependency(projectDir, 'shared_preferences', - version: '^2.0.0'); + await _editPubspecFile(projectDir, _addDependencyEditor('shared_preferences', + version: '^2.0.0')); // The plugin registrant is created on build... await _buildWebProject(projectDir); @@ -62,6 +62,7 @@ void main() { // Ensure the contents match what we expect for a non-empty plugin registrant. final String contents = registrant.readAsStringSync(); + expect(contents, contains('// @dart = 2.13')); expect(contents, contains("import 'package:shared_preferences_web/shared_preferences_web.dart';")); expect(contents, contains('void registerPlugins([final Registrar? pluginRegistrar]) {')); expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);')); @@ -77,6 +78,54 @@ void main() { ), }); + testUsingContext('generated plugin registrant passes analysis without null safety', () async { + await _createProject(projectDir, []); + // We need a dependency so the plugin registrant is not completely empty. + await _editPubspecFile(projectDir, + _composeEditors([ + _addDependencyEditor('shared_preferences', version: '^2.0.0'), + + // This turns null safety off + _setDartSDKVersionEditor('>=2.11.0 <3.0.0'), + ])); + + // The generated main.dart file has a bunch of stuff that is invalid without null safety, so + // replace it with a no-op dummy main file. We aren't testing it in this scenario anyway. + await _replaceMainFile(projectDir, 'void main() {}'); + + // The plugin registrant is created on build... + await _buildWebProject(projectDir); + + // Find the web_plugin_registrant, now that it lives outside "lib": + final Directory buildDir = projectDir + .childDirectory('.dart_tool/flutter_build') + .listSync() + .firstWhere((FileSystemEntity entity) => entity is Directory) as Directory; + + // Ensure the file exists, and passes analysis. + final File registrant = buildDir.childFile('web_plugin_registrant.dart'); + expect(registrant, exists); + await _analyzeEntity(registrant); + + // Ensure the contents match what we expect for a non-empty plugin registrant. + final String contents = registrant.readAsStringSync(); + expect(contents, contains('// @dart = 2.13')); + expect(contents, contains("import 'package:shared_preferences_web/shared_preferences_web.dart';")); + expect(contents, contains('void registerPlugins([final Registrar? pluginRegistrar]) {')); + expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);')); + expect(contents, contains('registrar.registerMessageHandler();')); + }, overrides: { + Pub: () => Pub( + fileSystem: globals.fs, + logger: globals.logger, + processManager: globals.processManager, + usage: globals.flutterUsage, + botDetector: globals.botDetector, + platform: globals.platform, + ), + }); + + testUsingContext('(no-op) generated plugin registrant passes analysis', () async { await _createProject(projectDir, []); // No dependencies on web plugins this time! @@ -110,8 +159,8 @@ void main() { // See: https://github.com/dart-lang/dart-services/pull/874 testUsingContext('generated plugin registrant for dartpad is created on pub get', () async { await _createProject(projectDir, []); - await _addDependency(projectDir, 'shared_preferences', - version: '^2.0.0'); + await _editPubspecFile(projectDir, + _addDependencyEditor('shared_preferences', version: '^2.0.0')); // The plugin registrant for dartpad is created on flutter pub get. await _doFlutterPubGet(projectDir); @@ -154,10 +203,12 @@ void main() { // With the above lint rule added, we want to ensure that the `generated_plugin_registrant.dart` // file does not fail analysis (this is a regression test - an ignore was // added to cover this case). - await _addDependency( + await _editPubspecFile( projectDir, - 'test_web_plugin_with_a_purposefully_extremely_long_package_name', - path: '../test_plugin', + _addDependencyEditor( + 'test_web_plugin_with_a_purposefully_extremely_long_package_name', + path: '../test_plugin', + ) ); // The plugin registrant is only created after a build... await _buildWebProject(projectDir); @@ -255,32 +306,76 @@ Future _createProject(Directory dir, List createArgs) async { ]); } -Future _addDependency( +typedef PubspecEditor = void Function(List pubSpecContents); + +Future _editPubspecFile( Directory projectDir, - String package, { - String? version, - String? path, -}) async { + PubspecEditor editor, +) async { + final File pubspecYaml = projectDir.childFile('pubspec.yaml'); + expect(pubspecYaml, exists); + + final List lines = await pubspecYaml.readAsLines(); + editor(lines); + await pubspecYaml.writeAsString(lines.join('\n')); +} + +Future _replaceMainFile(Directory projectDir, String fileContents) async { + final File mainFile = projectDir.childDirectory('lib').childFile('main.dart'); + await mainFile.writeAsString(fileContents); +} + +PubspecEditor _addDependencyEditor(String packageToAdd, {String? version, String? path}) { assert(version != null || path != null, 'Need to define a source for the package.'); assert(version == null || path == null, 'Cannot only load a package from path or from Pub, not both.'); + void editor(List lines) { + for (int i = 0; i < lines.length; i++) { + final String line = lines[i]; + if (line.startsWith('dependencies:')) { + lines.insert( + i + 1, + ' $packageToAdd: ${version ?? '\n' + ' path: $path'}'); + break; + } + } + } + return editor; +} - final File pubspecYaml = projectDir.childFile('pubspec.yaml'); - expect(pubspecYaml, exists); +PubspecEditor _setDartSDKVersionEditor(String version) { + void editor(List lines) { + for (int i = 0; i < lines.length; i++) { + final String line = lines[i]; + if (line.startsWith('environment:')) { + for (i++; i < lines.length; i++) { + final String innerLine = lines[i]; + final String sdkLine = " sdk: '$version'"; + if(innerLine.isNotEmpty && !innerLine.startsWith(' ')) { + lines.insert(i, sdkLine); + break; + } + if(innerLine.startsWith(' sdk:')) { + lines[i] = sdkLine; + break; + } + } + break; + } + } + } + return editor; +} - final List lines = await pubspecYaml.readAsLines(); - for (int i = 0; i < lines.length; i++) { - final String line = lines[i]; - if (line.startsWith('dependencies:')) { - lines.insert( - i + 1, - ' $package: ${version ?? '\n' - ' path: $path'}'); - break; +PubspecEditor _composeEditors(Iterable editors) { + void composedEditor(List lines) { + for (final PubspecEditor editor in editors) { + editor(lines); } } - await pubspecYaml.writeAsString(lines.join('\n')); + return composedEditor; } Future _addAnalysisOptions( From b6f7289b187ad032c700ad8541dc2f131a33f2b7 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 19 Aug 2022 12:24:03 -0500 Subject: [PATCH 03/29] Update Ballistic animation & ClampingScrollSimulation (#107735) --- dev/tools/generate_android_spline_data.dart | 61 +++++ .../src/animation/animation_controller.dart | 9 + .../lib/src/widgets/nested_scroll_view.dart | 12 + .../lib/src/widgets/scroll_activity.dart | 32 ++- .../scroll_position_with_single_context.dart | 31 ++- .../lib/src/widgets/scroll_simulation.dart | 209 ++++++++++++++---- .../test/widgets/scroll_activity_test.dart | 114 ++++++++++ .../test/widgets/scroll_simulation_test.dart | 17 ++ .../test/widgets/scrollable_fling_test.dart | 4 +- .../widgets/scrollable_semantics_test.dart | 6 +- .../flutter/test/widgets/scrollable_test.dart | 16 +- .../slivers_appbar_floating_pinned_test.dart | 2 +- 12 files changed, 454 insertions(+), 59 deletions(-) create mode 100644 dev/tools/generate_android_spline_data.dart diff --git a/dev/tools/generate_android_spline_data.dart b/dev/tools/generate_android_spline_data.dart new file mode 100644 index 0000000000000..12e79d5866096 --- /dev/null +++ b/dev/tools/generate_android_spline_data.dart @@ -0,0 +1,61 @@ +// 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. + +const int _nbSamples = 100; +final List _splinePosition = List.filled(_nbSamples + 1, 0.0); +final List _splineTime = List.filled(_nbSamples + 1, 0.0); +const double _startTension = 0.5; +const double _endTension = 1.0; +const double _inflexion = 0.35; + +// Generate the spline data used in ClampingScrollSimulation. +// +// This logic is a translation of the 2-dimensional logic found in +// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/Scroller.java. +// +// The output of this program should be copied over to [_splinePosition] in +// flutter/packages/flutter/lib/src/widgets/scroll_simulation.dart. +void main() { + const double p1 = _startTension * _inflexion; + const double p2 = 1.0 - _endTension * (1.0 - _inflexion); + double xMin = 0.0; + double yMin = 0.0; + for (int i = 0; i < _nbSamples; i++) { + final double alpha = i / _nbSamples; + double xMax = 1.0; + double x, tx, coef; + while (true) { + x = xMin + (xMax - xMin) / 2.0; + coef = 3.0 * x * (1.0 - x); + tx = coef * ((1.0 - x) * p1 + x * p2) + x * x * x; + if ((tx - alpha).abs() < 1e-5) { + break; + } + if (tx > alpha) { + xMax = x; + } else { + xMin = x; + } + } + _splinePosition[i] = coef * ((1.0 - x) * _startTension + x) + x * x * x; + double yMax = 1.0; + double y, dy; + while (true) { + y = yMin + (yMax - yMin) / 2.0; + coef = 3.0 * y * (1.0 - y); + dy = coef * ((1.0 - y) * _startTension + y) + y * y * y; + if ((dy - alpha).abs() < 1e-5) { + break; + } + if (dy > alpha) { + yMax = y; + } else { + yMin = y; + } + } + _splineTime[i] = coef * ((1.0 - y) * p1 + y * p2) + y * y * y; + } + _splinePosition[_nbSamples] = _splineTime[_nbSamples] = 1.0; + print(_splinePosition); +} diff --git a/packages/flutter/lib/src/animation/animation_controller.dart b/packages/flutter/lib/src/animation/animation_controller.dart index da359a0780e23..25b5c04194466 100644 --- a/packages/flutter/lib/src/animation/animation_controller.dart +++ b/packages/flutter/lib/src/animation/animation_controller.dart @@ -757,6 +757,15 @@ class AnimationController extends Animation return result; } + /// Update the simulation without restarting the animation. + /// + /// The current simulation will be replaced with the provided [Simulation]. + /// It is only valid to call this when an animation is currently underway. + void updateSimulation(Simulation simulation) { + assert(isAnimating); + _simulation = simulation; + } + /// Stops running this animation. /// /// This does not trigger any notifications. The animation stops in its diff --git a/packages/flutter/lib/src/widgets/nested_scroll_view.dart b/packages/flutter/lib/src/widgets/nested_scroll_view.dart index 93f302980d721..46f5277a5133f 100644 --- a/packages/flutter/lib/src/widgets/nested_scroll_view.dart +++ b/packages/flutter/lib/src/widgets/nested_scroll_view.dart @@ -686,6 +686,12 @@ class _NestedScrollCoordinator implements ScrollActivityDelegate, ScrollHoldCont ); } + // TODO(Piinks): https://github.com/flutter/flutter/issues/100748 + @override + Simulation? updateBallisticAnimation(double initVelocity, double initPosition) { + return null; + } + ScrollActivity createOuterBallisticScrollActivity(double velocity) { // This function creates a ballistic scroll for the outer scrollable. // @@ -1361,6 +1367,12 @@ class _NestedScrollPosition extends ScrollPosition implements ScrollActivityDele )); } + // TODO(Piinks): see https://github.com/flutter/flutter/issues/100748 + @override + Simulation? updateBallisticAnimation(double initVelocity, double initPosition) { + return null; + } + ScrollActivity createBallisticScrollActivity( Simulation? simulation, { required _NestedBallisticScrollActivityMode mode, diff --git a/packages/flutter/lib/src/widgets/scroll_activity.dart b/packages/flutter/lib/src/widgets/scroll_activity.dart index b8b7b1fbee23b..909eec7b3c456 100644 --- a/packages/flutter/lib/src/widgets/scroll_activity.dart +++ b/packages/flutter/lib/src/widgets/scroll_activity.dart @@ -47,6 +47,16 @@ abstract class ScrollActivityDelegate { /// Terminate the current activity and start a ballistic activity with the /// given velocity. void goBallistic(double velocity); + + /// Update the ballistic animation instead of restarting it, for example as + /// the result of a layout change after a flinging gesture. + /// + /// The [initVelocity] and [initPosition] refer to the starting values of the + /// new ballistic animation. + /// + /// Can return null if the current [ScrollPhysics.createBallisticSimulation] + /// returns null, which will trigger an [IdleScrollActivity] instead. + Simulation? updateBallisticAnimation(double initVelocity, double initPosition); } /// Base class for scrolling activities like dragging and flinging. @@ -524,13 +534,17 @@ class DragScrollActivity extends ScrollActivity { class BallisticScrollActivity extends ScrollActivity { /// Creates an activity that animates a scroll view based on a [simulation]. /// - /// The [delegate], [simulation], and [vsync] arguments must not be null. + /// The [delegate], [simulation], and [vsync] arguments must not be null. The + /// [initVelocity] and [initPosition] arguments allow the ballistic activity + /// to update the simulation instead of restarting it. BallisticScrollActivity( super.delegate, Simulation simulation, TickerProvider vsync, - this.shouldIgnorePointer, - ) { + this.shouldIgnorePointer, { + double initVelocity = 0.0, + double initPosition = 0.0, + }) : _initVelocity = initVelocity, _initPosition = initPosition { _controller = AnimationController.unbounded( debugLabel: kDebugMode ? objectRuntimeType(this, 'BallisticScrollActivity') : null, vsync: vsync, @@ -542,6 +556,10 @@ class BallisticScrollActivity extends ScrollActivity { late AnimationController _controller; + final double _initVelocity; + + final double _initPosition; + @override void resetActivity() { delegate.goBallistic(velocity); @@ -549,7 +567,13 @@ class BallisticScrollActivity extends ScrollActivity { @override void applyNewDimensions() { - delegate.goBallistic(velocity); + final Simulation? newSimulation = delegate.updateBallisticAnimation( + _initVelocity, + _initPosition, + ); + if (newSimulation != null) { + _controller.updateSimulation(newSimulation); + } } void _tick() { diff --git a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart index 66dbdfee881e6..68b838a6c234e 100644 --- a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart +++ b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart @@ -12,6 +12,7 @@ import 'basic.dart'; import 'framework.dart'; import 'scroll_activity.dart'; import 'scroll_context.dart'; +import 'scroll_metrics.dart'; import 'scroll_notification.dart'; import 'scroll_physics.dart'; import 'scroll_position.dart'; @@ -141,12 +142,40 @@ class ScrollPositionWithSingleContext extends ScrollPosition implements ScrollAc assert(hasPixels); final Simulation? simulation = physics.createBallisticSimulation(this, velocity); if (simulation != null) { - beginActivity(BallisticScrollActivity(this, simulation, context.vsync, activity?.shouldIgnorePointer ?? true)); + beginActivity(BallisticScrollActivity( + this, + simulation, + context.vsync, + activity?.shouldIgnorePointer ?? true, + initVelocity: velocity, + initPosition: pixels, + )); } else { goIdle(); } } + @override + Simulation? updateBallisticAnimation(double initVelocity, double initPosition) { + assert(hasPixels); + final FixedScrollMetrics initScrollMetrics = FixedScrollMetrics( + minScrollExtent: minScrollExtent, + maxScrollExtent: maxScrollExtent, + pixels: initPosition, + viewportDimension: viewportDimension, + axisDirection: axisDirection, + ); + final Simulation? simulation = physics.createBallisticSimulation( + initScrollMetrics, + initVelocity, + ); + if (simulation == null) { + goIdle(); + return null; + } + return simulation; + } + @override ScrollDirection get userScrollDirection => _userScrollDirection; ScrollDirection _userScrollDirection = ScrollDirection.idle; diff --git a/packages/flutter/lib/src/widgets/scroll_simulation.dart b/packages/flutter/lib/src/widgets/scroll_simulation.dart index eb12592b79e78..2d54d6ffa3004 100644 --- a/packages/flutter/lib/src/widgets/scroll_simulation.dart +++ b/packages/flutter/lib/src/widgets/scroll_simulation.dart @@ -146,11 +146,13 @@ class ClampingScrollSimulation extends Simulation { required this.velocity, this.friction = 0.015, super.tolerance, - }) : assert(_flingVelocityPenetration(0.0) == _initialVelocityPenetration) { - _duration = _flingDuration(velocity); - _distance = (velocity * _duration / _initialVelocityPenetration).abs(); + }) { + _duration = _splineFlingDuration(velocity); + _distance = _splineFlingDistance(velocity); } + final double _inflexion = 0.35; + /// The position of the particle at the beginning of the simulation. final double position; @@ -163,7 +165,7 @@ class ClampingScrollSimulation extends Simulation { /// The more friction the particle experiences, the sooner it stops. final double friction; - late double _duration; + late int _duration; late double _distance; // See DECELERATION_RATE. @@ -171,59 +173,186 @@ class ClampingScrollSimulation extends Simulation { // See computeDeceleration(). static double _decelerationForFriction(double friction) { - return friction * 61774.04968; + return 9.80665 * + 39.37 * + friction * + 1.0 * // Flutter operates on logical pixels so the DPI should be 1.0. + 160.0; } - // See getSplineFlingDuration(). Returns a value in seconds. - double _flingDuration(double velocity) { - // See mPhysicalCoeff - final double scaledFriction = friction * _decelerationForFriction(0.84); - - // See getSplineDeceleration(). - final double deceleration = math.log(0.35 * velocity.abs() / scaledFriction); - - return math.exp(deceleration / (_kDecelerationRate - 1.0)); + // See getSplineDeceleration(). + double _splineDeceleration(double velocity) { + return math.log(_inflexion * + velocity.abs() / + (friction * _decelerationForFriction(0.84))); } - // Based on a cubic curve fit to the Scroller.computeScrollOffset() values - // produced for an initial velocity of 4000. The value of Scroller.getDuration() - // and Scroller.getFinalY() were 686ms and 961 pixels respectively. - // - // Algebra courtesy of Wolfram Alpha. - // - // f(x) = scrollOffset, x is time in milliseconds - // f(x) = 3.60882×10^-6 x^3 - 0.00668009 x^2 + 4.29427 x - 3.15307 - // f(x) = 3.60882×10^-6 x^3 - 0.00668009 x^2 + 4.29427 x, so f(0) is 0 - // f(686ms) = 961 pixels - // Scale to f(0 <= t <= 1.0), x = t * 686 - // f(t) = 1165.03 t^3 - 3143.62 t^2 + 2945.87 t - // Scale f(t) so that 0.0 <= f(t) <= 1.0 - // f(t) = (1165.03 t^3 - 3143.62 t^2 + 2945.87 t) / 961.0 - // = 1.2 t^3 - 3.27 t^2 + 3.065 t - static const double _initialVelocityPenetration = 3.065; - static double _flingDistancePenetration(double t) { - return (1.2 * t * t * t) - (3.27 * t * t) + (_initialVelocityPenetration * t); + // See getSplineFlingDuration(). + int _splineFlingDuration(double velocity) { + final double deceleration = _splineDeceleration(velocity); + return (1000 * math.exp(deceleration / (_kDecelerationRate - 1.0))).round(); } - // The derivative of the _flingDistancePenetration() function. - static double _flingVelocityPenetration(double t) { - return (3.6 * t * t) - (6.54 * t) + _initialVelocityPenetration; + // See getSplineFlingDistance(). + double _splineFlingDistance(double velocity) { + final double l = _splineDeceleration(velocity); + final double decelMinusOne = _kDecelerationRate - 1.0; + return friction * + _decelerationForFriction(0.84) * + math.exp(_kDecelerationRate / decelMinusOne * l); } @override double x(double time) { - final double t = clampDouble(time / _duration, 0.0, 1.0); - return position + _distance * _flingDistancePenetration(t) * velocity.sign; + if (time == 0) { + return position; + } + final _NBSample sample = _NBSample(time, _duration); + return position + (sample.distanceCoef * _distance) * velocity.sign; } @override double dx(double time) { - final double t = clampDouble(time / _duration, 0.0, 1.0); - return _distance * _flingVelocityPenetration(t) * velocity.sign / _duration; + if (time == 0) { + return velocity; + } + final _NBSample sample = _NBSample(time, _duration); + return sample.velocityCoef * _distance / _duration * velocity.sign * 1000.0; } @override bool isDone(double time) { - return time >= _duration; + return time * 1000.0 >= _duration; } } + +class _NBSample { + _NBSample(double time, int duration) { + // See computeScrollOffset(). + final double t = time * 1000.0 / duration; + final int index = (_nbSamples * t).clamp(0, _nbSamples).round(); // ignore_clamp_double_lint + _distanceCoef = 1.0; + _velocityCoef = 0.0; + if (index < _nbSamples) { + final double tInf = index / _nbSamples; + final double tSup = (index + 1) / _nbSamples; + final double dInf = _splinePosition[index]; + final double dSup = _splinePosition[index + 1]; + _velocityCoef = (dSup - dInf) / (tSup - tInf); + _distanceCoef = dInf + (t - tInf) * _velocityCoef; + } + } + + late double _velocityCoef; + double get velocityCoef => _velocityCoef; + + late double _distanceCoef; + double get distanceCoef => _distanceCoef; + + static const int _nbSamples = 100; + + // Generated from dev/tools/generate_android_spline_data.dart. + static const List _splinePosition = [ + 0.000022888183591973643, + 0.028561000304762274, + 0.05705195792956655, + 0.08538917797618413, + 0.11349556286812107, + 0.14129881694635613, + 0.16877157254923383, + 0.19581093511175632, + 0.22239649722992452, + 0.24843841866631658, + 0.2740024733220569, + 0.298967680744136, + 0.32333234658228116, + 0.34709556909569184, + 0.3702249257894571, + 0.39272483400399893, + 0.41456988647721615, + 0.43582889025419114, + 0.4564192786416, + 0.476410299013587, + 0.4957560715637827, + 0.5145493169954743, + 0.5327205670880077, + 0.5502846891191615, + 0.5673274324802855, + 0.583810881323224, + 0.5997478744397482, + 0.615194045299478, + 0.6301165005270208, + 0.6445484042257972, + 0.6585198219185201, + 0.6720397744233084, + 0.6850997688076114, + 0.6977281404741683, + 0.7099506591298411, + 0.7217749311525871, + 0.7331784038850426, + 0.7442308394229518, + 0.7549087205105974, + 0.7652471277371271, + 0.7752251637549381, + 0.7848768260203478, + 0.7942056937103814, + 0.8032299679689082, + 0.8119428702388629, + 0.8203713516576219, + 0.8285187880808974, + 0.8363794492831295, + 0.8439768562813565, + 0.851322799855549, + 0.8584111051351724, + 0.8652534074722162, + 0.8718525580962131, + 0.8782333271742155, + 0.8843892099362031, + 0.8903155590440985, + 0.8960465359221951, + 0.9015574505919048, + 0.9068736766459904, + 0.9119951682409297, + 0.9169321898723632, + 0.9216747065581234, + 0.9262420604674766, + 0.9306331858366086, + 0.9348476990715433, + 0.9389007110754832, + 0.9427903495057521, + 0.9465220679845756, + 0.9500943036519721, + 0.9535176728088761, + 0.9567898524767604, + 0.959924306623116, + 0.9629127700159108, + 0.9657622101750765, + 0.9684818726275105, + 0.9710676079044347, + 0.9735231939498, + 0.9758514437576309, + 0.9780599066560445, + 0.9801485715370128, + 0.9821149805689633, + 0.9839677526782791, + 0.9857085499421516, + 0.9873347811966005, + 0.9888547171706613, + 0.9902689443512227, + 0.9915771042095881, + 0.9927840651641069, + 0.9938913963715834, + 0.9948987305580712, + 0.9958114963810524, + 0.9966274782266875, + 0.997352148697352, + 0.9979848677523623, + 0.9985285021374979, + 0.9989844084453229, + 0.9993537595844986, + 0.999638729860106, + 0.9998403888004533, + 0.9999602810470701, + 1.0 + ]; +} diff --git a/packages/flutter/test/widgets/scroll_activity_test.dart b/packages/flutter/test/widgets/scroll_activity_test.dart index f6dd3235d0f9e..673e4af274b81 100644 --- a/packages/flutter/test/widgets/scroll_activity_test.dart +++ b/packages/flutter/test/widgets/scroll_activity_test.dart @@ -129,6 +129,64 @@ void main() { expect(find.text('Page 9'), findsOneWidget); }); + List childrenSizeIncrease(int n) { + return List.generate(n, (int i) { + return SizedBox(height: 40.0 + i * 3, child: Text('$i')); + }); + } + + testWidgets('Check for duplicate pixels with ClampingScrollPhysics', (WidgetTester tester) async { + final List scrollSimulationXList = []; + final TestScrollPhysics testScrollPhysics = TestScrollPhysics( + scrollSimulationXList, + parent: const ClampingScrollPhysics(), + ); + await tester.pumpWidget( + MaterialApp( + home: ListView( + physics: testScrollPhysics, + children: childrenSizeIncrease(100), + ), + ), + ); + await tester.fling(find.byType(ListView), const Offset(0.0, -4000.0), 4000.0); + await tester.pumpAndSettle(); + final Set checkSet = {}; + checkSet.addAll(scrollSimulationXList); + /// checkSet.length + 1 is because: + /// simulation.x(0.0) will be called in _startSimulation. + /// The first frame of the animation will also call simulation.x(0.0). + /// It can be tolerated that it has at most one duplicate value. + final bool hasOnlyOneDuplicate = scrollSimulationXList.length == checkSet.length + 1; + expect(true, hasOnlyOneDuplicate); // and ends up at the end + }); + + testWidgets('Check for duplicate pixels with BouncingScrollPhysics', (WidgetTester tester) async { + final List scrollSimulationXList = []; + final TestScrollPhysics testScrollPhysics = TestScrollPhysics( + scrollSimulationXList, + parent: const BouncingScrollPhysics(), + ); + await tester.pumpWidget( + MaterialApp( + home: ListView( + physics: testScrollPhysics, + children: childrenSizeIncrease(100), + ), + ), + ); + await tester.fling(find.byType(ListView), const Offset(0.0, -4000.0), 4000.0); + await tester.pumpAndSettle(); + final Set checkSet = {}; + checkSet.addAll(scrollSimulationXList); + /// checkSet.length + 1 is because: + /// simulation.x(0.0) will be call in _startSimulation. + /// The first frame of the animation will also call simulation.x(0.0). + /// It can be tolerated that it has at most one duplicate value. + final bool noDuplicate = scrollSimulationXList.length == checkSet.length + 1; + expect(true, noDuplicate); // and ends up at the end + }); + testWidgets('Pointer is not ignored during trackpad scrolling.', (WidgetTester tester) async { final ScrollController controller = ScrollController(); int? lastTapped; @@ -210,6 +268,62 @@ void main() { }); } +class TestScrollPhysics extends ScrollPhysics { + const TestScrollPhysics(this.scrollSimulationXList, { super.parent }); + + final List scrollSimulationXList; + + @override + Simulation? createBallisticSimulation( + ScrollMetrics position, + double velocity, + ) { + final Simulation? scrollSimulation = super.createBallisticSimulation( + position, + velocity, + ); + if (scrollSimulation != null && scrollSimulationXList != null) { + return TestScrollScrollSimulation( + scrollSimulation, + scrollSimulationXList, + ); + } + return scrollSimulation; + } + + @override + TestScrollPhysics applyTo(ScrollPhysics? ancestor) { + return TestScrollPhysics( + scrollSimulationXList, + parent: buildParent(ancestor), + ); + } +} + +class TestScrollScrollSimulation extends Simulation { + TestScrollScrollSimulation(this.innerScrollSimulation, + this.scrollSimulationXList,); + + final Simulation innerScrollSimulation; + + final List scrollSimulationXList; + + @override + double dx(double time) => innerScrollSimulation.dx(time); + + @override + bool isDone(double time) => innerScrollSimulation.isDone(time); + + @override + double x(double time) { + final double simulationX = innerScrollSimulation.x(time); + if (scrollSimulationXList != null) { + scrollSimulationXList.add(simulationX); + } + return simulationX; + } +} + class PageView62209 extends StatefulWidget { const PageView62209({super.key}); diff --git a/packages/flutter/test/widgets/scroll_simulation_test.dart b/packages/flutter/test/widgets/scroll_simulation_test.dart index 69958f91e31ec..99738be6e84ae 100644 --- a/packages/flutter/test/widgets/scroll_simulation_test.dart +++ b/packages/flutter/test/widgets/scroll_simulation_test.dart @@ -23,4 +23,21 @@ void main() { checkInitialConditions(75.0, 614.2093); checkInitialConditions(5469.0, 182.114534); }); + + test('ClampingScrollSimulation velocity eventually reaches zero', () { + void checkFinalConditions(double position, double velocity) { + final ClampingScrollSimulation simulation = ClampingScrollSimulation(position: position, velocity: velocity); + expect(simulation.dx(10.0), equals(0.0)); + } + + checkFinalConditions(51.0, 2000.0); + checkFinalConditions(584.0, 2617.294734); + checkFinalConditions(345.0, 1982.785934); + checkFinalConditions(0.0, 1831.366634); + checkFinalConditions(-156.2, 1541.57665); + checkFinalConditions(4.0, 1139.250439); + checkFinalConditions(4534.0, 1073.553798); + checkFinalConditions(75.0, 614.2093); + checkFinalConditions(5469.0, 182.114534); + }); } diff --git a/packages/flutter/test/widgets/scrollable_fling_test.dart b/packages/flutter/test/widgets/scrollable_fling_test.dart index 1d34b11fe0ba2..bb20ccad067d2 100644 --- a/packages/flutter/test/widgets/scrollable_fling_test.dart +++ b/packages/flutter/test/widgets/scrollable_fling_test.dart @@ -48,7 +48,7 @@ void main() { // Before changing these values, ensure the fling results in a distance that // makes sense. See issue for more context. expect(androidResult, greaterThan(394.0)); - expect(androidResult, lessThan(395.0)); + expect(androidResult, lessThan(408.2)); await pumpTest(tester, TargetPlatform.linux); await tester.fling(find.byType(ListView), const Offset(0.0, -dragOffset), 1000.0); @@ -152,6 +152,6 @@ void main() { expect(log, equals(['tap 21'])); await tester.tap(find.byType(Scrollable)); await tester.pump(const Duration(milliseconds: 50)); - expect(log, equals(['tap 21', 'tap 48'])); + expect(log, equals(['tap 21', 'tap 49'])); }); } diff --git a/packages/flutter/test/widgets/scrollable_semantics_test.dart b/packages/flutter/test/widgets/scrollable_semantics_test.dart index 1c8f7ea44dde2..5307fc7a6d73e 100644 --- a/packages/flutter/test/widgets/scrollable_semantics_test.dart +++ b/packages/flutter/test/widgets/scrollable_semantics_test.dart @@ -231,7 +231,7 @@ void main() { expect(semantics, includesNodeWith( scrollExtentMin: 0.0, - scrollPosition: 380.2, + scrollPosition: 394.3, scrollExtentMax: 520.0, actions: [ SemanticsAction.scrollUp, @@ -280,7 +280,7 @@ void main() { expect(semantics, includesNodeWith( scrollExtentMin: 0.0, - scrollPosition: 380.2, + scrollPosition: 394.3, scrollExtentMax: double.infinity, actions: [ SemanticsAction.scrollUp, @@ -292,7 +292,7 @@ void main() { expect(semantics, includesNodeWith( scrollExtentMin: 0.0, - scrollPosition: 760.4, + scrollPosition: 788.6, scrollExtentMax: double.infinity, actions: [ SemanticsAction.scrollUp, diff --git a/packages/flutter/test/widgets/scrollable_test.dart b/packages/flutter/test/widgets/scrollable_test.dart index 6cdea4f8817b1..1a276518c936f 100644 --- a/packages/flutter/test/widgets/scrollable_test.dart +++ b/packages/flutter/test/widgets/scrollable_test.dart @@ -946,8 +946,8 @@ void main() { expect(find.byKey(const ValueKey('Box 0')), findsNothing); expect(find.byKey(const ValueKey('Box 52')), findsOneWidget); - expect(expensiveWidgets, 38); - expect(cheapWidgets, 20); + expect(expensiveWidgets, 40); + expect(cheapWidgets, 21); }); testWidgets('Can recommendDeferredLoadingForContext - override heuristic', (WidgetTester tester) async { @@ -989,9 +989,9 @@ void main() { expect(find.byKey(const ValueKey('Box 0')), findsNothing); expect(find.byKey(const ValueKey('Cheap box 52')), findsOneWidget); - expect(expensiveWidgets, 18); - expect(cheapWidgets, 40); - expect(physics.count, 40 + 18); + expect(expensiveWidgets, 17); + expect(cheapWidgets, 44); + expect(physics.count, 44 + 17); }); testWidgets('Can recommendDeferredLoadingForContext - override heuristic and always return true', (WidgetTester tester) async { @@ -1032,7 +1032,7 @@ void main() { expect(find.byKey(const ValueKey('Cheap box 52')), findsOneWidget); expect(expensiveWidgets, 0); - expect(cheapWidgets, 58); + expect(cheapWidgets, 61); }); testWidgets('ensureVisible does not move PageViews', (WidgetTester tester) async { @@ -1439,9 +1439,9 @@ void main() { await tester.sendEventToBinding(testPointer.hover(tester.getCenter(find.byType(Scrollable)))); await tester.sendEventToBinding(testPointer.scrollInertiaCancel()); // Cancel partway through. await tester.pump(); - expect(getScrollOffset(tester), closeTo(333.2944, 0.0001)); + expect(getScrollOffset(tester), closeTo(342.5439, 0.0001)); await tester.pump(const Duration(milliseconds: 4800)); - expect(getScrollOffset(tester), closeTo(333.2944, 0.0001)); + expect(getScrollOffset(tester), closeTo(342.5439, 0.0001)); }); } diff --git a/packages/flutter/test/widgets/slivers_appbar_floating_pinned_test.dart b/packages/flutter/test/widgets/slivers_appbar_floating_pinned_test.dart index 5306450e898ad..7ce68427447e8 100644 --- a/packages/flutter/test/widgets/slivers_appbar_floating_pinned_test.dart +++ b/packages/flutter/test/widgets/slivers_appbar_floating_pinned_test.dart @@ -151,7 +151,7 @@ void main() { ); expect(semantics, hasSemantics(expectedSemantics, ignoreTransform: true, ignoreId: true, ignoreRect: true)); - await tester.fling(find.text('Tile 2'), const Offset(0, -600), 2000); + await tester.fling(find.text('Tile 2'), const Offset(0, -600), 1950); await tester.pumpAndSettle(); expectedSemantics = TestSemantics.root( From 357755f968fa89f29d9bded4e6d099fddf55a80e Mon Sep 17 00:00:00 2001 From: Gary Qian Date: Fri, 19 Aug 2022 10:46:22 -0700 Subject: [PATCH 04/29] Update ci.yaml tests to Android API 33 (#109820) --- .ci.yaml | 184 +++++++++++++++++++++++++++---------------------------- 1 file changed, 92 insertions(+), 92 deletions(-) diff --git a/.ci.yaml b/.ci.yaml index dd21cb8596d0b..244a29466247a 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -33,7 +33,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "curl", "version": "version:7.64.0"} ] @@ -43,7 +43,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "curl", "version": "version:7.64.0"} ] @@ -53,7 +53,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "curl", "version": "version:7.64.0"} ] @@ -71,7 +71,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"} ] @@ -82,7 +82,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "version:11"} ] os: Mac-12 @@ -124,7 +124,7 @@ platform_properties: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "certs", "version": "version:9563bb"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} @@ -162,7 +162,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "android_virtual_device", "version": "31"} ] tags: > @@ -175,7 +175,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -194,7 +194,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -274,7 +274,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] tags: > ["firebaselab"] @@ -286,7 +286,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] tags: > ["firebaselab"] @@ -298,7 +298,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] tags: > ["firebaselab"] @@ -351,7 +351,7 @@ targets: {"dependency": "cmake", "version": "version:3.16.1"}, {"dependency": "ninja", "version": "version:1.9.0"}, {"dependency": "open_jdk", "version": "11"}, - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] shard: framework_tests subshard: misc @@ -410,7 +410,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -428,7 +428,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -446,7 +446,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -464,7 +464,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -482,7 +482,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -500,7 +500,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -519,7 +519,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"} ] tags: > @@ -537,7 +537,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -556,7 +556,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -575,7 +575,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -613,7 +613,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"} ] tags: > @@ -638,7 +638,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, {"dependency": "open_jdk", "version": "11"}, @@ -662,7 +662,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, {"dependency": "open_jdk", "version": "11"}, @@ -686,7 +686,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, {"dependency": "open_jdk", "version": "11"}, @@ -710,7 +710,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "clang", "version": "git_revision:5d5aba78dbbee75508f01bcaa69aedb2ab79065a"}, {"dependency": "open_jdk", "version": "11"}, @@ -734,7 +734,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -754,7 +754,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -774,7 +774,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"} ] tags: > @@ -787,7 +787,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"} ] tags: > @@ -804,7 +804,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -824,7 +824,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -844,7 +844,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -864,7 +864,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -884,7 +884,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -904,7 +904,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -924,7 +924,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -944,7 +944,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -964,7 +964,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -984,7 +984,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1004,7 +1004,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1024,7 +1024,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1044,7 +1044,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1064,7 +1064,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1083,7 +1083,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1102,7 +1102,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1121,7 +1121,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1140,7 +1140,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1159,7 +1159,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1178,7 +1178,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1197,7 +1197,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} ] @@ -1216,7 +1216,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} @@ -2297,7 +2297,7 @@ targets: {"dependency": "cmake", "version": "version:3.16.1"}, {"dependency": "ninja", "version": "version:1.9.0"}, {"dependency": "open_jdk", "version": "11"}, - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] shard: framework_tests subshard: misc @@ -2356,7 +2356,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2375,7 +2375,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2394,7 +2394,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2413,7 +2413,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2488,7 +2488,7 @@ targets: {"dependency": "xcode", "version": "13f17a"}, {"dependency": "gems", "version": "v3.3.14"}, {"dependency": "open_jdk", "version": "11"}, - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] shard: framework_tests subshard: misc @@ -2538,7 +2538,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] tags: > @@ -2555,7 +2555,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] tags: > @@ -2573,7 +2573,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] tags: > @@ -2591,7 +2591,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] tags: > @@ -2641,7 +2641,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, {"dependency": "gems", "version": "v3.3.14"} @@ -2699,7 +2699,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] tags: > @@ -2756,7 +2756,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2781,7 +2781,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2806,7 +2806,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2831,7 +2831,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "xcode", "version": "13f17a"}, @@ -2856,7 +2856,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -2871,7 +2871,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -2907,7 +2907,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:98.1"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} @@ -3535,7 +3535,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3553,7 +3553,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3571,7 +3571,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3626,7 +3626,7 @@ targets: {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, {"dependency": "vs_build", "version": "version:vs2019"}, {"dependency": "open_jdk", "version": "11"}, - {"dependency": "android_sdk", "version": "version:32v1"} + {"dependency": "android_sdk", "version": "version:33v6"} ] shard: framework_tests subshard: misc @@ -3676,7 +3676,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3707,7 +3707,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3726,7 +3726,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3745,7 +3745,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3777,7 +3777,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3796,7 +3796,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"} ] @@ -3816,7 +3816,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3840,7 +3840,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3864,7 +3864,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3888,7 +3888,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3912,7 +3912,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3936,7 +3936,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"}, @@ -3960,7 +3960,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -3980,7 +3980,7 @@ targets: add_recipes_cq: "true" dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "open_jdk", "version": "11"} ] shard: tool_tests @@ -3999,7 +3999,7 @@ targets: properties: dependencies: >- [ - {"dependency": "android_sdk", "version": "version:32v1"}, + {"dependency": "android_sdk", "version": "version:33v6"}, {"dependency": "chrome_and_driver", "version": "version:96.2"}, {"dependency": "open_jdk", "version": "11"}, {"dependency": "goldctl", "version": "git_revision:3a77d0b12c697a840ca0c7705208e8622dc94603"} From dcdd3e2b09d903714710ceef85371c272a3fcccb Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 13:49:43 -0400 Subject: [PATCH 05/29] Roll Plugins from 4395e3195be7 to cd586d7d6a40 (5 revisions) (#109866) --- 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 ce32eb430f9ab..81aa8990502d8 100644 --- a/bin/internal/flutter_plugins.version +++ b/bin/internal/flutter_plugins.version @@ -1 +1 @@ -4395e3195be7cefc404b4fa9851b6cdbe90e3b2e +cd586d7d6a4082bf5bad6ab49450670844c542f6 From 3b6e3a693836cf0675355eb009a0455d1e237e1c Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 19 Aug 2022 11:06:53 -0700 Subject: [PATCH 06/29] Temporarily remove a bogus warning until fixed by dwds update (#109793) * Temporarily remove a bogus warning until fixed by dwds update * Addressed CR feedback --- packages/flutter_tools/lib/src/isolated/devfs_web.dart | 7 ++++++- .../test/web.shard/expression_evaluation_web_test.dart | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/isolated/devfs_web.dart b/packages/flutter_tools/lib/src/isolated/devfs_web.dart index de02021eff242..172a3f6d1fa5f 100644 --- a/packages/flutter_tools/lib/src/isolated/devfs_web.dart +++ b/packages/flutter_tools/lib/src/isolated/devfs_web.dart @@ -1042,7 +1042,12 @@ 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) { - globals.printWarning('${event.loggerName}: ${event.message}$error'); + // Note: Temporary fix for https://github.com/flutter/flutter/issues/109792 + // TODO(annagrin): Remove the condition after the bogus warning is + // removed in dwds: https://github.com/dart-lang/webdev/issues/1722 + if (!event.message.contains('No module for')) { + globals.printWarning('${event.loggerName}: ${event.message}$error'); + } } else { globals.printTrace('${event.loggerName}: ${event.message}$error'); } diff --git a/packages/flutter_tools/test/web.shard/expression_evaluation_web_test.dart b/packages/flutter_tools/test/web.shard/expression_evaluation_web_test.dart index 3f4564f9f2183..737f5e7d4d883 100644 --- a/packages/flutter_tools/test/web.shard/expression_evaluation_web_test.dart +++ b/packages/flutter_tools/test/web.shard/expression_evaluation_web_test.dart @@ -23,6 +23,7 @@ void main() { flutter = FlutterRunTestDriver(tempDir); flutter.stdout.listen((String line) { expect(line, isNot(contains('Unresolved uri:'))); + expect(line, isNot(contains('No module for'))); }); }); From b7c500fc6bf04e44156722cd053020595d1fbd35 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 19 Aug 2022 11:14:43 -0700 Subject: [PATCH 07/29] Remove passing of --debugger-module-names flag to frontend server (#109791) The flag is true by default so the behavior does not change. Next steps: Use the flag for updated debugger module names: - Frontend server: make the current behavior controlled by the flag non-conditional - Frontend server: add more debugging names changes under the same flag, false by default - Dwds: make changes required for the new module names. - Flutter tools: when matching dwds changes roll to flutter, pass the flag to the frontend server again. - Cleanup: - Frontend server: make new behavior default - Flutter tools: remove uses of the flag. - Frontend server: remove the flag. Towards: https://github.com/dart-lang/webdev/issues/1692 Helps: https://github.com/flutter/flutter/issues/106727 --- packages/flutter_tools/lib/src/compile.dart | 4 ---- .../flutter_tools/lib/src/isolated/resident_web_runner.dart | 2 +- .../test/general.shard/compile_incremental_test.dart | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index d419b88a7d38b..5483ee1e83b76 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -753,10 +753,6 @@ class DefaultResidentCompiler implements ResidentCompiler { if (testCompilation) '--no-print-incremental-dependencies', '--target=$targetModel', - // TODO(zanderso): remove once this becomes the default behavior - // in the frontend_server. - // https://github.com/flutter/flutter/issues/52693 - '--debugger-module-names', // TODO(annagrin): remove once this becomes the default behavior // in the frontend_server. // https://github.com/flutter/flutter/issues/59902 diff --git a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart index ac259be640d73..602eb93d5d52d 100644 --- a/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/isolated/resident_web_runner.dart @@ -521,7 +521,7 @@ class ResidentWebRunner extends ResidentRunner { final Chromium chrome = await _chromiumLauncher!.connectedInstance; final ChromeTab chromeTab = await (chrome.chromeConnection.getTab((ChromeTab chromeTab) { return !chromeTab.url.startsWith('chrome-extension'); - }) as FutureOr); + }, retryFor: const Duration(seconds: 5)) as FutureOr); if (chromeTab == null) { throwToolExit('Failed to connect to Chrome instance.'); } diff --git a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart index 52f1511dabb57..8e20fe9eff62b 100644 --- a/packages/flutter_tools/test/general.shard/compile_incremental_test.dart +++ b/packages/flutter_tools/test/general.shard/compile_incremental_test.dart @@ -36,7 +36,6 @@ void main() { 'sdkroot/', '--incremental', '--target=flutter', - '--debugger-module-names', '--experimental-emit-debug-metadata', '--output-dill', '/build/', From a9750d6a2ef9b8a18678f96fcc7345e425e3c857 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 15:30:42 -0400 Subject: [PATCH 08/29] Roll Flutter Engine from 7db434b2087d to 544c34102586 (1 revision) (#109870) --- 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 992babdd7a781..b699af7f81cae 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -7db434b2087d09689eb3ce6a3a46fbb06e9b0879 +544c34102586e4c8ea77c6b536cb726c3686e810 From b3aba4d9c868aa5a5f8c3a518960f454eca2ba40 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Fri, 19 Aug 2022 12:36:11 -0700 Subject: [PATCH 09/29] Re-Land "Refactor StrokeAlign to allow double values." (#109591) (#109805) --- dev/manual_tests/lib/star_border.dart | 4 +- .../lib/painting/borders/border_side.0.dart | 204 ++++++++++++++++++ .../api/test/painting/border_side.0_test.dart | 21 ++ .../painting/beveled_rectangle_border.dart | 45 +--- .../flutter/lib/src/painting/borders.dart | 112 ++++++---- .../flutter/lib/src/painting/box_border.dart | 94 ++------ .../lib/src/painting/box_decoration.dart | 2 +- .../lib/src/painting/circle_border.dart | 62 +----- .../painting/continuous_rectangle_border.dart | 2 +- .../painting/rounded_rectangle_border.dart | 103 +-------- .../lib/src/painting/stadium_border.dart | 119 +--------- .../flutter/lib/src/painting/star_border.dart | 39 +--- .../material/bottom_sheet_theme_test.dart | 2 +- .../test/material/button_style_test.dart | 4 +- .../test/material/chip_theme_test.dart | 4 +- .../test/material/drawer_theme_test.dart | 2 +- .../floating_action_button_theme_test.dart | 2 +- .../flutter/test/material/list_tile_test.dart | 2 +- .../test/material/list_tile_theme_test.dart | 2 +- .../material/navigation_bar_theme_test.dart | 2 +- .../test/material/popup_menu_theme_test.dart | 2 +- .../test/material/snack_bar_theme_test.dart | 2 +- .../test/material/time_picker_theme_test.dart | 8 +- .../beveled_rectangle_border_test.dart | 4 +- .../test/painting/border_rtl_test.dart | 3 +- .../test/painting/border_side_test.dart | 18 +- .../flutter/test/painting/border_test.dart | 20 +- .../test/painting/box_painter_test.dart | 12 +- .../rounded_rectangle_border_test.dart | 27 ++- .../test/painting/shape_border_test.dart | 72 +++---- .../test/painting/stadium_border_test.dart | 28 +-- .../test/painting/star_border_test.dart | 8 +- 32 files changed, 465 insertions(+), 566 deletions(-) create mode 100644 examples/api/lib/painting/borders/border_side.0.dart create mode 100644 examples/api/test/painting/border_side.0_test.dart diff --git a/dev/manual_tests/lib/star_border.dart b/dev/manual_tests/lib/star_border.dart index 70e8623b30071..7a4e893badbaa 100644 --- a/dev/manual_tests/lib/star_border.dart +++ b/dev/manual_tests/lib/star_border.dart @@ -80,7 +80,7 @@ class _MyHomePageState extends State { color: Colors.blue.shade100, shape: lerpBorder( StarBorder.polygon( - side: const BorderSide(strokeAlign: StrokeAlign.center, width: 2), + side: const BorderSide(strokeAlign: BorderSide.strokeAlignCenter, width: 2), sides: _model.points, pointRounding: _model.pointRounding, rotation: _model.rotation, @@ -102,7 +102,7 @@ class _MyHomePageState extends State { color: Colors.blue.shade100, shape: lerpBorder( StarBorder( - side: const BorderSide(strokeAlign: StrokeAlign.center, width: 2), + side: const BorderSide(strokeAlign: BorderSide.strokeAlignCenter, width: 2), points: _model.points, innerRadiusRatio: _model.innerRadiusRatio, pointRounding: _model.pointRounding, diff --git a/examples/api/lib/painting/borders/border_side.0.dart b/examples/api/lib/painting/borders/border_side.0.dart new file mode 100644 index 0000000000000..95a33e2708d52 --- /dev/null +++ b/examples/api/lib/painting/borders/border_side.0.dart @@ -0,0 +1,204 @@ +// 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. + +/// Flutter code sample for [BorderSide]. + +import 'package:flutter/material.dart'; + +void main() => runApp(const BorderSideApp()); + +class BorderSideApp extends StatelessWidget { + const BorderSideApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp(home: BorderSideExample()); + } +} + +class BorderSideExample extends StatefulWidget { + const BorderSideExample({super.key}); + + @override + State createState() => _BorderSideExampleState(); +} + +class _BorderSideExampleState extends State + with TickerProviderStateMixin { + late final AnimationController animation; + + @override + void initState() { + super.initState(); + animation = + AnimationController(vsync: this, duration: const Duration(seconds: 1)); + animation.repeat(reverse: true); + animation.addListener(_markDirty); + } + + @override + void dispose() { + animation.dispose(); + super.dispose(); + } + + void _markDirty() { + setState(() {}); + } + + static const double borderWidth = 10; + static const double cornerRadius = 10; + static const Color borderColor = Color(0x8000b4fc); + + @override + Widget build(BuildContext context) { + return Material( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TestBox( + shape: StadiumBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TestBox( + shape: CircleBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + TestBox( + shape: OvalBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TestBox( + shape: BeveledRectangleBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + TestBox( + shape: BeveledRectangleBorder( + borderRadius: BorderRadius.circular(cornerRadius), + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TestBox( + shape: RoundedRectangleBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + TestBox( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(cornerRadius), + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TestBox( + shape: StarBorder( + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + TestBox( + shape: StarBorder( + pointRounding: 1, + innerRadiusRatio: 0.5, + points: 8, + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + TestBox( + shape: StarBorder.polygon( + sides: 6, + pointRounding: 0.5, + side: BorderSide( + color: borderColor, + width: borderWidth, + strokeAlign: (animation.value * 2) - 1, + ), + ), + ), + ], + ), + ], + ), + ), + ); + } +} + +class TestBox extends StatelessWidget { + const TestBox({ + super.key, + required this.shape, + }); + + final ShapeBorder shape; + + @override + Widget build(BuildContext context) { + return Container( + width: 100, + height: 50, + decoration: ShapeDecoration( + color: const Color(0xff012677), + shape: shape, + ), + ); + } +} diff --git a/examples/api/test/painting/border_side.0_test.dart b/examples/api/test/painting/border_side.0_test.dart new file mode 100644 index 0000000000000..379641aa29f18 --- /dev/null +++ b/examples/api/test/painting/border_side.0_test.dart @@ -0,0 +1,21 @@ +// 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_api_samples/painting/borders/border_side.0.dart' + as example; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Finds the expected TestBox', (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: example.BorderSideExample(), + ), + ); + + expect(find.byType(example.BorderSideExample), findsOneWidget); + expect(find.byType(example.TestBox), findsNWidgets(10)); + }); +} diff --git a/packages/flutter/lib/src/painting/beveled_rectangle_border.dart b/packages/flutter/lib/src/painting/beveled_rectangle_border.dart index 8e7406c673499..c05801332428f 100644 --- a/packages/flutter/lib/src/painting/beveled_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/beveled_rectangle_border.dart @@ -9,7 +9,6 @@ import 'package:flutter/foundation.dart'; import 'basic_types.dart'; import 'border_radius.dart'; import 'borders.dart'; -import 'edge_insets.dart'; /// A rectangular border with flattened or "beveled" corners. /// @@ -40,18 +39,6 @@ class BeveledRectangleBorder extends OutlinedBorder { /// [getOuterPath]. final BorderRadiusGeometry borderRadius; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) { return BeveledRectangleBorder( @@ -125,21 +112,7 @@ class BeveledRectangleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { - final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect; - break; - } - - return _getPath(adjustedRect); + return _getPath(borderRadius.resolve(textDirection).toRRect(rect).deflate(side.strokeInset)); } @override @@ -156,21 +129,7 @@ class BeveledRectangleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect; - break; - case StrokeAlign.center: - adjustedRect = borderRect.inflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect.inflate(side.width); - break; - } - final Path path = _getPath(adjustedRect) - ..addPath(getInnerPath(rect, textDirection: textDirection), Offset.zero); + final Path path = _getPath(borderRadius.resolve(textDirection).toRRect(rect).inflate(side.strokeOffset / 2)); canvas.drawPath(path, side.toPaint()); break; } diff --git a/packages/flutter/lib/src/painting/borders.dart b/packages/flutter/lib/src/painting/borders.dart index f112465d71ec9..bc8db46033ce4 100644 --- a/packages/flutter/lib/src/painting/borders.dart +++ b/packages/flutter/lib/src/painting/borders.dart @@ -21,27 +21,6 @@ enum BorderStyle { // if you add more, think about how they will lerp } -/// The relative position of the stroke on a [BorderSide] in a [Border] or [OutlinedBorder]. -/// When set to [inside], the stroke is drawn completely inside the widget. -/// For [center] and [outside], a property such as [Container.clipBehavior] -/// can be used in an outside widget to clip it. -/// If [Container.decoration] has a border, the container may incorporate -/// [BorderSide.width] as additional padding: -/// - [inside] provides padding with full [BorderSide.width]. -/// - [center] provides padding with half [BorderSide.width]. -/// - [outside] provides zero padding, as stroke is drawn entirely outside. -enum StrokeAlign { - /// The border is drawn on the inside of the border path. - inside, - - /// The border is drawn on the center of the border path, with half of the - /// [BorderSide.width] on the inside, and the other half on the outside of the path. - center, - - /// The border is drawn on the outside of the border path. - outside, -} - /// A side of a border of a box. /// /// A [Border] consists of four [BorderSide] objects: [Border.top], @@ -79,7 +58,7 @@ enum StrokeAlign { /// ([TableBorder.horizontalInside] and [TableBorder.verticalInside]), both /// of which are also [BorderSide] objects. @immutable -class BorderSide { +class BorderSide with Diagnosticable { /// Creates the side of a border. /// /// By default, the border is 1.0 logical pixels wide and solid black. @@ -87,11 +66,12 @@ class BorderSide { this.color = const Color(0xFF000000), this.width = 1.0, this.style = BorderStyle.solid, - this.strokeAlign = StrokeAlign.inside, + this.strokeAlign = strokeAlignInside, }) : assert(color != null), assert(width != null), assert(width >= 0.0), - assert(style != null); + assert(style != null), + assert(strokeAlign != null); /// Creates a [BorderSide] that represents the addition of the two given /// [BorderSide]s. @@ -124,6 +104,7 @@ class BorderSide { return BorderSide( color: a.color, // == b.color width: a.width + b.width, + strokeAlign: math.max(a.strokeAlign, b.strokeAlign), style: a.style, // == b.style ); } @@ -151,20 +132,50 @@ class BorderSide { /// A hairline black border that is not rendered. static const BorderSide none = BorderSide(width: 0.0, style: BorderStyle.none); - /// The direction of where the border will be drawn relative to the container. - final StrokeAlign strokeAlign; + /// The relative position of the stroke on a [BorderSide] in an + /// [OutlinedBorder] or [Border]. + /// + /// Values typically range from -1.0 ([strokeAlignInside], inside border, + /// default) to 1.0 ([strokeAlignOutside], outside border), without any + /// bound constraints (e.g., a value of -2.0 is is not typical, but allowed). + /// A value of 0 ([strokeAlignCenter]) will center the border on the edge + /// of the widget. + /// + /// When set to [strokeAlignInside], the stroke is drawn completely inside + /// the widget. For [strokeAlignCenter] and [strokeAlignOutside], a property + /// such as [Container.clipBehavior] can be used in an outside widget to clip + /// it. If [Container.decoration] has a border, the container may incorporate + /// [width] as additional padding: + /// - [strokeAlignInside] provides padding with full [width]. + /// - [strokeAlignCenter] provides padding with half [width]. + /// - [strokeAlignOutside] provides zero padding, as stroke is drawn entirely outside. + final double strokeAlign; + + /// The border is drawn fully inside of the border path. + /// + /// This is the default. + static const double strokeAlignInside = -1.0; + + /// The border is drawn on the center of the border path, with half of the + /// [BorderSide.width] on the inside, and the other half on the outside of + /// the path. + static const double strokeAlignCenter = 0.0; + + /// The border is drawn on the outside of the border path. + static const double strokeAlignOutside = 1.0; /// Creates a copy of this border but with the given fields replaced with the new values. BorderSide copyWith({ Color? color, double? width, BorderStyle? style, + double? strokeAlign, }) { - assert(width == null || width >= 0.0); return BorderSide( color: color ?? this.color, width: width ?? this.width, style: style ?? this.style, + strokeAlign: strokeAlign ?? this.strokeAlign, ); } @@ -229,8 +240,7 @@ class BorderSide { return true; } return a.style == b.style - && a.color == b.color - && a.strokeAlign == b.strokeAlign; + && a.color == b.color; } /// Linearly interpolate between two border sides. @@ -278,13 +288,10 @@ class BorderSide { break; } if (a.strokeAlign != b.strokeAlign) { - // When strokeAlign changes, lerp to 0, then from 0 to the target width. - // All StrokeAlign values share a common zero width state. - final StrokeAlign strokeAlign = t > 0.5 ? b.strokeAlign : a.strokeAlign; return BorderSide( color: Color.lerp(colorA, colorB, t)!, - width: t > 0.5 ? ui.lerpDouble(0, b.width, t * 2 - 1)! : ui.lerpDouble(a.width, 0, t * 2)!, - strokeAlign: strokeAlign, + width: width, + strokeAlign: ui.lerpDouble(a.strokeAlign, b.strokeAlign, t)!, ); } return BorderSide( @@ -294,6 +301,26 @@ class BorderSide { ); } + /// Get the amount of the stroke width that lies inside of the [BorderSide]. + /// + /// For example, this will return the [width] for a [strokeAlign] of -1, half + /// the [width] for a [strokeAlign] of 0, and 0 for a [strokeAlign] of 1. + double get strokeInset => width * (1 - (1 + strokeAlign) / 2); + + /// Get the amount of the stroke width that lies outside of the [BorderSide]. + /// + /// For example, this will return 0 for a [strokeAlign] of -1, half the + /// [width] for a [strokeAlign] of 0, and the [width] for a [strokeAlign] + /// of 1. + double get strokeOutset => width * (1 + strokeAlign) / 2; + + /// The offset of the stroke, taking into account the stroke alignment. + /// + /// For example, this will return the negative [width] of the stroke + /// for a [strokeAlign] of -1, 0 for a [strokeAlign] of 0, and the + /// [width] for a [strokeAlign] of -1. + double get strokeOffset => width * strokeAlign; + @override bool operator ==(Object other) { if (identical(this, other)) { @@ -313,11 +340,15 @@ class BorderSide { int get hashCode => Object.hash(color, width, style, strokeAlign); @override - String toString() { - if (strokeAlign == StrokeAlign.inside) { - return '${objectRuntimeType(this, 'BorderSide')}($color, ${width.toStringAsFixed(1)}, $style)'; - } - return '${objectRuntimeType(this, 'BorderSide')}($color, ${width.toStringAsFixed(1)}, $style, $strokeAlign)'; + String toStringShort() => 'BorderSide'; + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('color', color, defaultValue: const Color(0xFF000000))); + properties.add(DoubleProperty('width', width, defaultValue: 1.0)); + properties.add(DoubleProperty('strokeAlign', strokeAlign, defaultValue: strokeAlignInside)); + properties.add(EnumProperty('style', style, defaultValue: BorderStyle.solid)); } } @@ -629,6 +660,9 @@ abstract class OutlinedBorder extends ShapeBorder { /// The value of [side] must not be null. const OutlinedBorder({ this.side = BorderSide.none }) : assert(side != null); + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.all(math.max(side.strokeInset, 0)); + /// The border outline's color and weight. /// /// If [side] is [BorderSide.none], which is the default, an outline is not drawn. diff --git a/packages/flutter/lib/src/painting/box_border.dart b/packages/flutter/lib/src/painting/box_border.dart index bf6fb1d733f99..650bd5d5d8436 100644 --- a/packages/flutter/lib/src/painting/box_border.dart +++ b/packages/flutter/lib/src/painting/box_border.dart @@ -231,62 +231,22 @@ abstract class BoxBorder extends ShapeBorder { ..strokeWidth = 0.0; canvas.drawRRect(borderRadius.toRRect(rect), paint); } else { - if (side.strokeAlign == StrokeAlign.inside) { - final RRect outer = borderRadius.toRRect(rect); - final RRect inner = outer.deflate(width); - canvas.drawDRRect(outer, inner, paint); - } else { - final Rect inner; - final Rect outer; - if (side.strokeAlign == StrokeAlign.center) { - inner = rect.deflate(width / 2); - outer = rect.inflate(width / 2); - } else { - inner = rect; - outer = rect.inflate(width); - } - canvas.drawDRRect(borderRadius.toRRect(outer), borderRadius.toRRect(inner), paint); - } + final RRect borderRect = borderRadius.toRRect(rect); + final RRect inner = borderRect.deflate(side.strokeInset); + final RRect outer = borderRect.inflate(side.strokeOutset); + canvas.drawDRRect(outer, inner, paint); } } static void _paintUniformBorderWithCircle(Canvas canvas, Rect rect, BorderSide side) { assert(side.style != BorderStyle.none); - final double width = side.width; - final Paint paint = side.toPaint(); - final double radius; - switch (side.strokeAlign) { - case StrokeAlign.inside: - radius = (rect.shortestSide - width) / 2.0; - break; - case StrokeAlign.center: - radius = rect.shortestSide / 2.0; - break; - case StrokeAlign.outside: - radius = (rect.shortestSide + width) / 2.0; - break; - } - canvas.drawCircle(rect.center, radius, paint); + final double radius = (rect.shortestSide + side.strokeOffset) / 2; + canvas.drawCircle(rect.center, radius, side.toPaint()); } static void _paintUniformBorderWithRectangle(Canvas canvas, Rect rect, BorderSide side) { assert(side.style != BorderStyle.none); - final double width = side.width; - final Paint paint = side.toPaint(); - final Rect rectToBeDrawn; - switch (side.strokeAlign) { - case StrokeAlign.inside: - rectToBeDrawn = rect.deflate(width / 2.0); - break; - case StrokeAlign.center: - rectToBeDrawn = rect; - break; - case StrokeAlign.outside: - rectToBeDrawn = rect.inflate(width / 2.0); - break; - } - - canvas.drawRect(rectToBeDrawn, paint); + canvas.drawRect(rect.inflate(side.strokeOffset / 2), side.toPaint()); } } @@ -400,7 +360,7 @@ class Border extends BoxBorder { Color color = const Color(0xFF000000), double width = 1.0, BorderStyle style = BorderStyle.solid, - StrokeAlign strokeAlign = StrokeAlign.inside, + double strokeAlign = BorderSide.strokeAlignInside, }) { final BorderSide side = BorderSide(color: color, width: width, style: style, strokeAlign: strokeAlign); return Border.fromBorderSide(side); @@ -442,17 +402,10 @@ class Border extends BoxBorder { @override EdgeInsetsGeometry get dimensions { - if (isUniform) { - switch (top.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(top.width); - case StrokeAlign.center: - return EdgeInsets.all(top.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } + if (_widthIsUniform) { + return EdgeInsets.all(top.strokeInset); } - return EdgeInsets.fromLTRB(left.width, top.width, right.width, bottom.width); + return EdgeInsets.fromLTRB(left.strokeInset, top.strokeInset, right.strokeInset, bottom.strokeInset); } @override @@ -474,7 +427,7 @@ class Border extends BoxBorder { } bool get _strokeAlignIsUniform { - final StrokeAlign topStrokeAlign = top.strokeAlign; + final double topStrokeAlign = top.strokeAlign; return right.strokeAlign == topStrokeAlign && bottom.strokeAlign == topStrokeAlign && left.strokeAlign == topStrokeAlign; @@ -581,7 +534,7 @@ class Border extends BoxBorder { BoxBorder._paintUniformBorderWithCircle(canvas, rect, top); break; case BoxShape.rectangle: - if (borderRadius != null) { + if (borderRadius != null && borderRadius != BorderRadius.zero) { BoxBorder._paintUniformBorderWithRadius(canvas, rect, top, borderRadius); return; } @@ -619,9 +572,9 @@ class Border extends BoxBorder { return true; }()); assert(() { - if (!_strokeAlignIsUniform || top.strokeAlign != StrokeAlign.inside) { + if (!_strokeAlignIsUniform || top.strokeAlign != BorderSide.strokeAlignInside) { throw FlutterError.fromParts([ - ErrorSummary('A Border can only draw strokeAlign different than StrokeAlign.inside on uniform borders.'), + ErrorSummary('A Border can only draw strokeAlign different than BorderSide.strokeAlignInside on uniform borders.'), ]); } return true; @@ -753,16 +706,9 @@ class BorderDirectional extends BoxBorder { @override EdgeInsetsGeometry get dimensions { if (isUniform) { - switch (top.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsetsDirectional.all(top.width); - case StrokeAlign.center: - return EdgeInsetsDirectional.all(top.width / 2); - case StrokeAlign.outside: - return EdgeInsetsDirectional.zero; - } + return EdgeInsetsDirectional.all(top.strokeInset); } - return EdgeInsetsDirectional.fromSTEB(start.width, top.width, end.width, bottom.width); + return EdgeInsetsDirectional.fromSTEB(start.strokeInset, top.strokeInset, end.strokeInset, bottom.strokeInset); } @override @@ -796,7 +742,7 @@ class BorderDirectional extends BoxBorder { } bool get _strokeAlignIsUniform { - final StrokeAlign topStrokeAlign = top.strokeAlign; + final double topStrokeAlign = top.strokeAlign; return start.strokeAlign == topStrokeAlign && bottom.strokeAlign == topStrokeAlign && end.strokeAlign == topStrokeAlign; @@ -939,7 +885,7 @@ class BorderDirectional extends BoxBorder { BoxBorder._paintUniformBorderWithCircle(canvas, rect, top); break; case BoxShape.rectangle: - if (borderRadius != null) { + if (borderRadius != null && borderRadius != BorderRadius.zero) { BoxBorder._paintUniformBorderWithRadius(canvas, rect, top, borderRadius); return; } @@ -952,7 +898,7 @@ class BorderDirectional extends BoxBorder { assert(borderRadius == null, 'A borderRadius can only be given for uniform borders.'); assert(shape == BoxShape.rectangle, 'A border can only be drawn as a circle if it is uniform.'); - assert(_strokeAlignIsUniform && top.strokeAlign == StrokeAlign.inside, 'A Border can only draw strokeAlign different than StrokeAlign.inside on uniform borders.'); + assert(_strokeAlignIsUniform && top.strokeAlign == BorderSide.strokeAlignInside, 'A Border can only draw strokeAlign different than strokeAlignInside on uniform borders.'); final BorderSide left, right; assert(textDirection != null, 'Non-uniform BorderDirectional objects require a TextDirection when painting.'); diff --git a/packages/flutter/lib/src/painting/box_decoration.dart b/packages/flutter/lib/src/painting/box_decoration.dart index 01164b445415f..e64204a846aa0 100644 --- a/packages/flutter/lib/src/painting/box_decoration.dart +++ b/packages/flutter/lib/src/painting/box_decoration.dart @@ -431,7 +431,7 @@ class _BoxDecorationPainter extends BoxPainter { canvas.drawCircle(center, radius, paint); break; case BoxShape.rectangle: - if (_decoration.borderRadius == null) { + if (_decoration.borderRadius == null || _decoration.borderRadius == BorderRadius.zero) { canvas.drawRect(rect, paint); } else { canvas.drawRRect(_decoration.borderRadius!.resolve(textDirection).toRRect(rect), paint); diff --git a/packages/flutter/lib/src/painting/circle_border.dart b/packages/flutter/lib/src/painting/circle_border.dart index 730cde691be9c..f43774d7db325 100644 --- a/packages/flutter/lib/src/painting/circle_border.dart +++ b/packages/flutter/lib/src/painting/circle_border.dart @@ -8,7 +8,6 @@ import 'package:flutter/foundation.dart'; import 'basic_types.dart'; import 'borders.dart'; -import 'edge_insets.dart'; /// A border that fits a circle within the available space. /// @@ -45,18 +44,6 @@ class CircleBorder extends OutlinedBorder { /// When 1.0, it draws an oval touching all sides of the rectangle. final double eccentricity; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) => CircleBorder(side: side.scale(t), eccentricity: eccentricity); @@ -84,25 +71,12 @@ class CircleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { - final double delta; - switch (side.strokeAlign) { - case StrokeAlign.inside: - delta = side.width; - break; - case StrokeAlign.center: - delta = side.width / 2.0; - break; - case StrokeAlign.outside: - delta = 0; - break; - } - final Rect adjustedRect = _adjustRect(rect).deflate(delta); - return Path()..addOval(adjustedRect); + return Path()..addOval(_adjustRect(rect).deflate(side.strokeInset)); } @override Path getOuterPath(Rect rect, { TextDirection? textDirection }) { - return Path()..addOval(_adjustRect(rect)); + return Path()..addOval(_adjustRect(rect)); } @override @@ -128,35 +102,11 @@ class CircleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - if (eccentricity != 0.0) { - final Rect borderRect = _adjustRect(rect); - final Rect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width / 2.0); - break; - case StrokeAlign.center: - adjustedRect = borderRect; - break; - case StrokeAlign.outside: - adjustedRect = borderRect.inflate(side.width / 2.0); - break; - } - canvas.drawOval(adjustedRect, side.toPaint()); + if (eccentricity == 0.0) { + canvas.drawCircle(rect.center, (rect.shortestSide + side.strokeOffset) / 2, side.toPaint()); } else { - final double radius; - switch (side.strokeAlign) { - case StrokeAlign.inside: - radius = (rect.shortestSide - side.width) / 2.0; - break; - case StrokeAlign.center: - radius = rect.shortestSide / 2.0; - break; - case StrokeAlign.outside: - radius = (rect.shortestSide + side.width) / 2.0; - break; - } - canvas.drawCircle(rect.center, radius, side.toPaint()); + final Rect borderRect = _adjustRect(rect); + canvas.drawOval(borderRect.inflate(side.strokeOffset / 2), side.toPaint()); } } } diff --git a/packages/flutter/lib/src/painting/continuous_rectangle_border.dart b/packages/flutter/lib/src/painting/continuous_rectangle_border.dart index b3456c907df4d..0e289b0db8de7 100644 --- a/packages/flutter/lib/src/painting/continuous_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/continuous_rectangle_border.dart @@ -149,7 +149,7 @@ class ContinuousRectangleBorder extends OutlinedBorder { break; case BorderStyle.solid: final Path path = getOuterPath(rect, textDirection: textDirection); - final Paint paint = side.toPaint(); + final Paint paint = side.toPaint()..strokeJoin = StrokeJoin.round; canvas.drawPath(path, paint); break; } diff --git a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart index fd8ef67ceccde..9529e5f385b6b 100644 --- a/packages/flutter/lib/src/painting/rounded_rectangle_border.dart +++ b/packages/flutter/lib/src/painting/rounded_rectangle_border.dart @@ -10,7 +10,6 @@ import 'basic_types.dart'; import 'border_radius.dart'; import 'borders.dart'; import 'circle_border.dart'; -import 'edge_insets.dart'; /// A rectangular border with rounded corners. /// @@ -37,18 +36,6 @@ class RoundedRectangleBorder extends OutlinedBorder { /// The radii for each corner. final BorderRadiusGeometry borderRadius; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) { return RoundedRectangleBorder( @@ -110,18 +97,7 @@ class RoundedRectangleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect; - break; - } + final RRect adjustedRect = borderRect.deflate(side.strokeInset); return Path() ..addRRect(adjustedRect); } @@ -150,30 +126,12 @@ class RoundedRectangleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final double width = side.width; - if (width == 0.0) { - canvas.drawRRect(borderRadius.resolve(textDirection).toRRect(rect), side.toPaint()); - } else { - final Paint paint = Paint() - ..color = side.color; - if (side.strokeAlign == StrokeAlign.inside) { - final RRect outer = borderRadius.resolve(textDirection).toRRect(rect); - final RRect inner = outer.deflate(width); - canvas.drawDRRect(outer, inner, paint); - } else { - final Rect inner; - final Rect outer; - if (side.strokeAlign == StrokeAlign.center) { - inner = rect.deflate(width / 2); - outer = rect.inflate(width / 2); - } else { - inner = rect; - outer = rect.inflate(width); - } - final BorderRadius borderRadiusResolved = borderRadius.resolve(textDirection); - canvas.drawDRRect(borderRadiusResolved.toRRect(outer), borderRadiusResolved.toRRect(inner), paint); - } - } + final Paint paint = Paint() + ..color = side.color; + final RRect borderRect = borderRadius.resolve(textDirection).toRRect(rect); + final RRect inner = borderRect.deflate(side.strokeInset); + final RRect outer = borderRect.inflate(side.strokeOutset); + canvas.drawDRRect(outer, inner, paint); } } @@ -210,18 +168,6 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { final double circleness; final double eccentricity; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) { return _RoundedRectangleToCircleBorder( @@ -342,18 +288,7 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { final RRect borderRect = _adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect; - break; - } + final RRect adjustedRect = borderRect.deflate(ui.lerpDouble(side.width, 0, side.strokeAlign)!); return Path() ..addRRect(adjustedRect); } @@ -393,25 +328,9 @@ class _RoundedRectangleToCircleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final double width = side.width; - if (width == 0.0) { - canvas.drawRRect(_adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)), side.toPaint()); - } else { - final RRect borderRect = _adjustBorderRadius(rect, textDirection)!.toRRect(_adjustRect(rect)); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(width / 2); - break; - case StrokeAlign.center: - adjustedRect = borderRect; - break; - case StrokeAlign.outside: - adjustedRect = borderRect.inflate(width / 2); - break; - } - canvas.drawRRect(adjustedRect, side.toPaint()); - } + final BorderRadius adjustedBorderRadius = _adjustBorderRadius(rect, textDirection)!; + final RRect borderRect = adjustedBorderRadius.toRRect(_adjustRect(rect)); + canvas.drawRRect(borderRect.inflate(side.strokeOffset / 2), side.toPaint()); } } diff --git a/packages/flutter/lib/src/painting/stadium_border.dart b/packages/flutter/lib/src/painting/stadium_border.dart index 22317e580b056..b7a0d7677b121 100644 --- a/packages/flutter/lib/src/painting/stadium_border.dart +++ b/packages/flutter/lib/src/painting/stadium_border.dart @@ -10,7 +10,6 @@ import 'basic_types.dart'; import 'border_radius.dart'; import 'borders.dart'; import 'circle_border.dart'; -import 'edge_insets.dart'; import 'rounded_rectangle_border.dart'; /// A border that fits a stadium-shaped border (a box with semicircles on the ends) @@ -30,18 +29,6 @@ class StadiumBorder extends OutlinedBorder { /// The [side] argument must not be null. const StadiumBorder({ super.side }) : assert(side != null); - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) => StadiumBorder(side: side.scale(t)); @@ -100,18 +87,7 @@ class StadiumBorder extends OutlinedBorder { Path getInnerPath(Rect rect, { TextDirection? textDirection }) { final Radius radius = Radius.circular(rect.shortestSide / 2.0); final RRect borderRect = RRect.fromRectAndRadius(rect, radius); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect; - break; - } + final RRect adjustedRect = borderRect.deflate(side.strokeInset); return Path() ..addRRect(adjustedRect); } @@ -140,22 +116,7 @@ class StadiumBorder extends OutlinedBorder { case BorderStyle.solid: final Radius radius = Radius.circular(rect.shortestSide / 2); final RRect borderRect = RRect.fromRectAndRadius(rect, radius); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.center: - adjustedRect = borderRect; - break; - case StrokeAlign.outside: - adjustedRect = borderRect.inflate(side.width / 2); - break; - } - canvas.drawRRect( - adjustedRect, - side.toPaint(), - ); + canvas.drawRRect(borderRect.inflate(side.strokeOffset / 2), side.toPaint()); } } @@ -189,18 +150,6 @@ class _StadiumToCircleBorder extends OutlinedBorder { final double circleness; final double eccentricity; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) { return _StadiumToCircleBorder( @@ -312,7 +261,7 @@ class _StadiumToCircleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { return Path() - ..addRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect)).deflate(side.width)); + ..addRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect)).deflate(side.strokeInset)); } @override @@ -344,25 +293,8 @@ class _StadiumToCircleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final double width = side.width; - if (width == 0.0) { - canvas.drawRRect(_adjustBorderRadius(rect).toRRect(_adjustRect(rect)), side.toPaint()); - } else { - final RRect borderRect = _adjustBorderRadius(rect).toRRect(_adjustRect(rect)); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(width / 2); - break; - case StrokeAlign.center: - adjustedRect = borderRect; - break; - case StrokeAlign.outside: - adjustedRect = borderRect.inflate(width / 2); - break; - } - canvas.drawRRect(adjustedRect, side.toPaint()); - } + final RRect borderRect = _adjustBorderRadius(rect).toRRect(_adjustRect(rect)); + canvas.drawRRect(borderRect.inflate(side.strokeOffset / 2), side.toPaint()); } } @@ -402,11 +334,6 @@ class _StadiumToRoundedRectangleBorder extends OutlinedBorder { final double rectness; - @override - EdgeInsetsGeometry get dimensions { - return EdgeInsets.all(side.width); - } - @override ShapeBorder scale(double t) { return _StadiumToRoundedRectangleBorder( @@ -481,18 +408,7 @@ class _StadiumToRoundedRectangleBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, { TextDirection? textDirection }) { final RRect borderRect = _adjustBorderRadius(rect).toRRect(rect); - final RRect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = borderRect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = borderRect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = borderRect; - break; - } + final RRect adjustedRect = borderRect.deflate(ui.lerpDouble(side.width, 0, side.strokeAlign)!); return Path() ..addRRect(adjustedRect); } @@ -531,26 +447,9 @@ class _StadiumToRoundedRectangleBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final double width = side.width; - if (width == 0.0) { - canvas.drawRRect(_adjustBorderRadius(rect).toRRect(rect), side.toPaint()); - } else { - if (side.strokeAlign == StrokeAlign.inside) { - final RRect outer = _adjustBorderRadius(rect).toRRect(rect); - final RRect inner = outer.deflate(width); - final Paint paint = Paint() - ..color = side.color; - canvas.drawDRRect(outer, inner, paint); - } else { - final RRect outer; - if (side.strokeAlign == StrokeAlign.center) { - outer = _adjustBorderRadius(rect).toRRect(rect); - } else { - outer = _adjustBorderRadius(rect.inflate(width)).toRRect(rect.inflate(width / 2)); - } - canvas.drawRRect(outer, side.toPaint()); - } - } + final BorderRadius adjustedBorderRadius = _adjustBorderRadius(rect); + final RRect borderRect = adjustedBorderRadius.resolve(textDirection).toRRect(rect); + canvas.drawRRect(borderRect.inflate(side.strokeOffset / 2), side.toPaint()); } } diff --git a/packages/flutter/lib/src/painting/star_border.dart b/packages/flutter/lib/src/painting/star_border.dart index 7e51a13a11709..aadd09547b830 100644 --- a/packages/flutter/lib/src/painting/star_border.dart +++ b/packages/flutter/lib/src/painting/star_border.dart @@ -11,7 +11,6 @@ import 'package:vector_math/vector_math_64.dart' show Matrix4; import 'basic_types.dart'; import 'borders.dart'; import 'circle_border.dart'; -import 'edge_insets.dart'; import 'rounded_rectangle_border.dart'; import 'stadium_border.dart'; @@ -166,18 +165,6 @@ class StarBorder extends OutlinedBorder { /// Defaults to zero, and must be between zero and one, inclusive. final double squash; - @override - EdgeInsetsGeometry get dimensions { - switch (side.strokeAlign) { - case StrokeAlign.inside: - return EdgeInsets.all(side.width); - case StrokeAlign.center: - return EdgeInsets.all(side.width / 2); - case StrokeAlign.outside: - return EdgeInsets.zero; - } - } - @override ShapeBorder scale(double t) { return StarBorder( @@ -388,18 +375,7 @@ class StarBorder extends OutlinedBorder { @override Path getInnerPath(Rect rect, {TextDirection? textDirection}) { - final Rect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = rect.deflate(side.width); - break; - case StrokeAlign.center: - adjustedRect = rect.deflate(side.width / 2); - break; - case StrokeAlign.outside: - adjustedRect = rect; - break; - } + final Rect adjustedRect = rect.deflate(side.strokeInset); return _StarGenerator( points: points, rotation: _rotationRadians, @@ -428,18 +404,7 @@ class StarBorder extends OutlinedBorder { case BorderStyle.none: break; case BorderStyle.solid: - final Rect adjustedRect; - switch (side.strokeAlign) { - case StrokeAlign.inside: - adjustedRect = rect.deflate(side.width / 2); - break; - case StrokeAlign.center: - adjustedRect = rect; - break; - case StrokeAlign.outside: - adjustedRect = rect.inflate(side.width / 2); - break; - } + final Rect adjustedRect = rect.inflate(side.strokeOffset / 2); final Path path = _StarGenerator( points: points, rotation: _rotationRadians, diff --git a/packages/flutter/test/material/bottom_sheet_theme_test.dart b/packages/flutter/test/material/bottom_sheet_theme_test.dart index 51b1cd9fb00a0..d01aad537e5fd 100644 --- a/packages/flutter/test/material/bottom_sheet_theme_test.dart +++ b/packages/flutter/test/material/bottom_sheet_theme_test.dart @@ -51,7 +51,7 @@ void main() { expect(description, [ 'backgroundColor: Color(0xffffffff)', 'elevation: 2.0', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(2.0))', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(2.0))', 'clipBehavior: Clip.antiAlias', 'constraints: BoxConstraints(200.0<=w<=640.0, 0.0<=h<=Infinity)', ]); diff --git a/packages/flutter/test/material/button_style_test.dart b/packages/flutter/test/material/button_style_test.dart index 11de84c7b5d12..44599e55f5e7b 100644 --- a/packages/flutter/test/material/button_style_test.dart +++ b/packages/flutter/test/material/button_style_test.dart @@ -88,8 +88,8 @@ void main() { 'minimumSize: MaterialStatePropertyAll(Size(1.0, 2.0))', 'maximumSize: MaterialStatePropertyAll(Size(100.0, 200.0))', 'iconSize: MaterialStatePropertyAll(48.1)', - 'side: MaterialStatePropertyAll(BorderSide(Color(0xfffffff6), 4.0, BorderStyle.solid))', - 'shape: MaterialStatePropertyAll(StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none)))', + 'side: MaterialStatePropertyAll(BorderSide(color: Color(0xfffffff6), width: 4.0))', + 'shape: MaterialStatePropertyAll(StadiumBorder(BorderSide(width: 0.0, style: none)))', 'mouseCursor: MaterialStatePropertyAll(SystemMouseCursor(forbidden))', 'tapTargetSize: shrinkWrap', 'animationDuration: 0:00:01.000000', diff --git a/packages/flutter/test/material/chip_theme_test.dart b/packages/flutter/test/material/chip_theme_test.dart index ec0a8f22321bb..55b95e63cf211 100644 --- a/packages/flutter/test/material/chip_theme_test.dart +++ b/packages/flutter/test/material/chip_theme_test.dart @@ -119,8 +119,8 @@ void main() { 'checkMarkColor: Color(0xfffffff7)', 'labelPadding: EdgeInsets.all(1.0)', 'padding: EdgeInsets.all(2.0)', - 'side: BorderSide(Color(0xff000000), 10.0, BorderStyle.solid)', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', + 'side: BorderSide(width: 10.0)', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', 'labelStyle: TextStyle(inherit: true, size: 10.0)', 'secondaryLabelStyle: TextStyle(inherit: true, size: 20.0)', 'brightness: dark', diff --git a/packages/flutter/test/material/drawer_theme_test.dart b/packages/flutter/test/material/drawer_theme_test.dart index df79277ac76b7..da6b9e8293a00 100644 --- a/packages/flutter/test/material/drawer_theme_test.dart +++ b/packages/flutter/test/material/drawer_theme_test.dart @@ -43,7 +43,7 @@ void main() { 'backgroundColor: Color(0x00000099)', 'scrimColor: Color(0x00000098)', 'elevation: 5.0', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(2.0))', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(2.0))', 'width: 200.0', ]); }); diff --git a/packages/flutter/test/material/floating_action_button_theme_test.dart b/packages/flutter/test/material/floating_action_button_theme_test.dart index 1eca03272b3a7..b30c677a53e7e 100644 --- a/packages/flutter/test/material/floating_action_button_theme_test.dart +++ b/packages/flutter/test/material/floating_action_button_theme_test.dart @@ -307,7 +307,7 @@ void main() { 'hoverElevation: 10.0', 'disabledElevation: 11.0', 'highlightElevation: 43.0', - 'shape: BeveledRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', + 'shape: BeveledRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', 'enableFeedback: true', 'iconSize: 42.0', 'sizeConstraints: BoxConstraints(w=100.0, h=100.0)', diff --git a/packages/flutter/test/material/list_tile_test.dart b/packages/flutter/test/material/list_tile_test.dart index 5edd20c4b0870..e58e12631f9db 100644 --- a/packages/flutter/test/material/list_tile_test.dart +++ b/packages/flutter/test/material/list_tile_test.dart @@ -2262,7 +2262,7 @@ void main() { 'isThreeLine: THREE_LINE', 'dense: true', 'visualDensity: VisualDensity#00000(h: 0.0, v: 0.0)', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', 'style: ListTileStyle.list', 'selectedColor: Color(0xff0000ff)', 'iconColor: Color(0xff00ff00)', diff --git a/packages/flutter/test/material/list_tile_theme_test.dart b/packages/flutter/test/material/list_tile_theme_test.dart index 66fdb094ee37a..89d43e840189b 100644 --- a/packages/flutter/test/material/list_tile_theme_test.dart +++ b/packages/flutter/test/material/list_tile_theme_test.dart @@ -111,7 +111,7 @@ void main() { description, equalsIgnoringHashCodes([ 'dense: true', - 'shape: StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none))', + 'shape: StadiumBorder(BorderSide(width: 0.0, style: none))', 'style: drawer', 'selectedColor: Color(0x00000001)', 'iconColor: Color(0x00000002)', diff --git a/packages/flutter/test/material/navigation_bar_theme_test.dart b/packages/flutter/test/material/navigation_bar_theme_test.dart index bd79843943a5b..055ba4192ae6c 100644 --- a/packages/flutter/test/material/navigation_bar_theme_test.dart +++ b/packages/flutter/test/material/navigation_bar_theme_test.dart @@ -46,7 +46,7 @@ void main() { expect(description[1], 'backgroundColor: Color(0x00000099)'); expect(description[2], 'elevation: 20.0'); expect(description[3], 'indicatorColor: Color(0x00000098)'); - expect(description[4], 'indicatorShape: CircleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none))'); + expect(description[4], 'indicatorShape: CircleBorder(BorderSide(width: 0.0, style: none))'); expect(description[5], 'labelTextStyle: MaterialStatePropertyAll(TextStyle(inherit: true, size: 7.0))'); // Ignore instance address for IconThemeData. diff --git a/packages/flutter/test/material/popup_menu_theme_test.dart b/packages/flutter/test/material/popup_menu_theme_test.dart index 768c5b6b213b1..a37e883f5ad03 100644 --- a/packages/flutter/test/material/popup_menu_theme_test.dart +++ b/packages/flutter/test/material/popup_menu_theme_test.dart @@ -60,7 +60,7 @@ void main() { expect(description, [ 'color: Color(0xffffffff)', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(2.0))', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(2.0))', 'elevation: 2.0', 'text style: TextStyle(inherit: true, color: Color(0xffffffff))', 'mouseCursor: MaterialStateMouseCursor(clickable)', diff --git a/packages/flutter/test/material/snack_bar_theme_test.dart b/packages/flutter/test/material/snack_bar_theme_test.dart index cd82a63d9da9e..54774134debf0 100644 --- a/packages/flutter/test/material/snack_bar_theme_test.dart +++ b/packages/flutter/test/material/snack_bar_theme_test.dart @@ -58,7 +58,7 @@ void main() { 'disabledActionTextColor: Color(0xff00aa00)', 'contentTextStyle: TextStyle(inherit: true, color: Color(0xff123456))', 'elevation: 2.0', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(2.0))', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(2.0))', 'behavior: SnackBarBehavior.floating', ]); }); diff --git a/packages/flutter/test/material/time_picker_theme_test.dart b/packages/flutter/test/material/time_picker_theme_test.dart index 021674b6ffa18..1e44ae3213f78 100644 --- a/packages/flutter/test/material/time_picker_theme_test.dart +++ b/packages/flutter/test/material/time_picker_theme_test.dart @@ -86,10 +86,10 @@ void main() { 'hourMinuteTextStyle: TextStyle()', 'dayPeriodTextStyle: TextStyle()', 'helpTextStyle: TextStyle()', - 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', - 'hourMinuteShape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', - 'dayPeriodShape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', - 'dayPeriodBorderSide: BorderSide(Color(0xff000000), 1.0, BorderStyle.solid)', + 'shape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', + 'hourMinuteShape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', + 'dayPeriodShape: RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.zero)', + 'dayPeriodBorderSide: BorderSide', ]); }); diff --git a/packages/flutter/test/painting/beveled_rectangle_border_test.dart b/packages/flutter/test/painting/beveled_rectangle_border_test.dart index 14f4dd9c9e1d3..c3d433040c548 100644 --- a/packages/flutter/test/painting/beveled_rectangle_border_test.dart +++ b/packages/flutter/test/painting/beveled_rectangle_border_test.dart @@ -110,8 +110,8 @@ void main() { test('BeveledRectangleBorder with StrokeAlign', () { const BorderRadius borderRadius = BorderRadius.all(Radius.circular(10)); const BeveledRectangleBorder inside = BeveledRectangleBorder(side: BorderSide(width: 10.0), borderRadius: borderRadius); - const BeveledRectangleBorder center = BeveledRectangleBorder(side: BorderSide(width: 10.0, strokeAlign: StrokeAlign.center), borderRadius: borderRadius); - const BeveledRectangleBorder outside = BeveledRectangleBorder(side: BorderSide(width: 10.0, strokeAlign: StrokeAlign.outside), borderRadius: borderRadius); + const BeveledRectangleBorder center = BeveledRectangleBorder(side: BorderSide(width: 10.0, strokeAlign: BorderSide.strokeAlignCenter), borderRadius: borderRadius); + const BeveledRectangleBorder outside = BeveledRectangleBorder(side: BorderSide(width: 10.0, strokeAlign: BorderSide.strokeAlignOutside), borderRadius: borderRadius); expect(inside.dimensions, const EdgeInsets.all(10.0)); expect(center.dimensions, const EdgeInsets.all(5.0)); expect(outside.dimensions, EdgeInsets.zero); diff --git a/packages/flutter/test/painting/border_rtl_test.dart b/packages/flutter/test/painting/border_rtl_test.dart index 18946a7ccafcc..47b4f1da4c8a2 100644 --- a/packages/flutter/test/painting/border_rtl_test.dart +++ b/packages/flutter/test/painting/border_rtl_test.dart @@ -142,8 +142,7 @@ void main() { ' BoxBorder.lerp() was called with two objects of type SillyBorder\n' ' and Border:\n' ' SillyBorder()\n' - ' Border.all(BorderSide(Color(0xff000000), 0.0,\n' - ' BorderStyle.none))\n' + ' Border.all(BorderSide(width: 0.0, style: none))\n' ' However, only Border and BorderDirectional classes are supported\n' ' by this method.\n' ' For a more general interpolation method, consider using\n' diff --git a/packages/flutter/test/painting/border_side_test.dart b/packages/flutter/test/painting/border_side_test.dart index 35f502394cf84..b4c33c17d8fa5 100644 --- a/packages/flutter/test/painting/border_side_test.dart +++ b/packages/flutter/test/painting/border_side_test.dart @@ -119,21 +119,21 @@ void main() { test('BorderSide - toString', () { expect( const BorderSide(color: Color(0xFFAABBCC), width: 1.2345).toString(), - 'BorderSide(Color(0xffaabbcc), 1.2, BorderStyle.solid)', + 'BorderSide(color: Color(0xffaabbcc), width: 1.2)', ); }); test('BorderSide - lerp with strokeAlign', () { - const BorderSide side0 = BorderSide(width: 2.0, strokeAlign: StrokeAlign.center); - const BorderSide side1 = BorderSide(width: 2.0, strokeAlign: StrokeAlign.outside); - expect(BorderSide.lerp(side0, side1, 0), const BorderSide(width: 2.0, strokeAlign: StrokeAlign.center)); - expect(BorderSide.lerp(side0, side1, 0.5), const BorderSide(width: 0.0, strokeAlign: StrokeAlign.center)); - expect(BorderSide.lerp(side0, side1, 1), const BorderSide(width: 2.0, strokeAlign: StrokeAlign.outside)); + const BorderSide side0 = BorderSide(width: 2.0); + const BorderSide side1 = BorderSide(width: 2.0, strokeAlign: BorderSide.strokeAlignOutside); + expect(BorderSide.lerp(side0, side1, 0), const BorderSide(width: 2.0)); + expect(BorderSide.lerp(side0, side1, 0.5), const BorderSide(width: 2.0, strokeAlign: BorderSide.strokeAlignCenter)); + expect(BorderSide.lerp(side0, side1, 1), const BorderSide(width: 2.0, strokeAlign: BorderSide.strokeAlignOutside)); const BorderSide side2 = BorderSide(width: 2.0); - const BorderSide side3 = BorderSide(width: 2.0, strokeAlign: StrokeAlign.center); + const BorderSide side3 = BorderSide(width: 2.0, strokeAlign: BorderSide.strokeAlignCenter); expect(BorderSide.lerp(side2, side3, 0), const BorderSide(width: 2.0)); - expect(BorderSide.lerp(side2, side3, 0.5), const BorderSide(width: 0.0)); - expect(BorderSide.lerp(side2, side3, 1), const BorderSide(width: 2.0, strokeAlign: StrokeAlign.center)); + expect(BorderSide.lerp(side2, side3, 0.5), const BorderSide(width: 2.0, strokeAlign: -0.5)); + expect(BorderSide.lerp(side2, side3, 1), const BorderSide(width: 2.0, strokeAlign: BorderSide.strokeAlignCenter)); }); } diff --git a/packages/flutter/test/painting/border_test.dart b/packages/flutter/test/painting/border_test.dart index fa2fd4758fa7f..2e055154ca684 100644 --- a/packages/flutter/test/painting/border_test.dart +++ b/packages/flutter/test/painting/border_test.dart @@ -202,8 +202,8 @@ void main() { expect( const Border( left: BorderSide(), - top: BorderSide(strokeAlign: StrokeAlign.center), - right: BorderSide(strokeAlign: StrokeAlign.outside), + top: BorderSide(strokeAlign: BorderSide.strokeAlignCenter), + right: BorderSide(strokeAlign: BorderSide.strokeAlignOutside), ).isUniform, false, ); @@ -262,10 +262,10 @@ void main() { try { final TestCanvas canvas = TestCanvas(); // Border.all supports all StrokeAlign values. - // Border() supports StrokeAlign.inside only. + // Border() supports [BorderSide.strokeAlignInside] only. const Border( - left: BorderSide(strokeAlign: StrokeAlign.center), - right: BorderSide(strokeAlign: StrokeAlign.outside), + left: BorderSide(strokeAlign: BorderSide.strokeAlignCenter), + right: BorderSide(strokeAlign: BorderSide.strokeAlignOutside), ).paint(canvas, const Rect.fromLTWH(10.0, 20.0, 30.0, 40.0)); } on FlutterError catch (e) { error = e; @@ -274,7 +274,7 @@ void main() { expect(error.diagnostics.length, 1); expect( error.diagnostics[0].toStringDeep(), - 'A Border can only draw strokeAlign different than\nStrokeAlign.inside on uniform borders.\n', + 'A Border can only draw strokeAlign different than\nBorderSide.strokeAlignInside on uniform borders.\n', ); }); @@ -282,21 +282,21 @@ void main() { final Border insideBorder = Border.all(width: 10); expect(insideBorder.dimensions, const EdgeInsets.all(10)); - final Border centerBorder = Border.all(width: 10, strokeAlign: StrokeAlign.center); + final Border centerBorder = Border.all(width: 10, strokeAlign: BorderSide.strokeAlignCenter); expect(centerBorder.dimensions, const EdgeInsets.all(5)); - final Border outsideBorder = Border.all(width: 10, strokeAlign: StrokeAlign.outside); + final Border outsideBorder = Border.all(width: 10, strokeAlign: BorderSide.strokeAlignOutside); expect(outsideBorder.dimensions, EdgeInsets.zero); const BorderSide insideSide = BorderSide(width: 10); const BorderDirectional insideBorderDirectional = BorderDirectional(top: insideSide, bottom: insideSide, start: insideSide, end: insideSide); expect(insideBorderDirectional.dimensions, const EdgeInsetsDirectional.all(10)); - const BorderSide centerSide = BorderSide(width: 10, strokeAlign: StrokeAlign.center); + const BorderSide centerSide = BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignCenter); const BorderDirectional centerBorderDirectional = BorderDirectional(top: centerSide, bottom: centerSide, start: centerSide, end: centerSide); expect(centerBorderDirectional.dimensions, const EdgeInsetsDirectional.all(5)); - const BorderSide outsideSide = BorderSide(width: 10, strokeAlign: StrokeAlign.outside); + const BorderSide outsideSide = BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignOutside); const BorderDirectional outsideBorderDirectional = BorderDirectional(top: outsideSide, bottom: outsideSide, start: outsideSide, end: outsideSide); expect(outsideBorderDirectional.dimensions, EdgeInsetsDirectional.zero); }); diff --git a/packages/flutter/test/painting/box_painter_test.dart b/packages/flutter/test/painting/box_painter_test.dart index 7271cbc99ccb1..85fec3f677b5e 100644 --- a/packages/flutter/test/painting/box_painter_test.dart +++ b/packages/flutter/test/painting/box_painter_test.dart @@ -54,8 +54,8 @@ void main() { style: BorderStyle.solid, ); - expect(side1.toString(), equals('BorderSide(Color(0xff000000), 1.0, BorderStyle.solid)')); - expect(side2.toString(), equals('BorderSide(Color(0xff00ffff), 2.0, BorderStyle.solid)')); + expect(side1.toString(), equals('BorderSide')); + expect(side2.toString(), equals('BorderSide(color: Color(0xff00ffff), width: 2.0)')); }); test('Border control test', () { @@ -76,9 +76,7 @@ void main() { test('Border toString test', () { expect( Border.all(width: 4.0).toString(), - equals( - 'Border.all(BorderSide(Color(0xff000000), 4.0, BorderStyle.solid))', - ), + equals('Border.all(BorderSide(width: 4.0))'), ); expect( const Border( @@ -87,9 +85,7 @@ void main() { bottom: BorderSide(width: 3.0), left: BorderSide(width: 3.0), ).toString(), - equals( - 'Border.all(BorderSide(Color(0xff000000), 3.0, BorderStyle.solid))', - ), + equals('Border.all(BorderSide(width: 3.0))'), ); }); diff --git a/packages/flutter/test/painting/rounded_rectangle_border_test.dart b/packages/flutter/test/painting/rounded_rectangle_border_test.dart index aa9c6c8880782..94acd9c660c06 100644 --- a/packages/flutter/test/painting/rounded_rectangle_border_test.dart +++ b/packages/flutter/test/painting/rounded_rectangle_border_test.dart @@ -97,28 +97,28 @@ void main() { expect( ShapeBorder.lerp(r, c, 0.1).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 10.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 10.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(r, c, 0.2).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 20.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 20.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(r, c, 0.1), ShapeBorder.lerp(r, c, 0.9), 0.9).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 82.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 82.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(c, r, 0.9).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 10.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 10.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(c, r, 0.8).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 20.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 20.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(r, c, 0.9), ShapeBorder.lerp(r, c, 0.1), 0.1).toString(), - 'RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(10.0), 82.0% of the way to being a CircleBorder)', + 'RoundedRectangleBorder(BorderSide(width: 0.0, style: none), BorderRadius.circular(10.0), 82.0% of the way to being a CircleBorder)', ); expect(ShapeBorder.lerp(r, c, 0.1), ShapeBorder.lerp(r, c, 0.1)); @@ -135,19 +135,26 @@ void main() { const RoundedRectangleBorder insideRoundedRectangleBorder = RoundedRectangleBorder(side: BorderSide(width: 10)); expect(insideRoundedRectangleBorder.dimensions, const EdgeInsets.all(10)); - const RoundedRectangleBorder centerRoundedRectangleBorder = RoundedRectangleBorder(side: BorderSide(width: 10, strokeAlign: StrokeAlign.center)); + const RoundedRectangleBorder centerRoundedRectangleBorder = RoundedRectangleBorder(side: BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignCenter)); expect(centerRoundedRectangleBorder.dimensions, const EdgeInsets.all(5)); - const RoundedRectangleBorder outsideRoundedRectangleBorder = RoundedRectangleBorder(side: BorderSide(width: 10, strokeAlign: StrokeAlign.outside)); + const RoundedRectangleBorder outsideRoundedRectangleBorder = RoundedRectangleBorder(side: BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignOutside)); expect(outsideRoundedRectangleBorder.dimensions, EdgeInsets.zero); const CircleBorder insideCircleBorder = CircleBorder(side: BorderSide(width: 10)); expect(insideCircleBorder.dimensions, const EdgeInsets.all(10)); - const CircleBorder centerCircleBorder = CircleBorder(side: BorderSide(width: 10, strokeAlign: StrokeAlign.center)); + const CircleBorder centerCircleBorder = CircleBorder(side: BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignCenter)); expect(centerCircleBorder.dimensions, const EdgeInsets.all(5)); - const CircleBorder outsideCircleBorder = CircleBorder(side: BorderSide(width: 10, strokeAlign: StrokeAlign.outside)); + const CircleBorder outsideCircleBorder = CircleBorder(side: BorderSide(width: 10, strokeAlign: BorderSide.strokeAlignOutside)); expect(outsideCircleBorder.dimensions, EdgeInsets.zero); }); + + test('RoundedRectangleBorder.lerp with different StrokeAlign', () { + const RoundedRectangleBorder rInside = RoundedRectangleBorder(side: BorderSide(width: 10.0)); + const RoundedRectangleBorder rOutside = RoundedRectangleBorder(side: BorderSide(width: 20.0, strokeAlign: BorderSide.strokeAlignOutside)); + const RoundedRectangleBorder rCenter = RoundedRectangleBorder(side: BorderSide(width: 15.0, strokeAlign: BorderSide.strokeAlignCenter)); + expect(ShapeBorder.lerp(rInside, rOutside, 0.5), rCenter); + }); } diff --git a/packages/flutter/test/painting/shape_border_test.dart b/packages/flutter/test/painting/shape_border_test.dart index 632db92717a79..fbb217b15d98b 100644 --- a/packages/flutter/test/painting/shape_border_test.dart +++ b/packages/flutter/test/painting/shape_border_test.dart @@ -13,49 +13,49 @@ void main() { final Border b2 = Border.all(color: const Color(0xFF0000FF)); expect( (b1 + b2).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff00ff00))) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff)))', ); expect( (b1 + (b2 + b2)).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff00ff00))) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff), width: 2.0))', ); expect( ((b1 + b2) + b2).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff00ff00))) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff), width: 2.0))', ); expect((b1 + b2) + b2, b1 + (b2 + b2)); expect( (b1 + b2).scale(3.0).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 3.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 3.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff00ff00), width: 3.0)) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff), width: 3.0))', ); expect( (b1 + b2).scale(0.0).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 0.0, BorderStyle.none)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 0.0, BorderStyle.none))', + 'Border.all(BorderSide(color: Color(0xff00ff00), width: 0.0, style: none)) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff), width: 0.0, style: none))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.0).toString(), - 'Border.all(BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff0000ff))) + ' + 'Border.all(BorderSide(color: Color(0xff00ff00)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.25).toString(), - 'Border.all(BorderSide(Color(0xff003fbf), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff00bf3f), 1.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff003fbf))) + ' + 'Border.all(BorderSide(color: Color(0xff00bf3f)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.5).toString(), - 'Border.all(BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff007f7f))) + ' + 'Border.all(BorderSide(color: Color(0xff007f7f)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 1.0).toString(), - 'Border.all(BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'Border.all(BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid))', + 'Border.all(BorderSide(color: Color(0xff00ff00))) + ' + 'Border.all(BorderSide(color: Color(0xff0000ff)))', ); expect((b1 + b2).dimensions, const EdgeInsets.all(2.0)); const Rect rect = Rect.fromLTRB(11.0, 15.0, 299.0, 175.0); @@ -78,49 +78,49 @@ void main() { const BorderDirectional b2 = BorderDirectional(top: side2, start: side2, end: side2, bottom: side2); expect( (b1 + b2).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00)), start: BorderSide(color: Color(0xff00ff00)), end: BorderSide(color: Color(0xff00ff00)), bottom: BorderSide(color: Color(0xff00ff00))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff)), start: BorderSide(color: Color(0xff0000ff)), end: BorderSide(color: Color(0xff0000ff)), bottom: BorderSide(color: Color(0xff0000ff)))', ); expect( (b1 + (b2 + b2)).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00)), start: BorderSide(color: Color(0xff00ff00)), end: BorderSide(color: Color(0xff00ff00)), bottom: BorderSide(color: Color(0xff00ff00))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff), width: 2.0), start: BorderSide(color: Color(0xff0000ff), width: 2.0), end: BorderSide(color: Color(0xff0000ff), width: 2.0), bottom: BorderSide(color: Color(0xff0000ff), width: 2.0))', ); expect( ((b1 + b2) + b2).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 2.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00)), start: BorderSide(color: Color(0xff00ff00)), end: BorderSide(color: Color(0xff00ff00)), bottom: BorderSide(color: Color(0xff00ff00))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff), width: 2.0), start: BorderSide(color: Color(0xff0000ff), width: 2.0), end: BorderSide(color: Color(0xff0000ff), width: 2.0), bottom: BorderSide(color: Color(0xff0000ff), width: 2.0))', ); expect((b1 + b2) + b2, b1 + (b2 + b2)); expect( (b1 + b2).scale(3.0).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 3.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 3.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 3.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 3.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 3.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 3.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 3.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 3.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00), width: 3.0), start: BorderSide(color: Color(0xff00ff00), width: 3.0), end: BorderSide(color: Color(0xff00ff00), width: 3.0), bottom: BorderSide(color: Color(0xff00ff00), width: 3.0)) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff), width: 3.0), start: BorderSide(color: Color(0xff0000ff), width: 3.0), end: BorderSide(color: Color(0xff0000ff), width: 3.0), bottom: BorderSide(color: Color(0xff0000ff), width: 3.0))', ); expect( (b1 + b2).scale(0.0).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 0.0, BorderStyle.none), start: BorderSide(Color(0xff00ff00), 0.0, BorderStyle.none), end: BorderSide(Color(0xff00ff00), 0.0, BorderStyle.none), bottom: BorderSide(Color(0xff00ff00), 0.0, BorderStyle.none)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 0.0, BorderStyle.none), start: BorderSide(Color(0xff0000ff), 0.0, BorderStyle.none), end: BorderSide(Color(0xff0000ff), 0.0, BorderStyle.none), bottom: BorderSide(Color(0xff0000ff), 0.0, BorderStyle.none))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00), width: 0.0, style: none), start: BorderSide(color: Color(0xff00ff00), width: 0.0, style: none), end: BorderSide(color: Color(0xff00ff00), width: 0.0, style: none), bottom: BorderSide(color: Color(0xff00ff00), width: 0.0, style: none)) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff), width: 0.0, style: none), start: BorderSide(color: Color(0xff0000ff), width: 0.0, style: none), end: BorderSide(color: Color(0xff0000ff), width: 0.0, style: none), bottom: BorderSide(color: Color(0xff0000ff), width: 0.0, style: none))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.0).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff)), start: BorderSide(color: Color(0xff0000ff)), end: BorderSide(color: Color(0xff0000ff)), bottom: BorderSide(color: Color(0xff0000ff))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00)), start: BorderSide(color: Color(0xff00ff00)), end: BorderSide(color: Color(0xff00ff00)), bottom: BorderSide(color: Color(0xff00ff00)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.25).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff003fbf), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff003fbf), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff003fbf), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff003fbf), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff00bf3f), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00bf3f), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00bf3f), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00bf3f), 1.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff003fbf)), start: BorderSide(color: Color(0xff003fbf)), end: BorderSide(color: Color(0xff003fbf)), bottom: BorderSide(color: Color(0xff003fbf))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff00bf3f)), start: BorderSide(color: Color(0xff00bf3f)), end: BorderSide(color: Color(0xff00bf3f)), bottom: BorderSide(color: Color(0xff00bf3f)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 0.5).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff007f7f), 1.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff007f7f)), start: BorderSide(color: Color(0xff007f7f)), end: BorderSide(color: Color(0xff007f7f)), bottom: BorderSide(color: Color(0xff007f7f))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff007f7f)), start: BorderSide(color: Color(0xff007f7f)), end: BorderSide(color: Color(0xff007f7f)), bottom: BorderSide(color: Color(0xff007f7f)))', ); expect( ShapeBorder.lerp(b2 + b1, b1 + b2, 1.0).toString(), - 'BorderDirectional(top: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff00ff00), 1.0, BorderStyle.solid)) + ' - 'BorderDirectional(top: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), start: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), end: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid), bottom: BorderSide(Color(0xff0000ff), 1.0, BorderStyle.solid))', + 'BorderDirectional(top: BorderSide(color: Color(0xff00ff00)), start: BorderSide(color: Color(0xff00ff00)), end: BorderSide(color: Color(0xff00ff00)), bottom: BorderSide(color: Color(0xff00ff00))) + ' + 'BorderDirectional(top: BorderSide(color: Color(0xff0000ff)), start: BorderSide(color: Color(0xff0000ff)), end: BorderSide(color: Color(0xff0000ff)), bottom: BorderSide(color: Color(0xff0000ff)))', ); expect((b1 + b2).dimensions, const EdgeInsetsDirectional.fromSTEB(2.0, 2.0, 2.0, 2.0)); const Rect rect = Rect.fromLTRB(11.0, 15.0, 299.0, 175.0); diff --git a/packages/flutter/test/painting/stadium_border_test.dart b/packages/flutter/test/painting/stadium_border_test.dart index 5b7edb5cc34d7..39028438c5037 100644 --- a/packages/flutter/test/painting/stadium_border_test.dart +++ b/packages/flutter/test/painting/stadium_border_test.dart @@ -48,8 +48,8 @@ void main() { }); test('StadiumBorder with StrokeAlign', () { - const StadiumBorder center = StadiumBorder(side: BorderSide(width: 10.0, strokeAlign: StrokeAlign.center)); - const StadiumBorder outside = StadiumBorder(side: BorderSide(width: 10.0, strokeAlign: StrokeAlign.outside)); + const StadiumBorder center = StadiumBorder(side: BorderSide(width: 10.0, strokeAlign: BorderSide.strokeAlignCenter)); + const StadiumBorder outside = StadiumBorder(side: BorderSide(width: 10.0, strokeAlign: BorderSide.strokeAlignOutside)); expect(center.dimensions, const EdgeInsets.all(5.0)); expect(outside.dimensions, EdgeInsets.zero); @@ -103,28 +103,28 @@ void main() { expect( ShapeBorder.lerp(stadium, circle, 0.1).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 10.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 10.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(stadium, circle, 0.2).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 20.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 20.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(stadium, circle, 0.1), ShapeBorder.lerp(stadium, circle, 0.9), 0.9).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 82.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 82.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(circle, stadium, 0.9).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 10.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 10.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(circle, stadium, 0.8).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 20.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 20.0% of the way to being a CircleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(stadium, circle, 0.9), ShapeBorder.lerp(stadium, circle, 0.1), 0.1).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), 82.0% of the way to being a CircleBorder)', + 'StadiumBorder(BorderSide(width: 0.0, style: none), 82.0% of the way to being a CircleBorder)', ); expect(ShapeBorder.lerp(stadium, circle, 0.1), ShapeBorder.lerp(stadium, circle, 0.1)); @@ -182,33 +182,33 @@ void main() { expect( ShapeBorder.lerp(stadium, rrect, 0.1).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 10.0% of the way to being a RoundedRectangleBorder)', ); expect( ShapeBorder.lerp(stadium, rrect, 0.2).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 20.0% of the way to being a RoundedRectangleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(stadium, rrect, 0.1), ShapeBorder.lerp(stadium, rrect, 0.9), 0.9).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 82.0% of the way to being a RoundedRectangleBorder)', ); expect( ShapeBorder.lerp(rrect, stadium, 0.9).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 10.0% of the way to being a RoundedRectangleBorder)', ); expect( ShapeBorder.lerp(rrect, stadium, 0.8).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 20.0% of the way to being a RoundedRectangleBorder)', ); expect( ShapeBorder.lerp(ShapeBorder.lerp(stadium, rrect, 0.9), ShapeBorder.lerp(stadium, rrect, 0.1), 0.1).toString(), - 'StadiumBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), ' + 'StadiumBorder(BorderSide(width: 0.0, style: none), ' 'BorderRadius.zero, 82.0% of the way to being a RoundedRectangleBorder)', ); diff --git a/packages/flutter/test/painting/star_border_test.dart b/packages/flutter/test/painting/star_border_test.dart index fe336f1680adb..d7994859a9718 100644 --- a/packages/flutter/test/painting/star_border_test.dart +++ b/packages/flutter/test/painting/star_border_test.dart @@ -105,9 +105,9 @@ void main() { await testBorder(tester, 'side_1', const StarBorder(side: BorderSide(color: Color(0xffff0000)))); await testBorder(tester, 'side_10', const StarBorder(side: BorderSide(color: Color(0xffff0000), width: 10))); await testBorder(tester, 'side_align_center', - const StarBorder(side: BorderSide(color: Color(0xffff0000), strokeAlign: StrokeAlign.center))); + const StarBorder(side: BorderSide(color: Color(0xffff0000), strokeAlign: BorderSide.strokeAlignCenter))); await testBorder(tester, 'side_align_outside', - const StarBorder(side: BorderSide(color: Color(0xffff0000), strokeAlign: StrokeAlign.outside))); + const StarBorder(side: BorderSide(color: Color(0xffff0000), strokeAlign: BorderSide.strokeAlignOutside))); }); testWidgets('StarBorder.polygon parameters', (WidgetTester tester) async { @@ -127,9 +127,9 @@ void main() { await testBorder( tester, 'poly_side_10', const StarBorder.polygon(side: BorderSide(color: Color(0xffff0000), width: 10))); await testBorder(tester, 'poly_side_align_center', - const StarBorder.polygon(side: BorderSide(color: Color(0xffff0000), strokeAlign: StrokeAlign.center))); + const StarBorder.polygon(side: BorderSide(color: Color(0xffff0000), strokeAlign: BorderSide.strokeAlignCenter))); await testBorder(tester, 'poly_side_align_outside', - const StarBorder.polygon(side: BorderSide(color: Color(0xffff0000), strokeAlign: StrokeAlign.outside))); + const StarBorder.polygon(side: BorderSide(color: Color(0xffff0000), strokeAlign: BorderSide.strokeAlignOutside))); }); testWidgets('StarBorder lerped with StarBorder', (WidgetTester tester) async { From d2597ef763d7a01e2042d66af315f04d6d0958f6 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 16:23:08 -0400 Subject: [PATCH 10/29] Roll Flutter Engine from 544c34102586 to 92bc431e097d (3 revisions) (#109873) --- 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 b699af7f81cae..edc570700a568 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -544c34102586e4c8ea77c6b536cb726c3686e810 +92bc431e097d57ac4a1f21c25e996c98d23197b4 From 646666f8e794cbae0400930c382f637601da0707 Mon Sep 17 00:00:00 2001 From: Tae Hyung Kim Date: Fri, 19 Aug 2022 14:03:42 -0700 Subject: [PATCH 11/29] [gen_l10n] Add option to format generated localizations files (#109171) * init * fix * fix 2 * fix 3 * tests * fix tests * clarify help text * fix all tests * fix formatting? * add second test * unused import * remove print * trailing spaces * artifacts is never null * fix --- packages/flutter_tools/lib/executable.dart | 2 + .../src/commands/generate_localizations.dart | 122 +++++++++++------- .../lib/src/localizations/gen_l10n.dart | 23 ++-- .../localizations/localizations_utils.dart | 7 + .../hermetic/generate_localizations_test.dart | 114 ++++++++++++++-- 5 files changed, 199 insertions(+), 69 deletions(-) diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index 944ec4ae074d2..94b4f51bc622b 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -178,6 +178,8 @@ List generateCommands({ GenerateLocalizationsCommand( fileSystem: globals.fs, logger: globals.logger, + artifacts: globals.artifacts!, + processManager: globals.processManager, ), InstallCommand(), LogsCommand(), diff --git a/packages/flutter_tools/lib/src/commands/generate_localizations.dart b/packages/flutter_tools/lib/src/commands/generate_localizations.dart index 74a6678a0140e..f7e320b85708e 100644 --- a/packages/flutter_tools/lib/src/commands/generate_localizations.dart +++ b/packages/flutter_tools/lib/src/commands/generate_localizations.dart @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:process/process.dart'; + +import '../artifacts.dart'; import '../base/common.dart'; import '../base/file_system.dart'; +import '../base/io.dart'; import '../base/logger.dart'; import '../globals.dart' as globals; import '../localizations/gen_l10n.dart'; @@ -21,9 +25,13 @@ class GenerateLocalizationsCommand extends FlutterCommand { GenerateLocalizationsCommand({ required FileSystem fileSystem, required Logger logger, + required Artifacts artifacts, + required ProcessManager processManager, }) : _fileSystem = fileSystem, - _logger = logger { + _logger = logger, + _artifacts = artifacts, + _processManager = processManager { argParser.addOption( 'arb-dir', defaultsTo: globals.fs.path.join('lib', 'l10n'), @@ -180,10 +188,16 @@ class GenerateLocalizationsCommand extends FlutterCommand { 'Localizations.of(context), removing the need for null checking in ' 'user code.' ); + argParser.addFlag( + 'format', + help: 'When specified, the "dart format" command is run after generating the localization files.' + ); } final FileSystem _fileSystem; final Logger _logger; + final Artifacts _artifacts; + final ProcessManager _processManager; @override String get description => 'Generate localizations for the current project.'; @@ -196,6 +210,10 @@ class GenerateLocalizationsCommand extends FlutterCommand { @override Future runCommand() async { + List outputFileList; + + bool format = boolArg('format') ?? false; + if (_fileSystem.file('l10n.yaml').existsSync()) { final LocalizationOptions options = parseLocalizationsOptions( file: _fileSystem.file('l10n.yaml'), @@ -207,57 +225,71 @@ class GenerateLocalizationsCommand extends FlutterCommand { 'To use the command line arguments, delete the l10n.yaml file in the ' 'Flutter project.\n\n' ); - generateLocalizations( + outputFileList = generateLocalizations( logger: _logger, options: options, projectDir: _fileSystem.currentDirectory, fileSystem: _fileSystem, - ); - return FlutterCommandResult.success(); - } + ).outputFileList; + format = format || options.format; + } else { + final String inputPathString = stringArgDeprecated('arb-dir')!; // Has default value, cannot be null. + final String? outputPathString = stringArgDeprecated('output-dir'); + final String outputFileString = stringArgDeprecated('output-localization-file')!; // Has default value, cannot be null. + final String templateArbFileName = stringArgDeprecated('template-arb-file')!; // Has default value, cannot be null. + final String? untranslatedMessagesFile = stringArgDeprecated('untranslated-messages-file'); + final String classNameString = stringArgDeprecated('output-class')!; // Has default value, cannot be null. + final List preferredSupportedLocales = stringsArg('preferred-supported-locales'); + final String? headerString = stringArgDeprecated('header'); + final String? headerFile = stringArgDeprecated('header-file'); + final bool useDeferredLoading = boolArgDeprecated('use-deferred-loading'); + final String? inputsAndOutputsListPath = stringArgDeprecated('gen-inputs-and-outputs-list'); + final bool useSyntheticPackage = boolArgDeprecated('synthetic-package'); + final String? projectPathString = stringArgDeprecated('project-dir'); + final bool areResourceAttributesRequired = boolArgDeprecated('required-resource-attributes'); + final bool usesNullableGetter = boolArgDeprecated('nullable-getter'); - final String inputPathString = stringArgDeprecated('arb-dir')!; // Has default value, cannot be null. - final String? outputPathString = stringArgDeprecated('output-dir'); - final String outputFileString = stringArgDeprecated('output-localization-file')!; // Has default value, cannot be null. - final String templateArbFileName = stringArgDeprecated('template-arb-file')!; // Has default value, cannot be null. - final String? untranslatedMessagesFile = stringArgDeprecated('untranslated-messages-file'); - final String classNameString = stringArgDeprecated('output-class')!; // Has default value, cannot be null. - final List preferredSupportedLocales = stringsArg('preferred-supported-locales'); - final String? headerString = stringArgDeprecated('header'); - final String? headerFile = stringArgDeprecated('header-file'); - final bool useDeferredLoading = boolArgDeprecated('use-deferred-loading'); - final String? inputsAndOutputsListPath = stringArgDeprecated('gen-inputs-and-outputs-list'); - final bool useSyntheticPackage = boolArgDeprecated('synthetic-package'); - final String? projectPathString = stringArgDeprecated('project-dir'); - final bool areResourceAttributesRequired = boolArgDeprecated('required-resource-attributes'); - final bool usesNullableGetter = boolArgDeprecated('nullable-getter'); + precacheLanguageAndRegionTags(); - precacheLanguageAndRegionTags(); + try { + outputFileList = (LocalizationsGenerator( + fileSystem: _fileSystem, + inputPathString: inputPathString, + outputPathString: outputPathString, + templateArbFileName: templateArbFileName, + outputFileString: outputFileString, + classNameString: classNameString, + preferredSupportedLocales: preferredSupportedLocales, + headerString: headerString, + headerFile: headerFile, + useDeferredLoading: useDeferredLoading, + inputsAndOutputsListPath: inputsAndOutputsListPath, + useSyntheticPackage: useSyntheticPackage, + projectPathString: projectPathString, + areResourceAttributesRequired: areResourceAttributesRequired, + untranslatedMessagesFile: untranslatedMessagesFile, + usesNullableGetter: usesNullableGetter, + logger: _logger, + ) + ..loadResources() + ..writeOutputFiles()) + .outputFileList; + } on L10nException catch (e) { + throwToolExit(e.message); + } + } - try { - LocalizationsGenerator( - fileSystem: _fileSystem, - inputPathString: inputPathString, - outputPathString: outputPathString, - templateArbFileName: templateArbFileName, - outputFileString: outputFileString, - classNameString: classNameString, - preferredSupportedLocales: preferredSupportedLocales, - headerString: headerString, - headerFile: headerFile, - useDeferredLoading: useDeferredLoading, - inputsAndOutputsListPath: inputsAndOutputsListPath, - useSyntheticPackage: useSyntheticPackage, - projectPathString: projectPathString, - areResourceAttributesRequired: areResourceAttributesRequired, - untranslatedMessagesFile: untranslatedMessagesFile, - usesNullableGetter: usesNullableGetter, - logger: _logger, - ) - ..loadResources() - ..writeOutputFiles(); - } on L10nException catch (e) { - throwToolExit(e.message); + // All other post processing. + if (format) { + if (outputFileList.isEmpty) { + return FlutterCommandResult.success(); + } + final String dartBinary = _artifacts.getHostArtifact(HostArtifact.engineDartBinary).path; + final List command = [dartBinary, 'format', ...outputFileList]; + final ProcessResult result = await _processManager.run(command); + if (result.exitCode != 0) { + throwToolExit('Formatting failed: $result', exitCode: result.exitCode); + } } return FlutterCommandResult.success(); diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart index 208c2866dea44..e14fbdd17b9ef 100644 --- a/packages/flutter_tools/lib/src/localizations/gen_l10n.dart +++ b/packages/flutter_tools/lib/src/localizations/gen_l10n.dart @@ -811,6 +811,10 @@ class LocalizationsGenerator { return _allBundles.bundles.map((AppResourceBundle bundle) => bundle.file.path).toList(); } + List get outputFileList { + return _outputFileList; + } + /// The supported language codes as found in the arb files located in /// [inputDirectory]. final Set supportedLanguageCodes = {}; @@ -1339,7 +1343,7 @@ class LocalizationsGenerator { || message.placeholdersRequireFormatting; }); - void writeOutputFiles({ bool isFromYaml = false }) { + List writeOutputFiles({ bool isFromYaml = false }) { // First, generate the string contents of all necessary files. final String generatedLocalizationsFile = _generateCode(); @@ -1372,9 +1376,7 @@ class LocalizationsGenerator { // Generate the required files for localizations. _languageFileMap.forEach((File file, String contents) { file.writeAsStringSync(contents); - if (inputsAndOutputsListFile != null) { - _outputFileList.add(file.absolute.path); - } + _outputFileList.add(file.absolute.path); }); baseOutputFile.writeAsStringSync(generatedLocalizationsFile); @@ -1407,9 +1409,8 @@ class LocalizationsGenerator { ); } final File? inputsAndOutputsListFileLocal = inputsAndOutputsListFile; + _outputFileList.add(baseOutputFile.absolute.path); if (inputsAndOutputsListFileLocal != null) { - _outputFileList.add(baseOutputFile.absolute.path); - // Generate a JSON file containing the inputs and outputs of the gen_l10n script. if (!inputsAndOutputsListFileLocal.existsSync()) { inputsAndOutputsListFileLocal.createSync(recursive: true); @@ -1422,14 +1423,14 @@ class LocalizationsGenerator { }), ); } + + return _outputFileList; } void _generateUntranslatedMessagesFile(Logger logger, File untranslatedMessagesFile) { if (_unimplementedMessages.isEmpty) { untranslatedMessagesFile.writeAsStringSync('{}'); - if (inputsAndOutputsListFile != null) { - _outputFileList.add(untranslatedMessagesFile.absolute.path); - } + _outputFileList.add(untranslatedMessagesFile.absolute.path); return; } @@ -1457,8 +1458,6 @@ class LocalizationsGenerator { resultingFile += '}\n'; untranslatedMessagesFile.writeAsStringSync(resultingFile); - if (inputsAndOutputsListFile != null) { - _outputFileList.add(untranslatedMessagesFile.absolute.path); - } + _outputFileList.add(untranslatedMessagesFile.absolute.path); } } diff --git a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart index a8e413526670e..d001c56026e4c 100644 --- a/packages/flutter_tools/lib/src/localizations/localizations_utils.dart +++ b/packages/flutter_tools/lib/src/localizations/localizations_utils.dart @@ -311,6 +311,7 @@ class LocalizationOptions { this.useSyntheticPackage = true, this.areResourceAttributesRequired = false, this.usesNullableGetter = true, + this.format = false, }) : assert(useSyntheticPackage != null); /// The `--arb-dir` argument. @@ -377,6 +378,11 @@ class LocalizationOptions { /// /// Whether or not the localizations class getter is nullable. final bool usesNullableGetter; + + /// The `format` argument. + /// + /// Whether or not to format the generated files. + final bool format; } /// Parse the localizations configuration options from [file]. @@ -411,6 +417,7 @@ LocalizationOptions parseLocalizationsOptions({ useSyntheticPackage: _tryReadBool(yamlNode, 'synthetic-package', logger) ?? true, areResourceAttributesRequired: _tryReadBool(yamlNode, 'required-resource-attributes', logger) ?? false, usesNullableGetter: _tryReadBool(yamlNode, 'nullable-getter', logger) ?? true, + format: _tryReadBool(yamlNode, 'format', logger) ?? true, ); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/generate_localizations_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/generate_localizations_test.dart index 89d19d532812a..85d7b917e34e7 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/generate_localizations_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/generate_localizations_test.dart @@ -5,19 +5,23 @@ // @dart = 2.8 import 'package:file/memory.dart'; +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/cache.dart'; import 'package:flutter_tools/src/commands/generate_localizations.dart'; -import 'package:flutter_tools/src/runner/flutter_command.dart'; import '../../integration.shard/test_data/basic_project.dart'; import '../../src/common.dart'; import '../../src/context.dart'; +import '../../src/fake_process_manager.dart'; import '../../src/test_flutter_command_runner.dart'; void main() { FileSystem fileSystem; + BufferLogger logger; + Artifacts artifacts; + FakeProcessManager processManager; setUpAll(() { Cache.disableLocking(); @@ -25,10 +29,12 @@ void main() { setUp(() { fileSystem = MemoryFileSystem.test(); + logger = BufferLogger.test(); + artifacts = Artifacts.test(); + processManager = FakeProcessManager.empty(); }); testUsingContext('default l10n settings', () async { - final BufferLogger logger = BufferLogger.test(); final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) ..createSync(recursive: true); arbFile.writeAsStringSync(''' @@ -41,11 +47,11 @@ void main() { final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( fileSystem: fileSystem, logger: logger, + artifacts: artifacts, + processManager: processManager, ); await createTestCommandRunner(command).run(['gen-l10n']); - final FlutterCommandResult result = await command.runCommand(); - expect(result.exitStatus, ExitStatus.success); final Directory outputDirectory = fileSystem.directory(fileSystem.path.join('.dart_tool', 'flutter_gen', 'gen_l10n')); expect(outputDirectory.existsSync(), true); expect(outputDirectory.childFile('app_localizations_en.dart').existsSync(), true); @@ -56,7 +62,6 @@ void main() { }); testUsingContext('not using synthetic packages', () async { - final BufferLogger logger = BufferLogger.test(); final Directory l10nDirectory = fileSystem.directory( fileSystem.path.join('lib', 'l10n'), ); @@ -75,14 +80,14 @@ void main() { final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( fileSystem: fileSystem, logger: logger, + artifacts: artifacts, + processManager: processManager, ); await createTestCommandRunner(command).run([ 'gen-l10n', '--no-synthetic-package', ]); - final FlutterCommandResult result = await command.runCommand(); - expect(result.exitStatus, ExitStatus.success); expect(l10nDirectory.existsSync(), true); expect(l10nDirectory.childFile('app_localizations_en.dart').existsSync(), true); expect(l10nDirectory.childFile('app_localizations.dart').existsSync(), true); @@ -92,7 +97,6 @@ void main() { }); testUsingContext('throws error when arguments are invalid', () async { - final BufferLogger logger = BufferLogger.test(); final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) ..createSync(recursive: true); arbFile.writeAsStringSync(''' @@ -107,6 +111,8 @@ void main() { final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( fileSystem: fileSystem, logger: logger, + artifacts: artifacts, + processManager: processManager, ); expect( () => createTestCommandRunner(command).run([ @@ -122,7 +128,6 @@ void main() { }); testUsingContext('l10n yaml file takes precedence over command line arguments', () async { - final BufferLogger logger = BufferLogger.test(); final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) ..createSync(recursive: true); arbFile.writeAsStringSync(''' @@ -138,11 +143,11 @@ void main() { final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( fileSystem: fileSystem, logger: logger, + artifacts: artifacts, + processManager: processManager, ); await createTestCommandRunner(command).run(['gen-l10n']); - final FlutterCommandResult result = await command.runCommand(); - expect(result.exitStatus, ExitStatus.success); expect(logger.statusText, contains('Because l10n.yaml exists, the options defined there will be used instead.')); final Directory outputDirectory = fileSystem.directory(fileSystem.path.join('.dart_tool', 'flutter_gen', 'gen_l10n')); expect(outputDirectory.existsSync(), true); @@ -154,7 +159,6 @@ void main() { }); testUsingContext('nullable-getter help message is expected string', () async { - final BufferLogger logger = BufferLogger.test(); final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) ..createSync(recursive: true); arbFile.writeAsStringSync(''' @@ -170,6 +174,8 @@ void main() { final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( fileSystem: fileSystem, logger: logger, + artifacts: artifacts, + processManager: processManager, ); await createTestCommandRunner(command).run(['gen-l10n']); expect(command.usage, contains(' If this value is set to false, then ')); @@ -177,4 +183,88 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), }); + + testUsingContext('dart format is run when --format is passed', () async { + final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) + ..createSync(recursive: true); + arbFile.writeAsStringSync(''' +{ + "helloWorld": "Hello, World!", + "@helloWorld": { + "description": "Sample description" + } +}'''); + processManager.addCommand( + const FakeCommand( + command: [ + 'HostArtifact.engineDartBinary', + 'format', + '/.dart_tool/flutter_gen/gen_l10n/app_localizations_en.dart', + '/.dart_tool/flutter_gen/gen_l10n/app_localizations.dart', + ] + ) + ); + + final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( + fileSystem: fileSystem, + logger: logger, + artifacts: artifacts, + processManager: processManager, + ); + + await createTestCommandRunner(command).run(['gen-l10n', '--format']); + + final Directory outputDirectory = fileSystem.directory(fileSystem.path.join('.dart_tool', 'flutter_gen', 'gen_l10n')); + expect(outputDirectory.existsSync(), true); + expect(outputDirectory.childFile('app_localizations_en.dart').existsSync(), true); + expect(outputDirectory.childFile('app_localizations.dart').existsSync(), true); + expect(processManager, hasNoRemainingExpectations); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + }); + + testUsingContext('dart format is run when format: true is passed into l10n.yaml', () async { + final File arbFile = fileSystem.file(fileSystem.path.join('lib', 'l10n', 'app_en.arb')) + ..createSync(recursive: true); + arbFile.writeAsStringSync(''' +{ + "helloWorld": "Hello, World!", + "@helloWorld": { + "description": "Sample description" + } +}'''); + final File configFile = fileSystem.file('l10n.yaml')..createSync(); + configFile.writeAsStringSync(''' +format: true +'''); + final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync(); + pubspecFile.writeAsStringSync(BasicProjectWithFlutterGen().pubspec); + processManager.addCommand( + const FakeCommand( + command: [ + 'HostArtifact.engineDartBinary', + 'format', + '/.dart_tool/flutter_gen/gen_l10n/app_localizations_en.dart', + '/.dart_tool/flutter_gen/gen_l10n/app_localizations.dart', + ] + ) + ); + final GenerateLocalizationsCommand command = GenerateLocalizationsCommand( + fileSystem: fileSystem, + logger: logger, + artifacts: artifacts, + processManager: processManager, + ); + await createTestCommandRunner(command).run(['gen-l10n']); + + final Directory outputDirectory = fileSystem.directory(fileSystem.path.join('.dart_tool', 'flutter_gen', 'gen_l10n')); + expect(outputDirectory.existsSync(), true); + expect(outputDirectory.childFile('app_localizations_en.dart').existsSync(), true); + expect(outputDirectory.childFile('app_localizations.dart').existsSync(), true); + expect(processManager, hasNoRemainingExpectations); + }, overrides: { + FileSystem: () => fileSystem, + ProcessManager: () => FakeProcessManager.any(), + }); } From e271e8428b2e5a38898157304753298be8812f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20S=20Guerrero?= Date: Fri, 19 Aug 2022 14:18:49 -0700 Subject: [PATCH 12/29] add GeneralInfo project validator to analyze --suggestions (#109874) --- packages/flutter_tools/lib/executable.dart | 2 +- packages/flutter_tools/lib/src/commands/analyze.dart | 4 ++++ packages/flutter_tools/test/general.shard/args_test.dart | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index 94b4f51bc622b..546dc98ae73fe 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -143,7 +143,7 @@ List generateCommands({ terminal: globals.terminal, artifacts: globals.artifacts!, // new ProjectValidators should be added here for the --suggestions to run - allProjectValidators: [], + allProjectValidators: [GeneralInfoProjectValidator()], ), AssembleCommand(verboseHelp: verboseHelp, buildSystem: globals.buildSystem), AttachCommand(verboseHelp: verboseHelp), diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index e63d2a42793b1..fde75ada7091a 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.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 'package:meta/meta.dart'; import 'package:process/process.dart'; import '../artifacts.dart'; @@ -112,6 +113,9 @@ class AnalyzeCommand extends FlutterCommand { @override String get category => FlutterCommandCategory.project; + @visibleForTesting + List allProjectValidators() => _allProjectValidators; + @override bool get shouldRunPub { // If they're not analyzing the current project. diff --git a/packages/flutter_tools/test/general.shard/args_test.dart b/packages/flutter_tools/test/general.shard/args_test.dart index 569006bab8c6e..4725e37d2aa65 100644 --- a/packages/flutter_tools/test/general.shard/args_test.dart +++ b/packages/flutter_tools/test/general.shard/args_test.dart @@ -7,6 +7,7 @@ import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:flutter_tools/executable.dart' as executable; +import 'package:flutter_tools/src/commands/analyze.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; @@ -23,6 +24,12 @@ void main() { verbose: true, ).forEach(runner.addCommand); verifyCommandRunner(runner); + for (final Command command in runner.commands.values) { + if(command.name == 'analyze') { + final AnalyzeCommand analyze = command as AnalyzeCommand; + expect(analyze.allProjectValidators().length, 1); + } + } })); testUsingContext('bool? safe argResults', () async { From c34dd444481c40d9bb0a8bcad0d9dded2eb3af02 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 17:27:07 -0400 Subject: [PATCH 13/29] Roll Flutter Engine from 92bc431e097d to c1ce554ac5bd (1 revision) (#109876) --- 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 edc570700a568..d464f0506aa3a 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -92bc431e097d57ac4a1f21c25e996c98d23197b4 +c1ce554ac5bd3686a2e8c29ce0ff93266b568182 From 43822a12637efd60c8ebe6b887d8a6f00043a225 Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Fri, 19 Aug 2022 16:25:36 -0700 Subject: [PATCH 14/29] mark flaky (#109890) --- .ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci.yaml b/.ci.yaml index 244a29466247a..0ff3d87c8b97e 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -3000,6 +3000,7 @@ targets: - name: Mac_android run_release_test recipe: devicelab/devicelab_drone + bringup: true # Flaky https://github.com/flutter/flutter/issues/105715 presubmit: false runIf: - dev/** @@ -3011,6 +3012,7 @@ targets: - name: Mac_arm64_android run_release_test recipe: devicelab/devicelab_drone + bringup: true # Flaky https://github.com/flutter/flutter/issues/105715 presubmit: false runIf: - dev/** From 8f1d0798faec1514c97f84ebc620cc748788a42f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Aug 2022 23:27:33 +0000 Subject: [PATCH 15/29] Bump github/codeql-action from 2.1.18 to 2.1.19 (#109888) --- .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 a629695cea7e4..88b7272c4a7bd 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -49,6 +49,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@2ca79b6fa8d3ec278944088b4aa5f46912db5d63 + uses: github/codeql-action/upload-sarif@f5d217be74900c6ac8fbbe53f3c10376ba4e64da with: sarif_file: results.sarif From 74f5a1fe2c6bd1126e18a76f2322e8b8576a5daf Mon Sep 17 00:00:00 2001 From: hellohuanlin <41930132+hellohuanlin@users.noreply.github.com> Date: Fri, 19 Aug 2022 16:28:36 -0700 Subject: [PATCH 16/29] [platform_view]fix typo in xcuitest (#109884) --- .../ios/PlatformViewUITests/PlatformViewUITests.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/integration_tests/ios_platform_view_tests/ios/PlatformViewUITests/PlatformViewUITests.m b/dev/integration_tests/ios_platform_view_tests/ios/PlatformViewUITests/PlatformViewUITests.m index adcf947cb6c81..3582aea93a0dc 100644 --- a/dev/integration_tests/ios_platform_view_tests/ios/PlatformViewUITests/PlatformViewUITests.m +++ b/dev/integration_tests/ios_platform_view_tests/ios/PlatformViewUITests/PlatformViewUITests.m @@ -23,7 +23,7 @@ @interface PlatformViewUITests : XCTestCase @implementation PlatformViewUITests - (void)setUp { - [super setup]; + [super setUp]; self.continueAfterFailure = NO; self.app = [[XCUIApplication alloc] init]; From ba8bc53825dea9eff1f3bbd9f6bd79a7b455c5f2 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Fri, 19 Aug 2022 16:30:19 -0700 Subject: [PATCH 17/29] Add some logs to catch flake (#109887) --- dev/integration_tests/channels/test_driver/main_test.dart | 1 + packages/flutter/lib/src/gestures/binding.dart | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dev/integration_tests/channels/test_driver/main_test.dart b/dev/integration_tests/channels/test_driver/main_test.dart index 7f9f17175ff0e..17cee4a44fd53 100644 --- a/dev/integration_tests/channels/test_driver/main_test.dart +++ b/dev/integration_tests/channels/test_driver/main_test.dart @@ -18,6 +18,7 @@ void main() { final SerializableFinder statusField = find.byValueKey('status'); int step = 0; while (await driver.getText(statusField) == 'ok') { + print('Tapping for step $step...'); await driver.tap(stepButton); step++; } diff --git a/packages/flutter/lib/src/gestures/binding.dart b/packages/flutter/lib/src/gestures/binding.dart index 2555a3d2247b4..65534fbc45e0f 100644 --- a/packages/flutter/lib/src/gestures/binding.dart +++ b/packages/flutter/lib/src/gestures/binding.dart @@ -360,7 +360,7 @@ mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, H void _handlePointerEventImmediately(PointerEvent event) { HitTestResult? hitTestResult; if (event is PointerDownEvent || event is PointerSignalEvent || event is PointerHoverEvent || event is PointerPanZoomStartEvent) { - assert(!_hitTests.containsKey(event.pointer)); + assert(!_hitTests.containsKey(event.pointer), 'Pointer of $event unexpectedly has a HitTestResult associated with it.'); hitTestResult = HitTestResult(); hitTest(hitTestResult, event.position); if (event is PointerDownEvent || event is PointerPanZoomStartEvent) { From 2e90fb4e928136856bfe9968d0a82f07ddf99477 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 19:34:31 -0400 Subject: [PATCH 18/29] Roll Flutter Engine from c1ce554ac5bd to a418ffad89a9 (4 revisions) (#109882) --- 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 d464f0506aa3a..d007625b79c24 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -c1ce554ac5bd3686a2e8c29ce0ff93266b568182 +a418ffad89a99c2a32f4e843b715fd217f3e5764 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index 4b5ae731a02a1..c9ffa54bfd625 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ --NNSCH3WIpT1x-ZpP3cDjMDYEmdhGciRL4ixvBkopcEC +qkLLOLyDJFclyuGN7WP78QrAKS80W6F6H6WNl_K4pzIC From 94d578f9bb67d180b18e3e548c0c685f0edca291 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 20:36:15 -0400 Subject: [PATCH 19/29] Roll Flutter Engine from a418ffad89a9 to 94d07855d7a4 (3 revisions) (#109893) --- 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 d007625b79c24..dd4f25c077140 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -a418ffad89a99c2a32f4e843b715fd217f3e5764 +94d07855d7a4fee611abdd61775d88a158fcdba0 From 1bae238356204fde5e7e211530dd7c9719a38762 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 21:46:18 -0400 Subject: [PATCH 20/29] Roll Flutter Engine from 94d07855d7a4 to a7868e9567fc (3 revisions) (#109895) --- 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 dd4f25c077140..0dbebec0a0b9a 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -94d07855d7a4fee611abdd61775d88a158fcdba0 +a7868e9567fc898a81fd827c9904f73b8de48c35 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 19ea1635b167a..2b9e63083b67f 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -MQoH-sefjYwKG_X2hv8qKJfSW15nnrtuAJbJMEHFsOsC +kTnpJXzVrlaAf7aycDF3ql8314jLLTrqhWheqF9PQiUC From 35d9bef95a1bcb3847d7e42c469fe8f842710a7d Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 22:32:26 -0400 Subject: [PATCH 21/29] Roll Flutter Engine from a7868e9567fc to a0dcde4fb611 (1 revision) (#109897) --- 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 0dbebec0a0b9a..f0ee43f19a990 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -a7868e9567fc898a81fd827c9904f73b8de48c35 +a0dcde4fb611f36bfabc95d526949c2669b6e63f From 44d3181deb9936d6c72a786a5acc06c669680e43 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 19 Aug 2022 20:06:23 -0700 Subject: [PATCH 22/29] [framework] remove restriction on texture layer rasterization (#109900) --- packages/flutter/lib/src/rendering/layer.dart | 6 ------ packages/flutter/test/rendering/layers_test.dart | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index 0e1965f22a29e..34626293766b9 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -887,12 +887,6 @@ class TextureLayer extends Layer { /// The identity of the backend texture. final int textureId; - // TODO(jonahwilliams): remove once https://github.com/flutter/flutter/issues/107576 is fixed. - @override - bool supportsRasterization() { - return false; - } - /// When true the texture will not be updated with new frames. /// /// This is used for resizing embedded Android views: when resizing there diff --git a/packages/flutter/test/rendering/layers_test.dart b/packages/flutter/test/rendering/layers_test.dart index 090a0204ff7b3..f8c4bf58e1586 100644 --- a/packages/flutter/test/rendering/layers_test.dart +++ b/packages/flutter/test/rendering/layers_test.dart @@ -1010,6 +1010,7 @@ void main() { final PhysicalModelLayer physicalModelLayer = PhysicalModelLayer(); final ColorFilterLayer colorFilterLayer = ColorFilterLayer(); final ShaderMaskLayer shaderMaskLayer = ShaderMaskLayer(); + final TextureLayer textureLayer = TextureLayer(rect: Rect.zero, textureId: 1); expect(offsetLayer.supportsRasterization(), true); expect(opacityLayer.supportsRasterization(), true); expect(clipRectLayer.supportsRasterization(), true); @@ -1019,12 +1020,11 @@ void main() { expect(physicalModelLayer.supportsRasterization(), true); expect(colorFilterLayer.supportsRasterization(), true); expect(shaderMaskLayer.supportsRasterization(), true); + expect(textureLayer.supportsRasterization(), true); // Unsupported. - final TextureLayer textureLayer = TextureLayer(rect: Rect.zero, textureId: 1); final PlatformViewLayer platformViewLayer = PlatformViewLayer(rect: Rect.zero, viewId: 1); - expect(textureLayer.supportsRasterization(), false); expect(platformViewLayer.supportsRasterization(), false); }); } From 35ade096e0dddb13ecf99526ad27e2185b3377e1 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Fri, 19 Aug 2022 23:10:06 -0400 Subject: [PATCH 23/29] Roll Flutter Engine from a0dcde4fb611 to 7fb831136168 (2 revisions) (#109901) --- 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 f0ee43f19a990..357c09dc5ff8e 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -a0dcde4fb611f36bfabc95d526949c2669b6e63f +7fb83113616834b197d97b8052309a0bcc710bce From 93541e9cb6a9ba46c40e624b31c475bb01be559d Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 00:06:23 -0400 Subject: [PATCH 24/29] Roll Flutter Engine from 7fb831136168 to 98c567732402 (1 revision) (#109903) --- 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 357c09dc5ff8e..02279f0ae5f11 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -7fb83113616834b197d97b8052309a0bcc710bce +98c567732402ebb0d4bade7b3bf2cbced15cb400 From 654512d7675402da9efd79c1c427efcc363e2db5 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 02:52:39 -0400 Subject: [PATCH 25/29] Roll Flutter Engine from 98c567732402 to 835ba6b38df1 (1 revision) (#109909) --- 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 02279f0ae5f11..b34a1359a251a 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -98c567732402ebb0d4bade7b3bf2cbced15cb400 +835ba6b38df15d5397a1e6d4fa05cf81f0f37233 From 3b65e01dd445dcca7ac7b7c8e309c0cfccf14f98 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 04:36:28 -0400 Subject: [PATCH 26/29] Roll Flutter Engine from 835ba6b38df1 to 1e63130d7b4e (1 revision) (#109913) --- 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 b34a1359a251a..f4bad7054c121 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -835ba6b38df15d5397a1e6d4fa05cf81f0f37233 +1e63130d7b4e87c1957238901ed3d23b85708c1f From 892c4f0cb123b791c895152aef51690a80c0422f Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 06:10:02 -0400 Subject: [PATCH 27/29] Roll Flutter Engine from 1e63130d7b4e to 06900c486cee (1 revision) (#109915) --- 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 f4bad7054c121..01554219a44e9 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -1e63130d7b4e87c1957238901ed3d23b85708c1f +06900c486cee1a16f373812a9add855253f97006 diff --git a/bin/internal/fuchsia-linux.version b/bin/internal/fuchsia-linux.version index c9ffa54bfd625..a5f6e6333e396 100644 --- a/bin/internal/fuchsia-linux.version +++ b/bin/internal/fuchsia-linux.version @@ -1 +1 @@ -qkLLOLyDJFclyuGN7WP78QrAKS80W6F6H6WNl_K4pzIC +JcqRURLnM_MMMLosspwpUXzH9GMkNtTtV8DUKPOwxR0C From 6a4e26e67c0a7de7a839b3de69567e21471b4ce6 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 08:28:25 -0400 Subject: [PATCH 28/29] Roll Flutter Engine from 06900c486cee to 0005149dca9b (1 revision) (#109917) --- 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 01554219a44e9..1c15219edecb0 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -06900c486cee1a16f373812a9add855253f97006 +0005149dca9b248663adcde4bdd7c6c915a76584 From 723609bff1f7eae8031079ae503b3b70432fc903 Mon Sep 17 00:00:00 2001 From: engine-flutter-autoroll Date: Sat, 20 Aug 2022 09:14:25 -0400 Subject: [PATCH 29/29] Roll Flutter Engine from 0005149dca9b to d89aae21e9fe (2 revisions) (#109922) --- 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 1c15219edecb0..ab612060fa6df 100644 --- a/bin/internal/engine.version +++ b/bin/internal/engine.version @@ -1 +1 @@ -0005149dca9b248663adcde4bdd7c6c915a76584 +d89aae21e9febc87c23d4f47b34321514da341f1 diff --git a/bin/internal/fuchsia-mac.version b/bin/internal/fuchsia-mac.version index 2b9e63083b67f..992e86e17b974 100644 --- a/bin/internal/fuchsia-mac.version +++ b/bin/internal/fuchsia-mac.version @@ -1 +1 @@ -kTnpJXzVrlaAf7aycDF3ql8314jLLTrqhWheqF9PQiUC +GoVI4_nQlpH4f6MhogqMtnySlEG3BP5Q4nPf2XWOOF8C