Line data Source code
1 : import 'package:flutter/cupertino.dart'; 2 : import 'package:flutter/foundation.dart'; 3 : import 'package:flutter/material.dart'; 4 : 5 : /// decorate the provided [Image] or [IconData] 6 : class BlendImageIcon<T> extends StatelessWidget { 7 1 : const BlendImageIcon(this.image, {Key key, this.color, this.size}) 8 2 : : assert(image is Widget || image is IconData, 9 : 'image must be IconData or Widget'), 10 1 : super(key: key); 11 : 12 : final Color color; 13 : final T image; 14 : final double size; 15 : 16 1 : @override 17 : Widget build(BuildContext context) { 18 2 : if (image is Widget) { 19 3 : var s = size ?? IconTheme.of(context).size; 20 : // flutter web do not support shader mask. (flutter v1.12.x) 21 1 : var showRawImage = kIsWeb || color == null; 22 : if (showRawImage) { 23 1 : return SizedBox( 24 : width: s, 25 : height: s, 26 1 : child: image as Widget, 27 : ); 28 : } 29 0 : return SizedBox( 30 : width: s, 31 : height: s, 32 0 : child: ShaderMask( 33 0 : child: image as Widget, 34 0 : shaderCallback: (Rect bounds) { 35 0 : return LinearGradient(colors: [color, color]).createShader(bounds); 36 : }, 37 : blendMode: BlendMode.srcIn, 38 : ), 39 : ); 40 : } 41 4 : return Icon(image as IconData, size: size, color: color); 42 : } 43 : }