Marco
b83f547f6b
Now, an on-the-fly food lookup is created from existing entries on startup. Those entries are used to make suggestions when the user is typing to enter new food entries.
121 lines
4.3 KiB
Dart
121 lines
4.3 KiB
Dart
import 'package:calodiary/theme_bloc.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:calodiary/app_drawer.dart';
|
|
import 'package:calodiary/calendar_floating_button.dart';
|
|
import 'package:calodiary/enter_food_widget.dart';
|
|
import 'package:calodiary/food_entry_bloc.dart';
|
|
import 'package:calodiary/food_entry_widget.dart';
|
|
import 'package:calodiary/storage/storage.dart';
|
|
import 'package:calodiary/sum_widget.dart';
|
|
|
|
class PerDateWidget extends StatefulWidget {
|
|
final DateTime date;
|
|
const PerDateWidget({super.key, required this.date});
|
|
|
|
@override
|
|
State<PerDateWidget> createState() => _PerDateWidgetState();
|
|
}
|
|
|
|
class _PerDateWidgetState extends State<PerDateWidget> {
|
|
late FoodStorage storage;
|
|
late Future<List<FoodEntry>> entriesFuture;
|
|
late List<FoodEntry> entries;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
storage = FoodStorage.getInstance();
|
|
entriesFuture = storage.getEntriesForDate(widget.date);
|
|
entriesFuture.then((val) {
|
|
entries = val;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
var formattedDate = DateFormat.yMMMMd('de').format(widget.date);
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(formattedDate),
|
|
actions: [
|
|
BlocBuilder<ThemeDataBloc, ThemeState>(builder: (context, state) {
|
|
var icon = const Icon(Icons.light_mode);
|
|
if (state.brightness == 'light') {
|
|
icon = const Icon(Icons.dark_mode);
|
|
}
|
|
return IconButton(
|
|
icon: icon,
|
|
onPressed: () {
|
|
context.read<ThemeDataBloc>().add(ThemeToggleEvent());
|
|
},
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
drawer: const AppDrawer(),
|
|
body: FutureBuilder(
|
|
future: entriesFuture,
|
|
builder: (context, snapshot) {
|
|
if (snapshot.connectionState != ConnectionState.done) {
|
|
return const Center(child: CircularProgressIndicator());
|
|
} else {
|
|
return BlocProvider(
|
|
create: (context) => FoodEntryBloc(
|
|
initialState: FoodEntryState(foodEntries: entries),
|
|
storage: storage,
|
|
forDate: widget.date),
|
|
child: BlocBuilder<FoodEntryBloc, FoodEntryState>(
|
|
builder: (context, state) {
|
|
return ListView.builder(
|
|
itemCount: state.foodEntries.length + 2,
|
|
itemBuilder: (BuildContext itemBuilderContext, int index) {
|
|
if (index == state.foodEntries.length) {
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 10),
|
|
child: SumWidget(foodEntries: state.foodEntries),
|
|
);
|
|
}
|
|
if (index == state.foodEntries.length + 1) {
|
|
return Column(
|
|
children: [
|
|
EnterFoodWidget(
|
|
onAdd: (context, entry) {
|
|
context
|
|
.read<FoodEntryBloc>()
|
|
.add(FoodEntryEvent(entry: entry));
|
|
},
|
|
),
|
|
const SizedBox(height: 75),
|
|
],
|
|
);
|
|
}
|
|
|
|
return Column(
|
|
children: [
|
|
FoodEntryWidget(
|
|
entry: state.foodEntries[index],
|
|
onDelete: (callbackContext, id) {
|
|
callbackContext
|
|
.read<FoodEntryBloc>()
|
|
.add(FoodDeletionEvent(
|
|
entryID: id,
|
|
));
|
|
},
|
|
),
|
|
const Divider(),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
},
|
|
),
|
|
floatingActionButton: CalendarFloatingButton(date: widget.date));
|
|
}
|
|
}
|