Refactor badge handling across components to use m3e colors, remove unused _SmallDot widget, and clean up redundant code.

This commit is contained in:
Emily Pauli 2025-10-23 14:45:16 +02:00
commit 05c489991a
6 changed files with 21 additions and 32 deletions

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:m3e_design/m3e_design.dart';
import 'enums.dart'; import 'enums.dart';
@ -44,6 +45,7 @@ class IconButtonM3E extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final scheme = Theme.of(context).colorScheme; final scheme = Theme.of(context).colorScheme;
final m3e = context.m3e;
final Size visual = size.visual(width); final Size visual = size.visual(width);
final Size target = size.target(width); final Size target = size.target(width);
@ -133,19 +135,27 @@ class IconButtonM3E extends StatelessWidget {
badge = null; badge = null;
} else if (v is num) { } else if (v is num) {
final int c = v.round().clamp(0, 999999); final int c = v.round().clamp(0, 999999);
badge = Badge.count( if (c == 0) {
count: c, badge = Badge(
backgroundColor: scheme.error, smallSize: 8,
textColor: scheme.onError, backgroundColor: m3e.colors.primary,
); textColor: m3e.colors.onPrimary,
);
} else {
badge = Badge.count(
count: c,
backgroundColor: m3e.colors.primary,
textColor: m3e.colors.onPrimary,
);
}
} else if (v is String) { } else if (v is String) {
if (v.isEmpty) { if (v.isEmpty) {
badge = null; badge = null;
} else { } else {
badge = Badge( badge = Badge(
label: Text(v), label: Text(v),
backgroundColor: scheme.error, backgroundColor: m3e.colors.primary,
textColor: scheme.onError, textColor: m3e.colors.onPrimary,
); );
} }
} else { } else {

View file

@ -13,9 +13,10 @@ dependencies:
sdk: flutter sdk: flutter
dev_dependencies: dev_dependencies:
flutter_lints: ^4.0.0
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^4.0.0
flutter: flutter:
uses-material-design: true uses-material-design: true

View file

@ -135,7 +135,6 @@ class _NavigationRailM3EState extends State<NavigationRailM3E>
void _insertOverlay() { void _insertOverlay() {
final overlay = Overlay.of(context, rootOverlay: true); final overlay = Overlay.of(context, rootOverlay: true);
if (overlay == null) return;
_modalEntry = OverlayEntry(builder: (ctx) => _buildModalOverlay(ctx)); _modalEntry = OverlayEntry(builder: (ctx) => _buildModalOverlay(ctx));
overlay.insert(_modalEntry!); overlay.insert(_modalEntry!);
} }
@ -147,7 +146,6 @@ class _NavigationRailM3EState extends State<NavigationRailM3E>
void _insertCollapsedPeekOverlay() { void _insertCollapsedPeekOverlay() {
final overlay = Overlay.of(context, rootOverlay: true); final overlay = Overlay.of(context, rootOverlay: true);
if (overlay == null) return;
_collapsedPeekEntry = _collapsedPeekEntry =
OverlayEntry(builder: (ctx) => _buildCollapsedPeekOverlay(ctx)); OverlayEntry(builder: (ctx) => _buildCollapsedPeekOverlay(ctx));
overlay.insert(_collapsedPeekEntry!); overlay.insert(_collapsedPeekEntry!);

View file

@ -65,19 +65,3 @@ class RailBadgeM3E extends StatelessWidget {
return v; return v;
} }
} }
class _SmallDot extends StatelessWidget {
const _SmallDot({required this.color});
final Color color;
@override
Widget build(BuildContext context) {
return Container(
width: 8,
height: 8,
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle,
),
);
}
}

View file

@ -36,11 +36,9 @@ class NavigationRailTokensAdapter {
} }
Color get badgeBackground => Color get badgeBackground =>
_maybe(() => context.m3e.colors.error) ?? _cs.error; _maybe(() => context.m3e.colors.primary) ?? _cs.primary;
Color get badgeLargeLabel => Color get badgeLargeLabel =>
_maybe(() => context.m3e.colors.onError) ?? _cs.onError; _maybe(() => context.m3e.colors.onPrimary) ?? _cs.onPrimary;
Color get badgeSmallDot =>
_maybe(() => context.m3e.colors.error) ?? _cs.error;
ShapeBorder get indicatorShapeFull { ShapeBorder get indicatorShapeFull {
// Full corner per M3E: use the most rounded token, fallback to StadiumBorder. // Full corner per M3E: use the most rounded token, fallback to StadiumBorder.

View file

@ -368,8 +368,6 @@ class _SplitButtonM3EState<T> extends State<SplitButtonM3E<T>> {
setState(() => _menuOpen = true); setState(() => _menuOpen = true);
// Ensure menu item text/icon colors match the button's foreground (onCont) // Ensure menu item text/icon colors match the button's foreground (onCont)
final theme = Theme.of(context);
final m3e = context.m3e;
final ( final (
Color _cont, Color _cont,
Color onCont, Color onCont,