While the documentation for MaterialType.canvas described it as
an infinite shape. The implementation has been clipping it to the
bounding rectangle for a while. And it is already used in the wild as a
rectangular piece. So we just update the documentation to match that.
This adds an API for defining the semantic node traversal order.
It adds a sortOrder argument to the Semantics widget, which is a class that can define a list of sort keys to sort on. The keys are sorted globally so that an order that doesn't have to do with the current widget hierarchy may be defined.
It also adds a shortcut sortKey argument to the Semantics widget that simply sets the sortOrder to just contain that key.
The platform side (flutter/engine#4540) gets an additional member in the SemanticsData object that is an integer describing where in the overall order each semantics node belongs. There is an associated engine-side change that takes this integer and uses it to order widgets for the platform's accessibility services.
Note: also fixes a bug wherein bottom media padding was applied even in the
presence of persistent footer buttons.
The material spec states that the keyboard should be positioned on top
of any bottom navigation bar or persistent footer buttons widget(s).
We no longer inset the bottom of bottom navigation bars / persistent
footer buttons by the bottom viewInset.
Body content bottom (and the bottom of bottom sheets) is now determined
by the greater of:
1. bottom view inset (the keyboard height)
2. bottom elements (nav bar, footer buttons)
relative to the window max-Y.
0672055a72ff1265b2aedb037f2848455318f22a changed the Material widget to
always use Paths for representing the outline.
These paths are later used for clipping and drawing a shadow.
This changed introduced a performance regression, see:
https://github.com/flutter/flutter/issues/14403
We did not expect a path that is a rounded rectangle to be less
performant than a rounded rectangle, as Skia should be able to tell the
path is just a rounded rectangle.
Until we find a solution for this regression, we keep using RRect when
we can represent the shape with it.
In a scaffold, snackbars are positioned above the BottomNavigationBar
and/or PersistentBottomButtons, if present. In such cases, they should
not apply bottom media padding to their widget sub-tree.
For backward compatibility we keep supporting specifying the shape as a
combination of MaterialType and borderRadius, and we just use that as a
default when shapeBorder is null.
To cleanup the implementation if shapeBorder was not specified we just
translate the specified shape to a shapeBorder internally.
I benchmarked paint, layout and hit testing, with the specialized shape
clippers vs. the equivalent path clippers and did not see any
significant performance difference.
For testing, I extended the clippers/physicalShape matchers to match either the
specialized shape or the equivalent shape.
This updates the CupertinoAlertDialog to respect text scale factor more properly. Before this, it would scale, but would clip the action buttons at large scales, and would draw in the safe area. It also didn't match the iOS alert because the content didn't scroll. Now it does those properly.
I didn't address the fact that buttons should lay out properly (Issue #14345), but that's probably pretty low priority.
Fixes#12484
* Add a callback that fires when a Draggable leaves a DragTarget. This enables the DragTarget to manage its state from entry to exit.
* It helps to have a null check here
* Add test for onLeave callback and add verbiage to onWillAccept explaining the callback lifecycle of a DragTarget.
* controller, position and test
* Make controllers swappable
* WIP
* Create a ListWheelScrollPhysics
* Created picker and gallery demo and testing now
* Works. Ready to document and test.
* Document and add tests. Make the scroll controller more generic.
* minor cleanup
* review
* review
* fix tests
* stop using TransformLayers for now