This change adds a way to provide explicit focus order for a part of the widget tree.
It adds FocusTraversalPolicyGroup, which in many ways is similar to DefaultFocusTraversal, except that it groups a widget subtree together so that those nodes are traversed as a group. DefaultFocusTraversal doesn't work as one would expect: If there is more than one DefaultFocusTraversal inside of a focus scope, the policy can change depending on which node was asked to move "next", which can cause unexpected behavior. The new grouping mechanism doesn't have that problem. I deprecate DefaultFocusTraversal in this PR.
It also adds OrderedFocusTraversalPolicy, which is a policy that can be supplied to FocusTraversalPolicyGroup to set the policy for a sub-tree. It looks for FocusTraversalOrder inherited widgets, which use a FocusOrder to do the sorting. FocusOrder has two subclasses: NumericalFocusOrder (which sorts based on a double), and LexicalFocusOrder, which sorts based on a String.
As part of doing this, I refactored the way FocusTraversalPolicy is implemented so that it has more default implementation methods, and exposes a new protected member: sortDescendants, which makes it easier for developers to make their own policy subclasses: they only need to implement sortDescendants to get a new ordering behavior, but can also still override any of the default implementation behaviors if they need different behavior.
I was able to do this without breaking the API (AFAICT).
This PR modifies the existing API docs samples to use DartPad so that all of the samples are now interactive apps on the API docs site.
It also removes the restriction for the max width of the description area so that the dartpad region can expand horizontally.
I updated the first paragraph on the API docs to indicate that Flutter is more than just mobile now (same text as the README.md at the top level).
I modified a few of the examples so that they looked nicer, and fit better on the page.
I added the sample description text above each DartPad instance, since that often defines the context of the example.
I removed animations and images when they were redundant with the sample content. There were a few that made sense to keep, so I did.
* c9322145f Ensure fields of Rect and OffsetBase classes are optimized as non-null. (flutter/engine#16465)
* 5c70356a9 Simplify task queues locking mechanism (flutter/engine#16477)
* d589ddea6 Fix text range logic for a11y (flutter/engine#16496)
* 1a4f4e394 Fix unused import in Android embedder (flutter/engine#16494)
* 964ae1009 Disable ShellTest.WaitForFirstFrameTimeout on Fuchsia (flutter/engine#16495)
* 6158f03ef Roll src/third_party/skia 87e3bef6f82f..9f3eef796f63 (7 commits) (flutter/engine#16493)
The current implementation of DropdownButtonFormField does not pass the initial value to _DropdownButtonFormFieldState. As a result changes made through the child DropdownButton are not made to the FormFieldState and the widget is not updated unless a onChanged function is provided to the DropdownButtomFormField constructor.
This change modifies DropdownButtonFormField to behave more consistently with other FormField widgets in how the Form state is handled.