wip: fixed state not updating correctly

This commit is contained in:
Elias Müller 2024-05-27 22:28:42 +02:00
parent 634fe41e78
commit a33c4ddac5
3 changed files with 60 additions and 56 deletions

View File

@ -9,8 +9,8 @@ import 'holidays_state.dart';
class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, HolidaysRepository> { class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, HolidaysRepository> {
HolidaysBloc() { HolidaysBloc() {
on<SetPastHolidaysVisible>((event, emit) { on<SetPastHolidaysVisible>((event, emit) {
log('set pastholidays: ${event.shouldBeVisible.toString()}'); log('SetPastHolidaysVisible: ${event.shouldBeVisible.toString()}');
add(Emit((state) => state.copyWith(showPastHolidays: state.showPastHolidays))); add(Emit((state) => state.copyWith(showPastHolidays: event.shouldBeVisible)));
}); });
on<DisclaimerDismissed>((event, emit) => add( on<DisclaimerDismissed>((event, emit) => add(
@ -19,6 +19,9 @@ class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, Ho
} }
bool showPastHolidays() => innerState?.showPastHolidays ?? false; bool showPastHolidays() => innerState?.showPastHolidays ?? false;
List<Holiday>? getHolidays() => innerState?.holidays.where(
(element) => showPastHolidays() || DateTime.parse(element.end).isAfter(DateTime.now())
).toList();
@override @override
fromNothing() => const HolidaysState(showPastHolidays: false, holidays: [], showDisclaimer: true); fromNothing() => const HolidaysState(showPastHolidays: false, holidays: [], showDisclaimer: true);

View File

@ -1,13 +1,11 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import '../../../../../view/pages/more/holidays/holidays.dart'; import '../../../../../view/pages/more/holidays/holidays.dart';
import '../../../../../widget/animatedTime.dart'; import '../../../../../widget/animatedTime.dart';
import '../../../../../widget/list_view_util.dart';
import '../../../../../widget/centeredLeading.dart'; import '../../../../../widget/centeredLeading.dart';
import '../../../../../widget/debug/debugTile.dart'; import '../../../../../widget/debug/debugTile.dart';
import '../../../infrastructure/loadableState/loadable_state.dart';
import '../../../infrastructure/loadableState/view/loadable_state_consumer.dart'; import '../../../infrastructure/loadableState/view/loadable_state_consumer.dart';
import '../../../infrastructure/utilityWidgets/bloc_module.dart'; import '../../../infrastructure/utilityWidgets/bloc_module.dart';
import '../bloc/holidays_bloc.dart'; import '../bloc/holidays_bloc.dart';
@ -18,18 +16,17 @@ class HolidaysView extends StatelessWidget {
const HolidaysView({super.key}); const HolidaysView({super.key});
@override @override
Widget build(BuildContext context) => BlocModule<HolidaysBloc, LoadableState<HolidaysState>>( Widget build(BuildContext context) => BlocModule(
create: (contet) => HolidaysBloc(), create: (context) => HolidaysBloc(),
autoRebuild: true, autoRebuild: true,
child: (context, bloc, state) { child: (context, bloc, state) {
log(state.toString());
void showDisclaimer() { void showDisclaimer() {
showDialog(context: context, builder: (context) => AlertDialog( showDialog(context: context, builder: (context) => AlertDialog(
title: const Text('Richtigkeit und Bereitstellung der Daten'), title: const Text('Richtigkeit und Bereitstellung der Daten'),
content: const Text('' content: const Text(''
'Sämtliche Datumsangaben sind ohne Gewähr.\n' 'Sämtliche Datumsangaben sind ohne Gewähr.\n'
'Ich übernehme weder Verantwortung für die Richtigkeit der Daten noch hafte ich für wirtschaftliche Schäden die aus der Verwendung dieser Daten entstehen können.\n\n' 'Ich übernehme weder Verantwortung für die Richtigkeit der Daten noch hafte ich für wirtschaftliche Schäden die aus der Verwendung dieser Daten entstehen können.\n\n'
'Die Daten stammen von https://ferien-api.de/'), 'Die Daten stammen von https://ferien-api.de/'),
actions: [ actions: [
TextButton(child: const Text('Okay'), onPressed: () { TextButton(child: const Text('Okay'), onPressed: () {
bloc.add(DisclaimerDismissed()); bloc.add(DisclaimerDismissed());
@ -66,53 +63,48 @@ class HolidaysView extends StatelessWidget {
], ],
), ),
body: LoadableStateConsumer<HolidaysBloc, HolidaysState>( body: LoadableStateConsumer<HolidaysBloc, HolidaysState>(
child: (state, loading) => ListView.builder( child: (state, loading) => ListViewUtil.fromList<Holiday>(bloc.getHolidays(), (holiday) {
itemCount: state.holidays.length, var holidayType = holiday.name.split(' ').first.capitalize();
itemBuilder: (context, index) { String formatDate(String enDate) => Jiffy.parse(enDate).format(pattern: 'dd.MM.yyyy');
var holiday = state.holidays[index];
var holidayType = holiday.name.split(' ').first.capitalize();
String formatDate(String enDate) => Jiffy.parse(enDate).format(pattern: 'dd.MM.yyyy'); return ListTile(
leading: const CenteredLeading(Icon(Icons.calendar_month)),
return ListTile( title: Text('${state.showPastHolidays}$holidayType ab ${formatDate(holiday.start)}'),
leading: const CenteredLeading(Icon(Icons.calendar_month)), subtitle: Text('bis ${formatDate(holiday.end)}'),
title: Text('$holidayType ab ${formatDate(holiday.start)}'), onTap: () => showDialog(context: context, builder: (context) => SimpleDialog(
subtitle: Text('bis ${formatDate(holiday.end)}'), title: Text('$holidayType ${holiday.year} in Hessen'),
onTap: () => showDialog(context: context, builder: (context) => SimpleDialog( children: [
title: Text('$holidayType ${holiday.year} in Hessen'), ListTile(
children: [ leading: const CenteredLeading(Icon(Icons.signpost_outlined)),
ListTile( title: Text(holiday.name),
leading: const CenteredLeading(Icon(Icons.signpost_outlined)), subtitle: Text(holiday.slug),
title: Text(holiday.name), ),
subtitle: Text(holiday.slug), ListTile(
leading: const Icon(Icons.arrow_forward),
title: Text('vom ${formatDate(holiday.start)}'),
),
ListTile(
leading: const Icon(Icons.arrow_back),
title: Text('bis zum ${formatDate(holiday.end)}'),
),
Visibility(
visible: !DateTime.parse(holiday.start).difference(DateTime.now()).isNegative,
replacement: ListTile(
leading: const CenteredLeading(Icon(Icons.content_paste_search_outlined)),
title: Text(Jiffy.parse(holiday.start).fromNow()),
), ),
ListTile( child: ListTile(
leading: const Icon(Icons.arrow_forward), leading: const CenteredLeading(Icon(Icons.timer_outlined)),
title: Text('vom ${formatDate(holiday.start)}'), title: AnimatedTime(callback: () => DateTime.parse(holiday.start).difference(DateTime.now())),
subtitle: Text(Jiffy.parse(holiday.start).fromNow()),
), ),
ListTile( ),
leading: const Icon(Icons.arrow_back), DebugTile(context).jsonData(holiday.toJson()),
title: Text('bis zum ${formatDate(holiday.end)}'), ],
), )),
Visibility( trailing: const Icon(Icons.arrow_right),
visible: !DateTime.parse(holiday.start).difference(DateTime.now()).isNegative, );
replacement: ListTile( }),
leading: const CenteredLeading(Icon(Icons.content_paste_search_outlined)),
title: Text(Jiffy.parse(holiday.start).fromNow()),
),
child: ListTile(
leading: const CenteredLeading(Icon(Icons.timer_outlined)),
title: AnimatedTime(callback: () => DateTime.parse(holiday.start).difference(DateTime.now())),
subtitle: Text(Jiffy.parse(holiday.start).fromNow()),
),
),
DebugTile(context).jsonData(holiday.toJson()),
],
)),
trailing: const Icon(Icons.arrow_right),
);
},
),
), ),
); );
}, },

View File

@ -0,0 +1,9 @@
import 'package:flutter/material.dart';
class ListViewUtil {
static ListView fromList<T>(List<T>? items, Widget Function(T item) map) => ListView.builder(
itemCount: items?.length ?? 0,
itemBuilder: (context, index) => items != null ? map(items[index]) : null,
);
}