Commit 592bc1c
Changed files (6)
lib
components
screens
lib/components/measurement_list/intake_list_entry.dart
@@ -0,0 +1,27 @@
+import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine_intake.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:intl/intl.dart';
+
+/// Medicine intake to display in a list.
+class IntakeListEntry extends StatelessWidget {
+ const IntakeListEntry({super.key,
+ required this.settings,
+ required this.intake,
+ });
+
+ final Settings settings;
+
+ final MedicineIntake intake;
+
+ @override
+ Widget build(BuildContext context) => ListTile(
+ title: Text(intake.medicine.designation),
+ subtitle: Text(DateFormat(settings.dateFormatString).format(intake.timestamp)),
+ trailing: Text(intake.dosis.toString()),
+ leading: const Icon(Icons.medication),
+ iconColor: intake.medicine.color,
+ );
+
+
+}
\ No newline at end of file
lib/components/measurement_list/measurement_list.dart
@@ -1,18 +1,42 @@
+import 'package:blood_pressure_app/components/measurement_list/intake_list_entry.dart';
import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
+import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine_intake.dart';
import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MeasurementList extends StatelessWidget {
- const MeasurementList({super.key, required this.settings, required this.records});
+ const MeasurementList({super.key,
+ required this.settings,
+ required this.records,
+ required this.intakes,
+ });
final Settings settings;
+
+ /// Records to display.
final List<BloodPressureRecord> records;
+ /// Medicine intakes to list.
+ ///
+ /// Will get merged with blood pressure records.
+ final List<MedicineIntake> intakes;
+
@override
Widget build(BuildContext context) {
final localizations = AppLocalizations.of(context)!;
+ final entries = [];
+ entries.addAll(records);
+ entries.addAll(intakes);
+ entries.sort((e1, e2) {
+ if (e2 is BloodPressureRecord && e1 is BloodPressureRecord) return e2.creationTime.compareTo(e1.creationTime);
+ if (e2 is BloodPressureRecord && e1 is MedicineIntake) return e2.creationTime.compareTo(e1.timestamp);
+ if (e2 is MedicineIntake && e1 is BloodPressureRecord) return e2.timestamp.compareTo(e1.creationTime);
+ if (e2 is MedicineIntake && e1 is MedicineIntake) return e2.timestamp.compareTo(e1.timestamp);
+ assert(false);
+ return 0;
+ });
return Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -58,12 +82,21 @@ class MeasurementList extends StatelessWidget {
// Fix actions blocked by floating buttons on different screens
// and font sizes by adding empty offset to bottom.
padding: const EdgeInsets.only(bottom: 300),
- itemCount: records.length,
+ itemCount: entries.length,
itemBuilder: (context, idx) {
- return MeasurementListRow(
- record: records[idx],
- settings: settings,
- );
+ if (entries[idx] is BloodPressureRecord) {
+ return MeasurementListRow(
+ record: entries[idx],
+ settings: settings,
+ );
+ } else {
+ assert(entries[idx] is MedicineIntake);
+ return IntakeListEntry(
+ intake: entries[idx],
+ settings: settings,
+ );
+ }
+
},
),
)
lib/components/measurement_list/measurement_list_entry.dart
@@ -8,6 +8,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
+/// Blood pressure measurement to display in a list.
class MeasurementListRow extends StatelessWidget {
const MeasurementListRow({super.key, required this.record, required this.settings});
lib/components/consistent_future_builder.dart
@@ -50,7 +50,7 @@ class _ConsistentFutureBuilderState<T> extends State<ConsistentFutureBuilder<T>>
future: _future ?? widget.future,
builder: (BuildContext context, AsyncSnapshot<T> snapshot) {
if (snapshot.hasError) {
- return Text(AppLocalizations.of(context)!.error(snapshot.error.toString()));
+ return Text(AppLocalizations.of(context)?.error(snapshot.error.toString()) ?? snapshot.error.toString());
}
switch (snapshot.connectionState) {
case ConnectionState.none:
lib/screens/home_screen.dart
@@ -59,9 +59,10 @@ class AppHome extends StatelessWidget {
return Center(
child: Padding(
padding: const EdgeInsets.only(top: 20),
- child: Consumer<Settings>(
- builder: (context, settings, child) {
- return Column(children: [
+ child: Consumer<IntakeHistory>(builder: (context, intakeHistory, child) =>
+ Consumer<IntervallStoreManager>(builder: (context, intervalls, child) =>
+ Consumer<Settings>(builder: (context, settings, child) =>
+ Column(children: [
const MeasurementGraph(),
Expanded(
child: (settings.useLegacyList) ?
@@ -71,11 +72,12 @@ class AppHome extends StatelessWidget {
onData: (context, records) => MeasurementList(
settings: settings,
records: records,
+ intakes: intakeHistory.getIntakes(intervalls.mainPage.currentRange),
)
)
)
- ]);
- }
+ ])
+ ))
),
),
);
lib/main.dart
@@ -56,7 +56,7 @@ Future<Widget> _loadApp() async {
intakeHistory = IntakeHistory([]);
}
} catch (e) {
- assert(false, e.toString());
+ assert(e is PathNotFoundException, e.toString());
intakeHistory = IntakeHistory([]);
}
intakeHistory.addListener(() async {