- PageableList extends ScrollableList One fixed width or height item is visible and centered at a time. Fling and drag gestures scroll to the next/previous item. - Scrollable.scrollTo(), Scrollable.scrollBy(), ensureWidgetIsVisible() API changed The named animation parameter for these methods was replaced by duration and curve. All of the methods now return a Future. The Future completes when the scroll does. This change eliminates the need for Scrollable to temporarily take ownership of a ValueAnimation object (see #645). - Using Future.then() instead of an AnimationPerformance status listener In ensure_visible.dart _handleTap() uses ensureWidgetIsVisible() to center the card roughly as before and then. When the implicit scroll animation is complete, it changes the centered card's label font. The change is made when the Future returned by ensureWidgetIsVisible() completes. - FixedHeightScrollable's itemHeight parameter is now itemExtent If scrollDirection is ScrollDirection.vertical (the default) then itemExtent should be the height of each item; otherwise it should be the width of each item. Replaced _velocityForFlingGesture() in scrollable.dart with Scrollable._eventVelocity() The original version clamped pixels/ms against pixels/sec constants. The new version also deals with scrollDirection. - Plumbed scrollDirection though FixedHeightScrollable and ScrollableList Both classes should now support horizontal scrolling.
SKY SDK
Sky and Sky's SDK are designed as layered frameworks, where each layer depends on the ones below it but could be replaced wholesale.
The bottom-most layer is the Sky Platform, which is exposed to Dart
code as various dart: packages,
including dart:sky.
The base/ directory contains libraries that extend these core APIs to provide base classes for tree structures (base/node.dart), hit testing (base/hit_test.dart), debugging (base/debug.dart), and task scheduling (base/scheduler.dart).
Above this are the files in the painting/ directory, which provide APIs related to drawing graphics, and in the animation/ directory, which provide core primitives for animating values.
Layout primitives are provided in the next layer, found in the
rendering/ directory. They use dart:sky and the
APIs exposed in painting/ to provide a retained-mode layout and
rendering model for applications or documents.
Widgets are provided by the files in the widgets/ directory, using a reactive framework. They use data given in the theme/ directory to select styles consistent with Material Design.
Text input widgets are layered on this mechanism and can be found in the editing/ directory.
Alongside the above is the mojo/ directory, which contains anything that uses the Mojo IPC mechanism, typically as part of wrapping host operating system features. Some of those Host APIs are implemented in the host system's preferred language.
Here is a diagram summarising all this:
+-----------------------------+ ------
| YOUR APP |
| +--------------------+--+
| | editing/ | |
| +--+-------------------++ |
| | widgets/ (theme/) | |
| ++---------------------++ | Dart
| | rendering/ | |
+-+---------+------------+ |
| painting/ | animation/ | |
+---------------+--------+ |
| base/ | mojo/ |
+------------+--+-+----+------+ -------
| dart:sky | | | Host |
+--------+---+ | | APIs | C++
| Skia | Dart | +------+ ObjC
+--------+--------+ | Java
| Mojo |
+-----------------------------+ -------
| Host Operating System | C/C++
+-----------------------------+ -------
TODO(ianh): document dart:sky and the Host APIs somewhere
Sky Engine API
The Sky engine API provides efficient, immutable wrappers for common Skia C++ types, notably Color, Point, and Rect. Because these wrappers are immutable, they are suitable for storage in final member variables of widget classes. More complex Skia wrappers such as Paint and RRect are mutable, to more closely match the Skia APIs. We recommend constructing wrappers for complex Skia classes dynamically during the painting phase based on the underlying state of the widget.