Implements focus traversal for desktop platforms, including re-implementing the existing focus manager and focus tree.
This implements a Focus widget that can be put into a widget tree to allow input focus to be given to a particular part of a widget tree.
It incorporates with the existing FocusScope and FocusNode infrastructure, and has minimal breakage to the API, although FocusScope.reparentIfNeeded is removed, replaced by a call to FocusAttachment.reparent(), so this is a breaking change:
FocusScopeNodes must now be attached to the focus tree using FocusScopeNode.attach, which takes a context and an optional onKey callback, and returns a FocusAttachment that should be kept by the widget that hosts the FocusScopeNode. This is necessary because of the need to make sure that the focus tree reflects the widget hierarchy.
Callers that used to call FocusScope(context).reparentIfNeeded in their build method will call reparent on a FocusAttachment instead, which they will obtain by calling FocusScopeNode.attach in their initState method. Widgets that own FocusNodes will need to call dispose on the focus node in their dispose method.
Addresses #11344, #1608, #13264, and #1678Fixes#30084Fixes#26704
Adds a paint after detaching/attaching hover annotations to keep the annotation layers in sync with the annotations attached to the mouse detector.
Fixes#30744
When submitting data to a server, callers need a callback that will
get invoked after all the individual form fields are saved. If they
have a button that submits the form, they could just do this logic
in the click handler for the button (save the form, then submit to
the server), but if they have more ways than one to submit the form
(i.e. hitting enter while in a text form field), then it becomes
more convoluted and calls for a unified callback that will get
notified when the form is submitted.
* some space formattings
* always use blocks in if-else if a block is used
* format spaces in for and while
* allow multiline if conditions
* fix missing space
* No shrinking for BackdropFilter's cull rect
This will be a breaking change. Our old behavior may generate confusions
for a sample app like our added golden test: Skia will shrink the cull
rect (and thus the filtered area) to the text. The new behavior will
fill the BackdropFilter to its parent/ancestor clip. This is more
in align with our clip behaviors (no clip by default).
If this breaks your app, wrap the BackdropFilter with a ClipRect.
[wip] The golden images are not uploaded yet. I'll wait for the initial
round of review to approve the golden test before uploading them.
* Statically define the callback
* Add TODO to remind the hacking code removal
* Nit fix
* Update goldens
31b289f27 Fix indexing error in dart:ui TextStyle.toString (flutter/engine#8143)
fc2e6b61c Typo "fast an inline" to "fast and inline" (flutter/engine#8142)
0f19b2de0 Reland PerformanceOverlayLayer golden test (flutter/engine#8140)
073aadde1 Fix TextStyle decode misalignment (flutter/engine#8141)
d87d29054 Roll src/third_party/skia 406b068942f0..2eecc3ea3d71 (11 commits) (flutter/engine#8138)
5cef4a022 Use final state passed to dart before initialization as the initial lifecycleState. (flutter/engine#8124)
ffef51be6 Roll src/third_party/skia 665bc64a2dc4..406b068942f0 (8 commits) (flutter/engine#8137)
48efd0fb7 Roll src/third_party/skia 762ddd7e4352..665bc64a2dc4 (2 commits) (flutter/engine#8129)
f666adbbd Roll src/third_party/skia 2932a458957d..762ddd7e4352 (3 commits) (flutter/engine#8128)
8b0df6ded Bugfix #29203: NPE in getAccessibilityProvider in old FlutterView. (flutter/engine#8126)
8f7b18345 Roll src/third_party/skia c6d8781c4036..2932a458957d (2 commits) (flutter/engine#8125)
52b67fdd5 Expose decorationThickness to dart:ui (flutter/engine#8008)
* Fix MouseTracker annotation leak
Map's remove method is typed `remove(Object key)`, which can cause bugs.
Modified the existing test to check if the annotation has been removed
from MouseTracker.
Adds support for discrete scroll events, such as those sent by a scroll wheel.
Includes the plumbing to convert, dispatch, and handle these events, as well as
Scrollable support for consuming them.
In anticipation of changing a lot of the focus code, I'm adding some tests for the FocusScope.
As a result, I was able to find and fix a bug where there was an incorrect assert.
I also added some more documentation.
Several of the tests enforce what I think is incorrect behavior related to passing focus off when the widget tree gets rebuilt without focus nodes that were previously there, but I'm not going to change that behavior in this PR.
I also renamed focus_test.dart to focus_scope_test.dart to be more in line with our naming conventions.