From b8b3567130c75dd77cf85cbf8b73037cc2a5f0e7 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Wed, 21 Dec 2022 15:49:18 -0800 Subject: [PATCH] Remove single-view assumption from widgets library (#117480) --- packages/flutter/lib/src/widgets/editable_text.dart | 10 ++++++---- packages/flutter/lib/src/widgets/scroll_physics.dart | 3 ++- .../flutter/lib/src/widgets/semantics_debugger.dart | 5 +++-- packages/flutter/lib/src/widgets/widget_inspector.dart | 5 ++++- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index b7c3f2778411..e319df843724 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -43,6 +43,7 @@ import 'text_editing_intents.dart'; import 'text_selection.dart'; import 'text_selection_toolbar_anchors.dart'; import 'ticker_provider.dart'; +import 'view.dart'; import 'widget_span.dart'; export 'package:flutter/services.dart' show SelectionChangedCause, SmartDashesType, SmartQuotesType, TextEditingValue, TextInputType, TextSelection; @@ -3303,17 +3304,18 @@ class EditableTextState extends State with AutomaticKeepAliveClien @override void didChangeMetrics() { - if (_lastBottomViewInset != WidgetsBinding.instance.window.viewInsets.bottom) { + final ui.FlutterView view = View.of(context); + if (_lastBottomViewInset != view.viewInsets.bottom) { SchedulerBinding.instance.addPostFrameCallback((Duration _) { _selectionOverlay?.updateForScroll(); }); - if (_lastBottomViewInset < WidgetsBinding.instance.window.viewInsets.bottom) { + if (_lastBottomViewInset < view.viewInsets.bottom) { // Because the metrics change signal from engine will come here every frame // (on both iOS and Android). So we don't need to show caret with animation. _scheduleShowCaretOnScreen(withAnimation: false); } } - _lastBottomViewInset = WidgetsBinding.instance.window.viewInsets.bottom; + _lastBottomViewInset = view.viewInsets.bottom; } Future _performSpellCheck(final String text) async { @@ -3516,7 +3518,7 @@ class EditableTextState extends State with AutomaticKeepAliveClien if (_hasFocus) { // Listen for changing viewInsets, which indicates keyboard showing up. WidgetsBinding.instance.addObserver(this); - _lastBottomViewInset = WidgetsBinding.instance.window.viewInsets.bottom; + _lastBottomViewInset = View.of(context).viewInsets.bottom; if (!widget.readOnly) { _scheduleShowCaretOnScreen(withAnimation: true); } diff --git a/packages/flutter/lib/src/widgets/scroll_physics.dart b/packages/flutter/lib/src/widgets/scroll_physics.dart index d4519035104d..e125e5d21729 100644 --- a/packages/flutter/lib/src/widgets/scroll_physics.dart +++ b/packages/flutter/lib/src/widgets/scroll_physics.dart @@ -13,6 +13,7 @@ import 'framework.dart'; import 'overscroll_indicator.dart'; import 'scroll_metrics.dart'; import 'scroll_simulation.dart'; +import 'view.dart'; export 'package:flutter/physics.dart' show ScrollSpringSimulation, Simulation, Tolerance; @@ -251,7 +252,7 @@ class ScrollPhysics { assert(metrics != null); assert(context != null); if (parent == null) { - final double maxPhysicalPixels = WidgetsBinding.instance.window.physicalSize.longestSide; + final double maxPhysicalPixels = View.of(context).physicalSize.longestSide; return velocity.abs() > maxPhysicalPixels; } return parent!.recommendDeferredLoading(velocity, metrics, context); diff --git a/packages/flutter/lib/src/widgets/semantics_debugger.dart b/packages/flutter/lib/src/widgets/semantics_debugger.dart index 1fe00962c313..6656979c71e4 100644 --- a/packages/flutter/lib/src/widgets/semantics_debugger.dart +++ b/packages/flutter/lib/src/widgets/semantics_debugger.dart @@ -12,6 +12,7 @@ import 'basic.dart'; import 'binding.dart'; import 'framework.dart'; import 'gesture_detector.dart'; +import 'view.dart'; /// A widget that visualizes the semantics for the child. /// @@ -96,7 +97,7 @@ class _SemanticsDebuggerState extends State with WidgetsBindi Offset? _lastPointerDownLocation; void _handlePointerDown(PointerDownEvent event) { setState(() { - _lastPointerDownLocation = event.position * WidgetsBinding.instance.window.devicePixelRatio; + _lastPointerDownLocation = event.position * View.of(context).devicePixelRatio; }); // TODO(ianh): Use a gesture recognizer so that we can reset the // _lastPointerDownLocation when none of the other gesture recognizers win. @@ -159,7 +160,7 @@ class _SemanticsDebuggerState extends State with WidgetsBindi _pipelineOwner, _client.generation, _lastPointerDownLocation, // in physical pixels - WidgetsBinding.instance.window.devicePixelRatio, + View.of(context).devicePixelRatio, widget.labelStyle, ), child: GestureDetector( diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart index 130bc3eb7944..6135736216db 100644 --- a/packages/flutter/lib/src/widgets/widget_inspector.dart +++ b/packages/flutter/lib/src/widgets/widget_inspector.dart @@ -10,6 +10,7 @@ import 'dart:math' as math; import 'dart:ui' as ui show ClipOp, + FlutterView, Image, ImageByteFormat, Paragraph, @@ -30,6 +31,7 @@ import 'debug.dart'; import 'framework.dart'; import 'gesture_detector.dart'; import 'service_extensions.dart'; +import 'view.dart'; /// Signature for the builder callback used by /// [WidgetInspector.selectButtonBuilder]. @@ -2726,7 +2728,8 @@ class _WidgetInspectorState extends State // on the edge of the display. If the pointer is being dragged off the edge // of the display we do not want to select anything. A user can still select // a widget that is only at the exact screen margin by tapping. - final Rect bounds = (Offset.zero & (WidgetsBinding.instance.window.physicalSize / WidgetsBinding.instance.window.devicePixelRatio)).deflate(_kOffScreenMargin); + final ui.FlutterView view = View.of(context); + final Rect bounds = (Offset.zero & (view.physicalSize / view.devicePixelRatio)).deflate(_kOffScreenMargin); if (!bounds.contains(_lastPointerLocation!)) { setState(() { selection.clear();