1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import '../models/entry.dart';
import '../repositories/entry_repository.dart';
part 'entries_event.dart';
part 'entries_state.dart';
class EntriesBloc extends Bloc<EntriesEvent, EntriesState> {
final EntryRepository entryRepository;
EntriesBloc({required this.entryRepository}) : super(EntriesLoading()) {
on<LoadEntries>(_onLoadEntries);
on<AddEntry>(_onAddEntry);
on<UpdateEntry>(_onUpdateEntry);
on<DeleteEntry>(_onDeleteEntry);
}
void _onLoadEntries(LoadEntries event, Emitter<EntriesState> emit) async {
try {
final entries = await entryRepository.getEntries();
emit(EntriesLoaded(entries));
} catch (e) {
if (e is Exception) {
emit(EntriesNotLoaded(e));
} else if (e is TypeError) {
emit(EntriesNotLoaded(Exception(e.toString())));
} else {
emit(EntriesNotLoaded(
Exception('Something went wrong while loading entries')));
}
}
}
void _onAddEntry(AddEntry event, Emitter<EntriesState> emit) async {
if (state is EntriesLoaded) {
final updatedEntries = List<Entry>.from((state as EntriesLoaded).entries)
..add(event.entry);
emit(EntriesLoaded(updatedEntries));
await entryRepository.insert(event.entry);
}
}
void _onUpdateEntry(UpdateEntry event, Emitter<EntriesState> emit) async {
if (state is EntriesLoaded) {
final updatedEntries = (state as EntriesLoaded).entries.map((entry) {
return entry.id == event.updatedEntry.id ? event.updatedEntry : entry;
}).toList();
emit(EntriesLoaded(updatedEntries));
await entryRepository.update(event.updatedEntry);
}
}
void _onDeleteEntry(DeleteEntry event, Emitter<EntriesState> emit) async {
if (state is EntriesLoaded) {
final updatedEntries = (state as EntriesLoaded)
.entries
.where((entry) => entry.id != event.entry.id)
.toList();
emit(EntriesLoaded(updatedEntries));
await entryRepository.delete(event.entry.id);
}
}
}