simplified code across the app and consolidated duplicated helpers

This commit is contained in:
2026-09-27 17:29:54 +02:00
parent 3e856d0b1c
commit ee1240f71a
155 changed files with 1772 additions and 2546 deletions
@@ -40,7 +40,7 @@ class LoadableStateConsumer<
super.key,
});
static Duration animationDuration = const Duration(milliseconds: 200);
static const Duration animationDuration = Duration(milliseconds: 200);
@override
Widget build(BuildContext context) {
@@ -5,6 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../../widget/info_dialog.dart';
import '../bloc/loadable_state_bloc.dart';
import 'loadable_state_consumer.dart';
class LoadableStateErrorBar extends StatelessWidget {
final bool visible;
@@ -21,8 +22,6 @@ class LoadableStateErrorBar extends StatelessWidget {
super.key,
});
final Duration animationDuration = const Duration(milliseconds: 200);
@override
Widget build(BuildContext context) {
final bloc = context.watch<LoadableStateBloc>();
@@ -31,9 +30,9 @@ class LoadableStateErrorBar extends StatelessWidget {
final shouldShow = visible || isOfflineWithCache;
return AnimatedSize(
duration: animationDuration,
duration: LoadableStateConsumer.animationDuration,
child: AnimatedSwitcher(
duration: animationDuration,
duration: LoadableStateConsumer.animationDuration,
transitionBuilder: (Widget child, Animation<double> animation) =>
SlideTransition(
position: Tween<Offset>(
@@ -46,35 +45,27 @@ class LoadableStateErrorBar extends StatelessWidget {
key: Key(shouldShow.hashCode.toString()),
visible: shouldShow,
replacement: const SizedBox(width: double.infinity),
child: Builder(
builder: (context) {
var bloc = context.watch<LoadableStateBloc>();
return InkWell(
onTap: () {
if (!bloc.isConnected()) return;
final body = [
if (message != null && message!.isNotEmpty) message!,
if (technicalDetails != null &&
technicalDetails!.isNotEmpty)
technicalDetails!,
].join('\n\n');
if (body.isEmpty) return;
InfoDialog.show(
context,
body,
copyable: true,
title: 'Fehlerdetails',
);
},
child: Container(
height: 20,
decoration: BoxDecoration(
color: bloc.connectionColor(context),
),
child: LoadableStateErrorBarText(lastUpdated: lastUpdated),
),
child: InkWell(
onTap: () {
if (!bloc.isConnected()) return;
final body = [
if (message != null && message!.isNotEmpty) message!,
if (technicalDetails != null && technicalDetails!.isNotEmpty)
technicalDetails!,
].join('\n\n');
if (body.isEmpty) return;
InfoDialog.show(
context,
body,
copyable: true,
title: 'Fehlerdetails',
);
},
child: Container(
height: 20,
decoration: BoxDecoration(color: bloc.connectionColor(context)),
child: LoadableStateErrorBarText(lastUpdated: lastUpdated),
),
),
),
),
@@ -106,8 +97,9 @@ class _LoadableStateErrorBarTextState extends State<LoadableStateErrorBarText> {
@override
Widget build(BuildContext context) {
var bloc = context.watch<LoadableStateBloc>();
final bloc = context.watch<LoadableStateBloc>();
final foreground = bloc.connectionForegroundColor(context);
final text = bloc.connectionText(lastUpdated: widget.lastUpdated);
// liveRegion, damit das Auftauchen des Offline-/Fehlerbanners angesagt wird;
// Row-Semantik ausgeschlossen (Icon + Text) und Text über das explizite
@@ -115,17 +107,14 @@ class _LoadableStateErrorBarTextState extends State<LoadableStateErrorBarText> {
return Semantics(
liveRegion: true,
container: true,
label: bloc.connectionText(lastUpdated: widget.lastUpdated),
label: text,
child: ExcludeSemantics(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(bloc.connectionIcon(), size: 14, color: foreground),
const SizedBox(width: 10),
Text(
bloc.connectionText(lastUpdated: widget.lastUpdated),
style: TextStyle(fontSize: 12, color: foreground),
),
Text(text, style: TextStyle(fontSize: 12, color: foreground)),
],
),
),