您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
147 行
4.8 KiB
147 行
4.8 KiB
using System;
|
|
using Unity.UIWidgets.animation;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.widgets;
|
|
|
|
namespace Unity.UIWidgets.material {
|
|
public static class ThemeUtils {
|
|
public static readonly TimeSpan kThemeAnimationDuration = new TimeSpan(0, 0, 0, 0, 200);
|
|
}
|
|
|
|
public class Theme : StatelessWidget {
|
|
public Theme(
|
|
Key key = null,
|
|
ThemeData data = null,
|
|
bool isMaterialAppTheme = false,
|
|
Widget child = null
|
|
) : base(key: key) {
|
|
D.assert(child != null);
|
|
D.assert(data != null);
|
|
this.data = data;
|
|
this.isMaterialAppTheme = isMaterialAppTheme;
|
|
this.child = child;
|
|
}
|
|
|
|
public readonly ThemeData data;
|
|
|
|
public readonly bool isMaterialAppTheme;
|
|
|
|
readonly Widget child;
|
|
|
|
static readonly ThemeData _kFallbackTheme = ThemeData.fallback();
|
|
|
|
public static ThemeData of(BuildContext context, bool shadowThemeOnly = false) {
|
|
_InheritedTheme inheritedTheme =
|
|
(_InheritedTheme) context.inheritFromWidgetOfExactType(typeof(_InheritedTheme));
|
|
if (shadowThemeOnly) {
|
|
if (inheritedTheme == null || inheritedTheme.theme.isMaterialAppTheme) {
|
|
return null;
|
|
}
|
|
|
|
return inheritedTheme.theme.data;
|
|
}
|
|
|
|
MaterialLocalizations localizations = MaterialLocalizations.of(context);
|
|
ScriptCategory category = ScriptCategory.englishLike;
|
|
ThemeData theme = inheritedTheme?.theme?.data ?? _kFallbackTheme;
|
|
return ThemeData.localize(theme, theme.typography.geometryThemeFor(category));
|
|
}
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _InheritedTheme(
|
|
theme: this,
|
|
child: new IconTheme(
|
|
data: this.data.iconTheme,
|
|
child: this.child
|
|
)
|
|
);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<ThemeData>("data", this.data, showName: false));
|
|
}
|
|
}
|
|
|
|
|
|
class _InheritedTheme : InheritedWidget {
|
|
public _InheritedTheme(
|
|
Key key = null,
|
|
Theme theme = null,
|
|
Widget child = null) : base(key: key, child: child) {
|
|
D.assert(theme != null);
|
|
D.assert(child != null);
|
|
this.theme = theme;
|
|
}
|
|
|
|
public readonly Theme theme;
|
|
|
|
public override bool updateShouldNotify(InheritedWidget old) {
|
|
return this.theme.data != ((_InheritedTheme) old).theme.data;
|
|
}
|
|
}
|
|
|
|
class ThemeDataTween : Tween<ThemeData> {
|
|
public ThemeDataTween(
|
|
ThemeData begin = null,
|
|
ThemeData end = null
|
|
) : base(begin: begin, end: end) {
|
|
}
|
|
|
|
public override ThemeData lerp(float t) {
|
|
return ThemeData.lerp(this.begin, this.end, t);
|
|
}
|
|
}
|
|
|
|
class AnimatedTheme : ImplicitlyAnimatedWidget {
|
|
public AnimatedTheme(
|
|
Key key = null,
|
|
ThemeData data = null,
|
|
bool isMaterialAppTheme = false,
|
|
Curve curve = null,
|
|
TimeSpan? duration = null,
|
|
Widget child = null
|
|
) : base(key: key, curve: curve ?? Curves.linear, duration: duration ?? ThemeUtils.kThemeAnimationDuration) {
|
|
D.assert(child != null);
|
|
D.assert(data != null);
|
|
this.data = data;
|
|
this.isMaterialAppTheme = isMaterialAppTheme;
|
|
this.child = child;
|
|
}
|
|
|
|
|
|
public readonly ThemeData data;
|
|
|
|
public readonly bool isMaterialAppTheme;
|
|
|
|
public readonly Widget child;
|
|
|
|
public override State createState() {
|
|
return new _AnimatedThemeState();
|
|
}
|
|
}
|
|
|
|
|
|
class _AnimatedThemeState : AnimatedWidgetBaseState<AnimatedTheme> {
|
|
ThemeDataTween _data;
|
|
|
|
protected override void forEachTween(TweenVisitor visitor) {
|
|
this._data = (ThemeDataTween) visitor.visit(this, this._data, this.widget.data,
|
|
(ThemeData value) => new ThemeDataTween(begin: value));
|
|
}
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new Theme(
|
|
isMaterialAppTheme: this.widget.isMaterialAppTheme,
|
|
child: this.widget.child,
|
|
data: this._data.evaluate(this.animation)
|
|
);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder description) {
|
|
base.debugFillProperties(description);
|
|
description.add(
|
|
new DiagnosticsProperty<ThemeDataTween>("data", this._data, showName: false, defaultValue: null));
|
|
}
|
|
}
|
|
}
|