Hugo Pointcheval abd5e1b558
Some checks failed
continuous-integration/drone/pr Build is failing
feat(ui): add colors and rework ComponentThemeData
2023-04-28 14:04:55 +02:00

81 lines
2.7 KiB
Dart

// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:wyatt_ui_components/wyatt_ui_components.dart';
/// {@template component_theme}
/// A [ComponentTheme] widget that provides a [ComponentThemeData] to its
/// descendants.
/// {@endtemplate}
class ComponentTheme extends StatelessWidget {
/// {@macro component_theme}
const ComponentTheme({
required this.child,
required this.data,
super.key,
});
/// The [ComponentThemeData] of this widget.
///
/// This contains all components instances of the theme.
final ComponentThemeData data;
/// The widget below this widget in the tree.
final Widget child;
/// Returns the [ComponentThemeData] of the closest ancestor [ComponentTheme]
/// widget. If there is no ancestor [ComponentTheme] widget, it throws an
/// assertion error.
static ComponentThemeData of(BuildContext context) {
final _InheritedComponentTheme? inheritedThemeComponent =
context.dependOnInheritedWidgetOfExactType<_InheritedComponentTheme>();
assert(
inheritedThemeComponent != null,
'Theme component not find in tree',
);
return inheritedThemeComponent!.themeWidget.data;
}
/// Returns the [ComponentThemeData] of the closest ancestor [ComponentTheme]
/// widget. If there is no ancestor [ComponentTheme] widget, it returns null.
static ComponentThemeData? maybeOf(BuildContext context) {
final _InheritedComponentTheme? inheritedThemeComponent =
context.dependOnInheritedWidgetOfExactType<_InheritedComponentTheme>();
return inheritedThemeComponent?.themeWidget.data;
}
@override
Widget build(BuildContext context) => _InheritedComponentTheme(
this,
child: child,
);
}
class _InheritedComponentTheme extends InheritedWidget {
const _InheritedComponentTheme(
this.themeWidget, {
required super.child,
});
final ComponentTheme themeWidget;
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) =>
oldWidget != this;
}