Files
2025-12-12 15:57:22 +01:00

75 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
/// Wrapper around [Icon] that centralizes our Material Symbols defaults.
/// Defaults: fill=1 (filled) and weight=700 (bold). Update [AppIconDefaults]
/// to tweak app-wide icon appearance from one place.
class AppIcon extends StatelessWidget {
const AppIcon(
this.icon, {
super.key,
this.size,
this.color,
this.fill,
this.weight,
this.grade,
this.opticalSize,
this.shadows,
this.semanticLabel,
this.textDirection,
});
final IconData? icon;
final double? size;
final Color? color;
final double? fill;
final double? weight;
final double? grade;
final double? opticalSize;
final List<Shadow>? shadows;
final String? semanticLabel;
final TextDirection? textDirection;
@override
Widget build(BuildContext context) {
if (icon == null) return const SizedBox.shrink();
return Icon(
icon,
size: size,
color: color,
fill: fill ?? AppIconDefaults.fill,
weight: weight ?? AppIconDefaults.weight,
grade: grade ?? AppIconDefaults.grade,
opticalSize: opticalSize ?? AppIconDefaults.opticalSize,
shadows: shadows ?? AppIconDefaults.shadows,
semanticLabel: semanticLabel,
textDirection: textDirection,
);
}
}
/// Central place to adjust default Material Symbol variations.
class AppIconDefaults {
static double fill = 1;
static double weight = 700;
static double? grade;
static double? opticalSize;
static Color? color;
static List<Shadow>? shadows;
static void update({
double? fill,
double? weight,
double? grade,
double? opticalSize,
Color? color,
List<Shadow>? shadows,
}) {
if (fill != null) AppIconDefaults.fill = fill;
if (weight != null) AppIconDefaults.weight = weight;
if (grade != null) AppIconDefaults.grade = grade;
if (opticalSize != null) AppIconDefaults.opticalSize = opticalSize;
if (color != null) AppIconDefaults.color = color;
if (shadows != null) AppIconDefaults.shadows = shadows;
}
}