Added a ScrollListener listener to Scrollable. The ScrollListener runs each time the Scrollable's scrollOffset changes. This can be used to keep overlay widgets in sync with a Scrollable below them.
Removed the Scrollable ScrollClient API. It was no longer used and was clumsy to use as a ScrollListener.
Added global function findScrollableAncestor() to scrollable.dart.
Added examples/widgets/overlay_geometry.dart. The app's Scaffold is contained by a Stack. The Stack is used to display green overlay "Markers" at the corners of the most recently selected list item and where the corresponding tap occurred. The app uses widget.localToGlobal() to compute the global overlay positions of the markers. The ScrollListener is used to keep the markers' positions up to date.
Using ImageResource solves two problems:
1) Listeners can be notified synchronously when the sky.Image is already
available. This change removes flash of 0x0 layout when moving an
already-cached image around in the render tree.
2) In the future, when we support animated images, we can notify listeners
multiple times whenever a new image is available.
This patch simplifies the SkPicture we generate for Skia. Instead of drawing
everything into a nested SkPicture, we now draw everything into the top-level
picture, which requires us to apply the device scale factor in Dart.
If you tap multiple tabs in a row, the tab animation used to snap to the
last selected tab when starting a new animation. Fix that.
Also use the BuilderTransition so we don't have to rebuild the tab bar
every frame.
There were two problems:
1) When starting the mimic, we put up a bad frame because although we set the
`begin` value of the animation, we were building using the current `value`,
which hadn't been updated.
2) When stoping the mimic, we'd dirty a component during didUnmount, which
wouldn't get cleaned until the next frame. Now we're sure to clean all the
components before leaving flushBuild.
This widget lets you mimic one of its children in an overlay. The overlay
starts out as the same size of the child and then grows to fill the overlay. In
the future, the mimic will start at the same visual position as the child.
- Inline -> Pargraph. This class is actually a box, not an inline. It's really
a wrapper for RenderParagraph, so Paragraph is the normal name.
- InlineBase -> RenderInline. The name we used in C++ for the base class of
all inlines was RenderInline, which removes the ugly "Base" suffix.
- InlineText -> RenderText. Aligns this name with C++.
- InlineStyle -> RenderStyled. Matches the foregoing pattern.
Unforutnately since Input won't show text if it doesn't start
with a letter, this actually makes the experiance slightly
worse, but this is definitely the right direction.
@abarth
Wrap widgets you want to reparent in a Mimicable widget and assign the
Mimicable widget a global key. Then, given the same global key to a Mimic
widget to make it appear elsewhere in the view hierarchy.
Now ScrollableBlock can combine a horizontally scrolling viewport with a
horizontal block.
Also rename ViewportScrollDirection to just ScrollDirection for less verbosity.