mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
123 lines
4.2 KiB
Dart
123 lines
4.2 KiB
Dart
// Copyright 2014 The Flutter 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 'dart:ui' as ui show lerpDouble;
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/painting.dart';
|
|
|
|
import 'framework.dart' show BuildContext;
|
|
|
|
/// Defines the color, opacity, and size of icons.
|
|
///
|
|
/// Used by [IconTheme] to control the color, opacity, and size of icons in a
|
|
/// widget subtree.
|
|
///
|
|
/// To obtain the current icon theme, use [IconTheme.of]. To convert an icon
|
|
/// theme to a version with all the fields filled in, use [new
|
|
/// IconThemeData.fallback].
|
|
@immutable
|
|
class IconThemeData with Diagnosticable {
|
|
/// Creates an icon theme data.
|
|
///
|
|
/// The opacity applies to both explicit and default icon colors. The value
|
|
/// is clamped between 0.0 and 1.0.
|
|
const IconThemeData({this.color, double? opacity, this.size}) : _opacity = opacity;
|
|
|
|
/// Creates an icon theme with some reasonable default values.
|
|
///
|
|
/// The [color] is black, the [opacity] is 1.0, and the [size] is 24.0.
|
|
const IconThemeData.fallback()
|
|
: color = const Color(0xFF000000),
|
|
_opacity = 1.0,
|
|
size = 24.0;
|
|
|
|
/// Creates a copy of this icon theme but with the given fields replaced with
|
|
/// the new values.
|
|
IconThemeData copyWith({ Color? color, double? opacity, double? size }) {
|
|
return IconThemeData(
|
|
color: color ?? this.color,
|
|
opacity: opacity ?? this.opacity,
|
|
size: size ?? this.size,
|
|
);
|
|
}
|
|
|
|
/// Returns a new icon theme that matches this icon theme but with some values
|
|
/// replaced by the non-null parameters of the given icon theme. If the given
|
|
/// icon theme is null, simply returns this icon theme.
|
|
IconThemeData merge(IconThemeData? other) {
|
|
if (other == null)
|
|
return this;
|
|
return copyWith(
|
|
color: other.color,
|
|
opacity: other.opacity,
|
|
size: other.size,
|
|
);
|
|
}
|
|
|
|
/// Called by [IconTheme.of] to convert this instance to an [IconThemeData]
|
|
/// that fits the given [BuildContext].
|
|
///
|
|
/// This method gives the ambient [IconThemeData] a chance to update itself,
|
|
/// after it's been retrieved by [IconTheme.of], and before being returned as
|
|
/// the final result. For instance, [CupertinoIconThemeData] overrides this method
|
|
/// to resolve [color], in case [color] is a [CupertinoDynamicColor] and needs
|
|
/// to be resolved against the given [BuildContext] before it can be used as a
|
|
/// regular [Color].
|
|
///
|
|
/// The default implementation returns this [IconThemeData] as-is.
|
|
///
|
|
/// See also:
|
|
///
|
|
/// * [CupertinoIconThemeData.resolve] an implementation that resolves
|
|
/// the color of [CupertinoIconThemeData] before returning.
|
|
IconThemeData resolve(BuildContext context) => this;
|
|
|
|
/// Whether all the properties of this object are non-null.
|
|
bool get isConcrete => color != null && opacity != null && size != null;
|
|
|
|
/// The default color for icons.
|
|
final Color? color;
|
|
|
|
/// An opacity to apply to both explicit and default icon colors.
|
|
double? get opacity => _opacity?.clamp(0.0, 1.0);
|
|
final double? _opacity;
|
|
|
|
/// The default size for icons.
|
|
final double? size;
|
|
|
|
/// Linearly interpolate between two icon theme data objects.
|
|
///
|
|
/// {@macro dart.ui.shadow.lerp}
|
|
static IconThemeData lerp(IconThemeData? a, IconThemeData? b, double t) {
|
|
assert(t != null);
|
|
return IconThemeData(
|
|
color: Color.lerp(a?.color, b?.color, t),
|
|
opacity: ui.lerpDouble(a?.opacity, b?.opacity, t),
|
|
size: ui.lerpDouble(a?.size, b?.size, t),
|
|
);
|
|
}
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
if (other.runtimeType != runtimeType)
|
|
return false;
|
|
return other is IconThemeData
|
|
&& other.color == color
|
|
&& other.opacity == opacity
|
|
&& other.size == size;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => hashValues(color, opacity, size);
|
|
|
|
@override
|
|
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
super.debugFillProperties(properties);
|
|
properties.add(ColorProperty('color', color, defaultValue: null));
|
|
properties.add(DoubleProperty('opacity', opacity, defaultValue: null));
|
|
properties.add(DoubleProperty('size', size, defaultValue: null));
|
|
}
|
|
}
|