diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart index c59267961a..3e6877186f 100644 --- a/packages/flutter/lib/src/rendering/binding.dart +++ b/packages/flutter/lib/src/rendering/binding.dart @@ -9,6 +9,7 @@ /// @docImport 'layer.dart'; library; +import 'dart:async'; import 'dart:ui' as ui show PictureRecorder, SceneBuilder, SemanticsUpdate; import 'package:flutter/foundation.dart'; @@ -85,43 +86,49 @@ mixin RendererBinding setter: (bool value) async { if (debugInvertOversizedImages != value) { debugInvertOversizedImages = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); } - return Future.value(); }, ); registerBoolServiceExtension( name: RenderingServiceExtensions.debugPaint.name, getter: () async => debugPaintSizeEnabled, - setter: (bool value) { + setter: (bool value) async { if (debugPaintSizeEnabled == value) { - return Future.value(); + return; } debugPaintSizeEnabled = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); }, ); registerBoolServiceExtension( name: RenderingServiceExtensions.debugPaintBaselinesEnabled.name, getter: () async => debugPaintBaselinesEnabled, - setter: (bool value) { + setter: (bool value) async { if (debugPaintBaselinesEnabled == value) { - return Future.value(); + return; } debugPaintBaselinesEnabled = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); }, ); registerBoolServiceExtension( name: RenderingServiceExtensions.repaintRainbow.name, getter: () async => debugRepaintRainbowEnabled, - setter: (bool value) { + setter: (bool value) async { final bool repaint = debugRepaintRainbowEnabled && !value; debugRepaintRainbowEnabled = value; if (repaint) { - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); } - return Future.value(); }, ); registerServiceExtension( @@ -133,34 +140,40 @@ mixin RendererBinding registerBoolServiceExtension( name: RenderingServiceExtensions.debugDisableClipLayers.name, getter: () async => debugDisableClipLayers, - setter: (bool value) { + setter: (bool value) async { if (debugDisableClipLayers == value) { - return Future.value(); + return; } debugDisableClipLayers = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); }, ); registerBoolServiceExtension( name: RenderingServiceExtensions.debugDisablePhysicalShapeLayers.name, getter: () async => debugDisablePhysicalShapeLayers, - setter: (bool value) { + setter: (bool value) async { if (debugDisablePhysicalShapeLayers == value) { - return Future.value(); + return; } debugDisablePhysicalShapeLayers = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); }, ); registerBoolServiceExtension( name: RenderingServiceExtensions.debugDisableOpacityLayers.name, getter: () async => debugDisableOpacityLayers, - setter: (bool value) { + setter: (bool value) async { if (debugDisableOpacityLayers == value) { - return Future.value(); + return; } debugDisableOpacityLayers = value; - return _forceRepaint(); + // We don't want to block the vm service response on the frame + // actually rendering, just schedule it and return; + unawaited(_forceRepaint()); }, ); return true; diff --git a/packages/flutter/test/foundation/service_extensions_test.dart b/packages/flutter/test/foundation/service_extensions_test.dart index 177c2493c6..3f4421cd9a 100644 --- a/packages/flutter/test/foundation/service_extensions_test.dart +++ b/packages/flutter/test/foundation/service_extensions_test.dart @@ -413,7 +413,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue); @@ -484,7 +484,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue); @@ -546,7 +546,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue); @@ -1038,7 +1038,7 @@ void main() { completed = true; }); await binding.flushMicrotasks(); - expect(completed, false); + expect(completed, isTrue); expect(binding.frameScheduled, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); @@ -1082,7 +1082,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue); @@ -1143,7 +1143,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue); @@ -1204,7 +1204,7 @@ void main() { }); await binding.flushMicrotasks(); expect(binding.frameScheduled, isTrue); - expect(completed, isFalse); + expect(completed, isTrue); await binding.doFrame(); await binding.flushMicrotasks(); expect(completed, isTrue);