RenderImage should handle the case of a null image
When given a null image, RenderImage should be as small as possible (isntead of being NaNxNaN). Also, plumb ImageFit and ImageRepeat through the various image widgets.
This commit is contained in:
parent
6cc103cf07
commit
5b40e03129
@ -1347,7 +1347,7 @@ class RenderImage extends RenderBox {
|
|||||||
height: _height
|
height: _height
|
||||||
).apply(constraints);
|
).apply(constraints);
|
||||||
|
|
||||||
if (constraints.isTight)
|
if (constraints.isTight || _image == null)
|
||||||
return constraints.smallest;
|
return constraints.smallest;
|
||||||
|
|
||||||
// This algorithm attempts to find a size for the RenderImage that fits in
|
// This algorithm attempts to find a size for the RenderImage that fits in
|
||||||
@ -1360,8 +1360,10 @@ class RenderImage extends RenderBox {
|
|||||||
// - The RenderImage's dimension are maximal subject to being smaller than
|
// - The RenderImage's dimension are maximal subject to being smaller than
|
||||||
// the intrinsic size of the image.
|
// the intrinsic size of the image.
|
||||||
|
|
||||||
double width = _image == null ? 0.0 : _image.width.toDouble();
|
double width = _image.width.toDouble();
|
||||||
double height = _image == null ? 0.0 : _image.height.toDouble();
|
double height = _image.height.toDouble();
|
||||||
|
assert(width > 0.0);
|
||||||
|
assert(height > 0.0);
|
||||||
double aspectRatio = width / height;
|
double aspectRatio = width / height;
|
||||||
|
|
||||||
if (width > constraints.maxWidth) {
|
if (width > constraints.maxWidth) {
|
||||||
@ -1384,7 +1386,6 @@ class RenderImage extends RenderBox {
|
|||||||
width = height * aspectRatio;
|
width = height * aspectRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(width != null && height != null);
|
|
||||||
return constraints.constrain(new Size(width, height));
|
return constraints.constrain(new Size(width, height));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,14 +523,30 @@ class Text extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Image extends LeafRenderObjectWrapper {
|
class Image extends LeafRenderObjectWrapper {
|
||||||
Image({ Key key, this.image, this.width, this.height, this.colorFilter }) : super(key: key);
|
Image({
|
||||||
|
Key key,
|
||||||
|
this.image,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.colorFilter,
|
||||||
|
this.fit: ImageFit.scaleDown,
|
||||||
|
this.repeat: ImageRepeat.noRepeat
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
final sky.Image image;
|
final sky.Image image;
|
||||||
final double width;
|
final double width;
|
||||||
final double height;
|
final double height;
|
||||||
final sky.ColorFilter colorFilter;
|
final sky.ColorFilter colorFilter;
|
||||||
|
final ImageFit fit;
|
||||||
|
final ImageRepeat repeat;
|
||||||
|
|
||||||
RenderImage createNode() => new RenderImage(image: image, width: width, height: height, colorFilter: colorFilter);
|
RenderImage createNode() => new RenderImage(
|
||||||
|
image: image,
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
colorFilter: colorFilter,
|
||||||
|
fit: fit,
|
||||||
|
repeat: repeat);
|
||||||
RenderImage get renderObject => super.renderObject;
|
RenderImage get renderObject => super.renderObject;
|
||||||
|
|
||||||
void syncRenderObject(Widget old) {
|
void syncRenderObject(Widget old) {
|
||||||
@ -539,16 +555,28 @@ class Image extends LeafRenderObjectWrapper {
|
|||||||
renderObject.width = width;
|
renderObject.width = width;
|
||||||
renderObject.height = height;
|
renderObject.height = height;
|
||||||
renderObject.colorFilter = colorFilter;
|
renderObject.colorFilter = colorFilter;
|
||||||
|
renderObject.fit = fit;
|
||||||
|
renderObject.repeat = repeat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ImageListener extends StatefulComponent {
|
class ImageListener extends StatefulComponent {
|
||||||
ImageListener({ Key key, this.image, this.width, this.height, this.colorFilter }) : super(key: key);
|
ImageListener({
|
||||||
|
Key key,
|
||||||
|
this.image,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.colorFilter,
|
||||||
|
this.fit: ImageFit.scaleDown,
|
||||||
|
this.repeat: ImageRepeat.noRepeat
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
ImageResource image;
|
ImageResource image;
|
||||||
double width;
|
double width;
|
||||||
double height;
|
double height;
|
||||||
sky.ColorFilter colorFilter;
|
sky.ColorFilter colorFilter;
|
||||||
|
ImageFit fit;
|
||||||
|
ImageRepeat repeat;
|
||||||
|
|
||||||
sky.Image _resolvedImage;
|
sky.Image _resolvedImage;
|
||||||
|
|
||||||
@ -578,6 +606,8 @@ class ImageListener extends StatefulComponent {
|
|||||||
width = source.width;
|
width = source.width;
|
||||||
height = source.height;
|
height = source.height;
|
||||||
colorFilter = source.colorFilter;
|
colorFilter = source.colorFilter;
|
||||||
|
fit = source.fit;
|
||||||
|
repeat = source.repeat;
|
||||||
if (needToUpdateListeners)
|
if (needToUpdateListeners)
|
||||||
image.addListener(_handleImageChanged);
|
image.addListener(_handleImageChanged);
|
||||||
}
|
}
|
||||||
@ -587,44 +617,71 @@ class ImageListener extends StatefulComponent {
|
|||||||
image: _resolvedImage,
|
image: _resolvedImage,
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
colorFilter: colorFilter
|
colorFilter: colorFilter,
|
||||||
|
fit: fit,
|
||||||
|
repeat: repeat
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NetworkImage extends Component {
|
class NetworkImage extends Component {
|
||||||
NetworkImage({ Key key, this.src, this.width, this.height, this.colorFilter }) : super(key: key);
|
NetworkImage({
|
||||||
|
Key key,
|
||||||
|
this.src,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.colorFilter,
|
||||||
|
this.fit: ImageFit.scaleDown,
|
||||||
|
this.repeat: ImageRepeat.noRepeat
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
final String src;
|
final String src;
|
||||||
final double width;
|
final double width;
|
||||||
final double height;
|
final double height;
|
||||||
final sky.ColorFilter colorFilter;
|
final sky.ColorFilter colorFilter;
|
||||||
|
final ImageFit fit;
|
||||||
|
final ImageRepeat repeat;
|
||||||
|
|
||||||
Widget build() {
|
Widget build() {
|
||||||
return new ImageListener(
|
return new ImageListener(
|
||||||
image: image_cache.load(src),
|
image: image_cache.load(src),
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
colorFilter: colorFilter
|
colorFilter: colorFilter,
|
||||||
|
fit: fit,
|
||||||
|
repeat: repeat
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AssetImage extends Component {
|
class AssetImage extends Component {
|
||||||
AssetImage({ Key key, this.name, this.bundle, this.width, this.height, this.colorFilter }) : super(key: key);
|
AssetImage({
|
||||||
|
Key key,
|
||||||
|
this.name,
|
||||||
|
this.bundle,
|
||||||
|
this.width,
|
||||||
|
this.height,
|
||||||
|
this.colorFilter,
|
||||||
|
this.fit: ImageFit.scaleDown,
|
||||||
|
this.repeat: ImageRepeat.noRepeat
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
final String name;
|
final String name;
|
||||||
final AssetBundle bundle;
|
final AssetBundle bundle;
|
||||||
final double width;
|
final double width;
|
||||||
final double height;
|
final double height;
|
||||||
final sky.ColorFilter colorFilter;
|
final sky.ColorFilter colorFilter;
|
||||||
|
final ImageFit fit;
|
||||||
|
final ImageRepeat repeat;
|
||||||
|
|
||||||
Widget build() {
|
Widget build() {
|
||||||
return new ImageListener(
|
return new ImageListener(
|
||||||
image: bundle.loadImage(name),
|
image: bundle.loadImage(name),
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
colorFilter: colorFilter
|
colorFilter: colorFilter,
|
||||||
|
fit: fit,
|
||||||
|
repeat: repeat
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user