blob: 8a6455ba0826b5286789ef2bd535829eb11f59a6 [file] [log] [blame]
// Copyright 2018 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/foundation.dart';
import 'package:flutter/rendering.dart';
import 'tabs.dart';
/// Defines a theme for [TabBar] widgets.
///
/// A tab bar theme describes the color of the tab label and the size/shape of
/// the [TabBar.indicator].
///
/// Descendant widgets obtain the current theme's [TabBarTheme] object using
/// `Theme.of(context).tabBarTheme`.
/// [ThemeData.tabBarTheme] can be customized by copying it (using
/// [TabBarTheme.copyWith]).
///
/// See also:
///
/// * [TabBar], a widget that displays a horizontal row of tabs.
/// * [ThemeData], which describes the overall theme information for the
/// application.
class TabBarTheme extends Diagnosticable {
/// Creates a tab bar theme that can be used with [ThemeData.tabBarTheme].
const TabBarTheme({
this.indicator,
this.indicatorSize,
this.labelColor,
this.unselectedLabelColor,
});
/// Default value for [TabBar.indicator].
final Decoration indicator;
/// Default value for [TabBar.indicatorSize].
final TabBarIndicatorSize indicatorSize;
/// Default value for [TabBar.labelColor].
final Color labelColor;
/// Default value for [TabBar.unselectedLabelColor].
final Color unselectedLabelColor;
/// Creates a copy of this object but with the given fields replaced with the
/// new values.
TabBarTheme copyWith({
Decoration indicator,
TabBarIndicatorSize indicatorSize,
Color labelColor,
Color unselectedLabelColor,
}) {
return TabBarTheme(
indicator: indicator ?? this.indicator,
indicatorSize: indicatorSize ?? this.indicatorSize,
labelColor: labelColor ?? this.labelColor,
unselectedLabelColor: unselectedLabelColor ?? this.unselectedLabelColor
);
}
/// Linearly interpolate between two tab bar themes.
///
/// {@macro flutter.material.themeData.lerp}
static TabBarTheme lerp(TabBarTheme a, TabBarTheme b, double t) {
assert(a != null);
assert(b != null);
assert(t != null);
return TabBarTheme(
indicator: Decoration.lerp(a.indicator, b.indicator, t),
indicatorSize: t < 0.5 ? a.indicatorSize : b.indicatorSize,
labelColor: Color.lerp(a.labelColor, b.labelColor, t),
unselectedLabelColor: Color.lerp(a.unselectedLabelColor, b.unselectedLabelColor, t)
);
}
@override
int get hashCode {
return hashValues(indicator, indicatorSize, labelColor, unselectedLabelColor);
}
@override
bool operator ==(dynamic other) {
if (identical(this, other))
return true;
if (other.runtimeType != runtimeType)
return false;
final TabBarTheme typedOther = other;
return typedOther.indicator == indicator
&& typedOther.indicatorSize == indicatorSize
&& typedOther.labelColor == labelColor
&& typedOther.unselectedLabelColor == unselectedLabelColor;
}
}