Refactor everything to do with images#4583
Merged
Hixie merged 1 commit intoflutter:masterfrom Jun 16, 2016
Merged
Conversation
Contributor
Author
bin/cache/dart-sdk.version
Outdated
Contributor
There was a problem hiding this comment.
This change looks spurious.
Contributor
Author
There was a problem hiding this comment.
Oops. Fallout from my trying to fix the analyzer.
Contributor
|
LGTM. This patch is fabulous. I worry the SynchronousFuture is slightly too clever, but it works nicely in this patch. |
Overview
========
This patch refactors images to achieve the following goals:
* it allows references to unresolved assets to be passed
around (previously, almost every layer of the system had to know about
whether an image came from an asset bundle or the network or
elsewhere, and had to manually interact with the image cache).
* it allows decorations to use the same API for declaring images as the
widget tree.
It requires some minor changes to call sites that use images, as
discussed below.
Widgets
-------
Change this:
```dart
child: new AssetImage(
name: 'my_asset.png',
...
)
```
...to this:
```dart
child: new Image(
image: new AssetImage('my_asset.png'),
...
)
```
Decorations
-----------
Change this:
```dart
child: new DecoratedBox(
decoration: new BoxDecoration(
backgroundImage: new BackgroundImage(
image: DefaultAssetBundle.of(context).loadImage('my_asset.png'),
...
),
...
),
child: ...
)
```
...to this:
```dart
child: new DecoratedBox(
decoration: new BoxDecoration(
backgroundImage: new BackgroundImage(
image: new AssetImage('my_asset.png'),
...
),
...
),
child: ...
)
```
DETAILED CHANGE LOG
===================
The following APIs have been replaced in this patch:
* The `AssetImage` and `NetworkImage` widgets have been split in two,
with identically-named `ImageProvider` subclasses providing the
image-loading logic, and a single `Image` widget providing all the
widget tree logic.
* `ImageResource` is now `ImageStream`. Rather than configuring it with
a `Future<ImageInfo>`, you complete it with an `ImageStreamCompleter`.
* `ImageCache.load` and `ImageCache.loadProvider` are replaced by
`ImageCache.putIfAbsent`.
The following APIs have changed in this patch:
* `ImageCache` works in terms of arbitrary keys and caches
`ImageStreamCompleter` objects using those keys. With the new model,
you should never need to interact with the cache directly.
* `Decoration` can now be `const`. The state has moved to the
`BoxPainter` class. Instead of a list of listeners, there's now just a
single callback and a `dispose()` method on the painter. The callback
is passed in to the `createBoxPainter()` method. When invoked, you
should repaint the painter.
The following new APIs are introduced:
* `AssetBundle.loadStructuredData`.
* `SynchronousFuture`, a variant of `Future` that calls the `then`
callback synchronously. This enables the asynchronous and
synchronous (in-the-cache) code paths to look identical yet for the
latter to avoid returning to the event loop mid-paint.
* `ExactAssetImage`, a variant of `AssetImage` that doesn't do anything clever.
* `ImageConfiguration`, a class that describes parameters that configure
the `AssetImage` resolver.
The following APIs are entirely removed by this patch:
* `AssetBundle.loadImage` is gone. Use an `AssetImage` instead.
* `AssetVendor` is gone. `AssetImage` handles everything `AssetVendor`
used to handle.
* `RawImageResource` and `AsyncImage` are gone.
The following code-level changes are performed:
* `Image`, which replaces `AsyncImage`, `NetworkImage`, `AssetImage`,
and `RawResourceImage`, lives in `image.dart`.
* `DecoratedBox` and `Container` live in their own file now,
`container.dart` (they reference `image.dart`).
DIRECTIONS FOR FUTURE RESEARCH
==============================
* The `ImageConfiguration` fields are mostly aspirational. Right now
only `devicePixelRatio` and `bundle` are implemented. `locale` isn't
even plumbed through, it will require work on the localisation logic.
* We should go through and make `BoxDecoration`, `AssetImage`, and
`NetworkImage` objects `const` where possible.
* This patch makes supporting animated GIFs much easier.
* This patch makes it possible to create an abstract concept of an
"Icon" that could be either an image or a font-based glyph (using
`IconData` or similar). (see
flutter#4494)
RELATED ISSUES
==============
Fixes flutter#4500
Fixes flutter#4495
Obsoletes flutter#4496
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
This patch refactors images to achieve the following goals:
around (previously, almost every layer of the system had to know about
whether an image came from an asset bundle or the network or
elsewhere, and had to manually interact with the image cache).
widget tree.
It requires some minor changes to call sites that use images, as
discussed below.
Widgets
Change this:
...to this:
Decorations
Change this:
...to this:
Detailed change log
The following APIs have been replaced in this patch:
AssetImageandNetworkImagewidgets have been split in two,with identically-named
ImageProvidersubclasses providing theimage-loading logic, and a single
Imagewidget providing all thewidget tree logic.
ImageResourceis nowImageStream. Rather than configuring it witha
Future<ImageInfo>, you complete it with anImageStreamCompleter.ImageCache.loadandImageCache.loadProviderare replaced byImageCache.putIfAbsent.The following APIs have changed in this patch:
ImageCacheworks in terms of arbitrary keys and cachesImageStreamCompleterobjects using those keys. With the new model,you should never need to interact with the cache directly.
Decorationcan now beconst. The state has moved to theBoxPainterclass. Instead of a list of listeners, there's now just asingle callback and a
dispose()method on the painter. The callbackis passed in to the
createBoxPainter()method. When invoked, youshould repaint the painter.
The following new APIs are introduced:
AssetBundle.loadStructuredData.SynchronousFuture, a variant ofFuturethat calls thethencallback synchronously. This enables the asynchronous and
synchronous (in-the-cache) code paths to look identical yet for the
latter to avoid returning to the event loop mid-paint.
ExactAssetImage, a variant ofAssetImagethat doesn't do anything clever.ImageConfiguration, a class that describes parameters that configurethe
AssetImageresolver.The following APIs are entirely removed by this patch:
AssetBundle.loadImageis gone. Use anAssetImageinstead.AssetVendoris gone.AssetImagehandles everythingAssetVendorused to handle.
RawImageResourceandAsyncImageare gone.The following code-level changes are performed:
Image, which replacesAsyncImage,NetworkImage,AssetImage,and
RawResourceImage, lives inimage.dart.DecoratedBoxandContainerlive in their own file now,container.dart(they referenceimage.dart).Directions for future research
ImageConfigurationfields are mostly aspirational. Right nowonly
devicePixelRatioandbundleare implemented.localeisn'teven plumbed through, it will require work on the localisation logic.
BoxDecoration,AssetImage, andNetworkImageobjectsconstwhere possible."Icon" that could be either an image or a font-based glyph (using
IconDataor similar). (seeIcon widget (or a new widget) should support giving an icon from another font #4494)
Related issues
Fixes #4500
Fixes #4495
Obsoletes #4496