// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'icons.dart'; import 'icon_button.dart'; import 'icon_theme.dart'; import 'icon_theme_data.dart'; /// An icon that comes from an [ImageProvider], e.g. an [AssetImage]. /// /// See also: /// /// * [IconButton], for interactive icons. /// * [IconTheme], which provides ambient configuration for icons. /// * [Icon] and [Icons], for icons from the material design library. class ImageIcon extends StatelessWidget { /// Creates an image icon. /// /// The [size] and [color] default to the value given by the current [IconTheme]. const ImageIcon(this.image, { Key key, this.size, this.color }) : super(key: key); /// The image to display as the icon. /// /// The icon can be null, in which case the widget will render as an empty /// space of the specified [size]. final ImageProvider image; /// The size of the icon in logical pixels. /// /// Icons occupy a square with width and height equal to size. /// /// Defaults to the current [IconTheme] size, if any. If there is no /// [IconTheme], or it does not specify an explicit size, then it defaults to /// 24.0. final double size; /// The color to use when drawing the icon. /// /// Defaults to the current [IconTheme] color, if any. If there is /// no [IconTheme], then it defaults to not recolorizing the image. /// /// The image will additionally be adjusted by the opacity of the current /// [IconTheme], if any. final Color color; @override Widget build(BuildContext context) { final IconThemeData iconTheme = IconTheme.of(context).fallback(); final double iconSize = size ?? iconTheme.size; if (image == null) return new SizedBox(width: iconSize, height: iconSize); final double iconOpacity = iconTheme.opacity; Color iconColor = color ?? iconTheme.color; if (iconOpacity != null && iconOpacity != 1.0) iconColor = iconColor.withOpacity(iconColor.opacity * iconOpacity); return new Image( image: image, width: iconSize, height: iconSize, color: iconColor, fit: ImageFit.scaleDown, alignment: FractionalOffset.center ); } @override void debugFillDescription(List<String> description) { super.debugFillDescription(description); if (image != null) { description.add('$image'); } else { description.add('<empty>'); } if (size != null) description.add('size: $size'); if (color != null) description.add('color: $color'); } }