Commit 2785e67
Changed files (26)
app
lib
components
model
screens
health_data_store
lib
app/lib/components/dialoges/add_export_column_dialoge.dart
@@ -1,12 +1,12 @@
import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/column.dart';
import 'package:blood_pressure_app/model/export_import/record_formatter.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:blood_pressure_app/screens/subsettings/export_import/export_field_format_documentation_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
import 'package:intl/intl.dart';
/// Dialoge widget for creating and editing a [UserColumn].
@@ -162,13 +162,15 @@ class _AddExportColumnDialogeState extends State<AddExportColumnDialoge>
),
child: (){
final record = BloodPressureRecord(
- DateTime.now(),
- 123, 78, 65,
- 'test note',
+ time: DateTime.now(),
+ sys: widget.settings.preferredPressureUnit.wrap(123),
+ dia: widget.settings.preferredPressureUnit.wrap(78),
+ pul: 65,
+ // FIXME 'test note',
);
final formatter = (type == _FormatterType.record)
- ? ScriptedFormatter(recordPattern ?? '')
- : ScriptedTimeFormatter(timePattern ?? '');
+ ? ScriptedFormatter(recordPattern ?? '')
+ : ScriptedTimeFormatter(timePattern ?? '');
final text = formatter.encode(record);
final decoded = formatter.decode(text);
return Column(
@@ -179,7 +181,7 @@ class _AddExportColumnDialogeState extends State<AddExportColumnDialoge>
settings: widget.settings,
) else Text(
DateFormat('MMM d, y - h:m.s')
- .format(record.creationTime),
+ .format(record.time),
),
const SizedBox(height: 8,),
const Icon(Icons.arrow_downward),
app/lib/components/dialoges/add_measurement_dialoge.dart
@@ -4,14 +4,15 @@ import 'dart:math';
import 'package:blood_pressure_app/components/consistent_future_builder.dart';
import 'package:blood_pressure_app/components/date_time_picker.dart';
import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
-import 'package:blood_pressure_app/components/settings/settings_widgets.dart';
import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
+import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
import 'package:blood_pressure_app/model/storage/storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:health_data_store/health_data_store.dart';
import 'package:intl/intl.dart';
+import 'package:provider/provider.dart';
/// Input mask for entering measurements.
class AddEntryDialoge extends StatefulWidget {
@@ -96,10 +97,10 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
@override
void initState() {
super.initState();
- time = widget.initialRecord?.creationTime ?? DateTime.now();
- needlePin = widget.initialRecord?.needlePin;
+ time = widget.initialRecord?.time ?? DateTime.now();
+ // needlePin = widget.initialRecord?.needlePin; TODO
sysController = TextEditingController(
- text: (widget.initialRecord?.systolic ?? '').toString(),
+ text: (widget.initialRecord?.sys ?? '').toString(),
);
if (widget.initialRecord != null) {
_measurementFormActive = true;
@@ -230,8 +231,14 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
recordFormKey.currentState?.save();
if (systolic != null || diastolic != null || pulse != null
|| (notes ?? '').isNotEmpty || needlePin != null) {
- record = BloodPressureRecord(time, systolic, diastolic, pulse,
- notes ?? '', needlePin: needlePin,);
+ final pressureUnit = context.read<Settings>().preferredPressureUnit;
+ // TODO: notes, needle pin
+ record = BloodPressureRecord(
+ time: time,
+ sys: systolic == null ? null : pressureUnit.wrap(systolic!),
+ dia: diastolic == null ? null : pressureUnit.wrap(diastolic!),
+ pul: pulse,
+ );
}
}
@@ -285,7 +292,11 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
const SizedBox(width: 16,),
_buildValueInput(localizations,
labelText: localizations.diaLong,
- initialValue: widget.initialRecord?.diastolic,
+ // TODO: stop duplicating code like this
+ initialValue: switch(widget.settings.preferredPressureUnit) {
+ PressureUnit.mmHg => widget.initialRecord?.dia?.mmHg,
+ PressureUnit.kPa => widget.initialRecord?.dia?.kPa.round(),
+ },
onSaved: (value) =>
setState(() => diastolic = int.tryParse(value ?? '')),
focusNode: diaFocusNode,
@@ -302,14 +313,14 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
const SizedBox(width: 16,),
_buildValueInput(localizations,
labelText: localizations.pulLong,
- initialValue: widget.initialRecord?.pulse,
+ initialValue: widget.initialRecord?.pul,
focusNode: pulFocusNode,
onSaved: (value) =>
setState(() => pulse = int.tryParse(value ?? '')),
),
],
),
- Padding(
+ /*Padding( FIXME
padding: const EdgeInsets.symmetric(vertical: 16),
child: TextFormField(
initialValue: widget.initialRecord?.notes,
@@ -343,7 +354,7 @@ class _AddEntryDialogeState extends State<AddEntryDialoge> {
},
initialColor: needlePin?.color ?? Colors.transparent,
shape: _buildShapeBorder(needlePin?.color),
- ),
+ ),*/
],
),
),
app/lib/components/dialoges/import_preview_dialoge.dart
@@ -3,13 +3,13 @@ import 'dart:math';
import 'package:blood_pressure_app/components/custom_banner.dart';
import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/column.dart';
import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
/// A preview that allows customizing columns used for csv data import.
///
app/lib/components/measurement_list/measurement_list.dart
@@ -4,7 +4,7 @@ import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:health_data_store/health_data_store.dart' show BloodPressureRecord, MedicineIntake, MedicineIntakeRepository;
+import 'package:health_data_store/health_data_store.dart';
/// List that renders measurements and medicine intakes.
///
@@ -35,9 +35,9 @@ class MeasurementList extends StatelessWidget {
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.time);
- if (e2 is MedicineIntake && e1 is BloodPressureRecord) return e2.time.compareTo(e1.creationTime);
+ if (e2 is BloodPressureRecord && e1 is BloodPressureRecord) return e2.time.compareTo(e1.time);
+ if (e2 is BloodPressureRecord && e1 is MedicineIntake) return e2.time.compareTo(e1.time);
+ if (e2 is MedicineIntake && e1 is BloodPressureRecord) return e2.time.compareTo(e1.time);
if (e2 is MedicineIntake && e1 is MedicineIntake) return e2.time.compareTo(e1.time);
assert(false);
return 0;
app/lib/components/measurement_list/measurement_list_entry.dart
@@ -1,18 +1,20 @@
import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
+import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
import 'package:blood_pressure_app/model/storage/storage.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:health_data_store/health_data_store.dart' hide BloodPressureRecord;
+import 'package:health_data_store/health_data_store.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
/// Display of a blood pressure measurement data.
class MeasurementListRow extends StatelessWidget {
/// Create a display of a measurements.
- const MeasurementListRow({super.key, required this.record, required this.settings});
+ const MeasurementListRow({super.key,
+ required this.record,
+ required this.settings,
+ });
/// The measurement to display.
final BloodPressureRecord record;
@@ -28,18 +30,18 @@ class MeasurementListRow extends StatelessWidget {
// Leading color possible
title: _buildRow(formatter),
childrenPadding: const EdgeInsets.only(bottom: 10),
- backgroundColor: record.needlePin?.color.withAlpha(30),
- collapsedShape: record.needlePin != null ? Border(left: BorderSide(color: record.needlePin!.color, width: 8)) : null,
+ // backgroundColor: record.needlePin?.color.withAlpha(30), FIXME
+ // collapsedShape: record.needlePin != null ? Border(left: BorderSide(color: record.needlePin!.color, width: 8)) : null,
children: [
ListTile(
- subtitle: Text(formatter.format(record.creationTime)),
+ subtitle: Text(formatter.format(record.time)),
title: Text(localizations.timestamp),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
onPressed: () async {
- final model = Provider.of<BloodPressureModel>(context, listen: false);
+ final model = RepositoryProvider.of<BloodPressureRepository>(context);
final entry = await showAddEntryDialoge(context,
Provider.of<Settings>(context, listen: false),
RepositoryProvider.of<MedicineRepository>(context),
@@ -47,9 +49,10 @@ class MeasurementListRow extends StatelessWidget {
);
if (entry?.$1 != null) {
if (context.mounted) {
- model.addAndExport(context, entry!.$1!);
+ // model.addAndExport(context, entry!.$1!); FIXME
+ await model.add(entry!.$1!);
} else {
- model.add(entry!.$1!);
+ await model.add(entry!.$1!);
}
}
assert(entry?.$2 == null);
@@ -65,37 +68,41 @@ class MeasurementListRow extends StatelessWidget {
],
),
),
- if (record.notes.isNotEmpty)
+ /*if (record.notes.isNotEmpty) FIXME
ListTile(
title: Text(localizations.note),
subtitle: Text(record.notes),
- ),
+ ),*/
],
);
}
Row _buildRow(DateFormat formatter) {
- String formatNum(int? num) => (num ?? '-').toString();
+ String formatNum(num? num) => (num ?? '-').toString();
+ String formatPressure(Pressure? num) => switch(settings.preferredPressureUnit) {
+ PressureUnit.mmHg => formatNum(num?.mmHg),
+ PressureUnit.kPa => formatNum(num?.kPa),
+ };
return Row(
children: [
Expanded(
flex: 3,
- child: Text(formatNum(record.systolic)),
+ child: Text(formatPressure(record.sys)),
),
Expanded(
flex: 3,
- child: Text(formatNum(record.diastolic)),
+ child: Text(formatPressure(record.dia)),
),
Expanded(
flex: 3,
- child: Text(formatNum(record.pulse)),
+ child: Text(formatNum(record.pul)),
),
],
);
}
void _deleteEntry(Settings settings, BuildContext context, AppLocalizations localizations) async {
- final model = Provider.of<BloodPressureModel>(context, listen: false);
+ final model = RepositoryProvider.of<BloodPressureRepository>(context);
final messanger = ScaffoldMessenger.of(context);
bool confirmedDeletion = true;
if (settings.confirmDeletion) {
@@ -103,7 +110,7 @@ class MeasurementListRow extends StatelessWidget {
}
if (confirmedDeletion) { // TODO: move out of model
- model.delete(record.creationTime);
+ await model.remove(record);
messanger.removeCurrentSnackBar();
messanger.showSnackBar(SnackBar(
duration: const Duration(seconds: 5),
app/lib/components/statistics/blood_pressure_distribution.dart
@@ -1,9 +1,9 @@
import 'package:blood_pressure_app/components/statistics/value_distribution.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Viewer for [ValueDistribution]s from [BloodPressureRecord]s.
///
@@ -79,19 +79,20 @@ class _BloodPressureDistributionState extends State<BloodPressureDistribution>
child: TabBarView(
controller: _controller,
children: [
+ // Preferred pressure unit can be ignored as values are relative.
ValueDistribution(
key: const Key('sys-dist'),
- values: widget.records.map((e) => e.systolic).whereNotNull(),
+ values: widget.records.map((e) => e.sys?.mmHg).whereNotNull(),
color: widget.settings.sysColor,
),
ValueDistribution(
key: const Key('dia-dist'),
- values: widget.records.map((e) => e.diastolic).whereNotNull(),
+ values: widget.records.map((e) => e.dia?.mmHg).whereNotNull(),
color: widget.settings.diaColor,
),
ValueDistribution(
key: const Key('pul-dist'),
- values: widget.records.map((e) => e.pulse).whereNotNull(),
+ values: widget.records.map((e) => e.pul).whereNotNull(),
color: widget.settings.pulColor,
),
],
app/lib/components/repository_builder.dart
@@ -1,5 +1,4 @@
import 'package:blood_pressure_app/components/consistent_future_builder.dart';
-import 'package:blood_pressure_app/model/datarange_extension.dart';
import 'package:blood_pressure_app/model/storage/intervall_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -40,7 +39,7 @@ class _RepositoryBuilderState<T, R extends Repository<T>> extends State<Reposito
return StreamBuilder(
stream: _repo.subscribe(),
builder: (context, _) => ConsistentFutureBuilder(
- future: _repo.get(range.dateRange),
+ future: _repo.get(range),
onData: widget.onData,
),
);
app/lib/model/export_import/column.dart
@@ -1,12 +1,10 @@
-import 'dart:convert';
-
-import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
import 'package:blood_pressure_app/model/export_import/record_formatter.dart';
-import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
+
+// TODO: respect preferred Pressure unit
/// Converters for [BloodPressureRecord] attributes.
class NativeColumn extends ExportColumn {
@@ -20,14 +18,14 @@ class NativeColumn extends ExportColumn {
systolic,
diastolic,
pulse,
- notes,
+ /*notes, FIXME
color,
- needlePin,
+ needlePin,*/
];
static final NativeColumn timestampUnixMs = NativeColumn._create(
'timestampUnixMs',
RowDataFieldType.timestamp,
- (record) => record.creationTime.millisecondsSinceEpoch.toString(),
+ (record) => record.time.millisecondsSinceEpoch.toString(),
(pattern) {
final value = int.tryParse(pattern);
return (value == null) ? null : DateTime.fromMillisecondsSinceEpoch(value);
@@ -36,21 +34,22 @@ class NativeColumn extends ExportColumn {
static final NativeColumn systolic = NativeColumn._create(
'systolic',
RowDataFieldType.sys,
- (record) => record.systolic.toString(),
+ (record) => (record.sys?.mmHg).toString(),
int.tryParse,
);
static final NativeColumn diastolic = NativeColumn._create(
'diastolic',
RowDataFieldType.dia,
- (record) => record.diastolic.toString(),
+ (record) => (record.dia?.mmHg).toString(),
int.tryParse,
);
static final NativeColumn pulse = NativeColumn._create(
'pulse',
RowDataFieldType.pul,
- (record) => record.pulse.toString(),
+ (record) => record.pul.toString(),
int.tryParse,
);
+ /*
static final NativeColumn notes = NativeColumn._create(
'notes',
RowDataFieldType.notes,
@@ -81,7 +80,7 @@ class NativeColumn extends ExportColumn {
}
}
);
-
+ */
final String _csvTitle;
final RowDataFieldType _restoreableType;
app/lib/model/export_import/csv_converter.dart
@@ -1,6 +1,5 @@
import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/column.dart';
import 'package:blood_pressure_app/model/export_import/import_field_type.dart' show RowDataFieldType;
import 'package:blood_pressure_app/model/export_import/record_parsing_result.dart';
@@ -8,6 +7,7 @@ import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
import 'package:collection/collection.dart';
import 'package:csv/csv.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Utility class to convert between csv strings and [BloodPressureRecord]s.
class CsvConverter {
@@ -142,7 +142,12 @@ class CsvConverter {
final MeasurementNeedlePin? needlePin = recordPieces.firstWhereOrNull(
(piece) => piece.$1 == RowDataFieldType.needlePin,)?.$2;
- records.add(BloodPressureRecord(timestamp, sys, dia, pul, note, needlePin: needlePin));
+ records.add(BloodPressureRecord(
+ time: timestamp,
+ sys: sys?.asMMHg,
+ dia: dia?.asMMHg,
+ pul: pul,
+ /*FIXME: note, needlePin: needlePin*/));
currentLineNumber++;
}
@@ -150,3 +155,8 @@ class CsvConverter {
return RecordParsingResult.ok(records);
}
}
+
+extension _AsMMHg on int {
+ /// Interprets the value as a Pressure in mmHg.
+ Pressure get asMMHg => Pressure.mmHg(this);
+}
app/lib/model/export_import/export_configuration.dart
@@ -91,8 +91,8 @@ class ActiveExportColumnConfiguration extends ChangeNotifier {
NativeColumn.systolic,
NativeColumn.diastolic,
NativeColumn.pulse,
- NativeColumn.notes,
- NativeColumn.needlePin,
+ /*NativeColumn.notes, FIXME
+ NativeColumn.needlePin,*/
],
ExportImportPreset.myHeart => [
BuildInColumn.mhDate,
app/lib/model/export_import/pdf_converter.dart
@@ -2,12 +2,12 @@ import 'dart:math';
import 'dart:typed_data';
import 'dart:ui';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
import 'package:intl/intl.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
app/lib/model/export_import/record_formatter.dart
@@ -1,10 +1,10 @@
import 'dart:convert';
import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
import 'package:flutter/material.dart';
import 'package:function_tree/function_tree.dart';
+import 'package:health_data_store/health_data_store.dart';
import 'package:intl/intl.dart';
/// Class to serialize and deserialize [BloodPressureRecord] values.
@@ -75,12 +75,12 @@ class ScriptedFormatter implements Formatter {
var fieldContents = pattern;
// variables
- fieldContents = fieldContents.replaceAll(r'$TIMESTAMP', record.creationTime.millisecondsSinceEpoch.toString());
- fieldContents = fieldContents.replaceAll(r'$SYS', record.systolic.toString());
- fieldContents = fieldContents.replaceAll(r'$DIA', record.diastolic.toString());
- fieldContents = fieldContents.replaceAll(r'$PUL', record.pulse.toString());
- fieldContents = fieldContents.replaceAll(r'$NOTE', record.notes);
- fieldContents = fieldContents.replaceAll(r'$COLOR', jsonEncode(record.needlePin?.toMap()));
+ fieldContents = fieldContents.replaceAll(r'$TIMESTAMP', record.time.millisecondsSinceEpoch.toString());
+ fieldContents = fieldContents.replaceAll(r'$SYS', (record.sys?.mmHg).toString());
+ fieldContents = fieldContents.replaceAll(r'$DIA', (record.dia?.mmHg).toString());
+ fieldContents = fieldContents.replaceAll(r'$PUL', record.pul.toString());
+ /*fieldContents = fieldContents.replaceAll(r'$NOTE', record.notes); FIXME
+ fieldContents = fieldContents.replaceAll(r'$COLOR', jsonEncode(record.needlePin?.toMap()));*/
// math
fieldContents = fieldContents.replaceAllMapped(RegExp(r'\{\{([^}]*)}}'), (m) {
@@ -193,7 +193,7 @@ class ScriptedTimeFormatter implements Formatter {
}
@override
- String encode(BloodPressureRecord record) => _timeFormatter.format(record.creationTime);
+ String encode(BloodPressureRecord record) => _timeFormatter.format(record.time);
@override
String? get formatPattern => _timeFormatter.pattern;
app/lib/model/export_import/record_parsing_result.dart
@@ -1,6 +1,7 @@
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Indicate a possible error during record parsing.
class RecordParsingResult {
app/lib/model/storage/convert_util.dart
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Utility class for converting dynamic values to concrete data types.
///
@@ -66,13 +67,13 @@ class ConvertUtil {
return null;
}
- static DateTimeRange? parseRange(start, end) {
+ static DateRange? parseRange(start, end) {
final startTimestamp = parseInt(start);
final endTimestamp = parseInt(end);
if (startTimestamp == null || endTimestamp == null) return null;
- return DateTimeRange(
- start: DateTime.fromMillisecondsSinceEpoch(startTimestamp),
- end: DateTime.fromMillisecondsSinceEpoch(endTimestamp),
+ return DateRange(
+ start: DateTime.fromMillisecondsSinceEpoch(startTimestamp),
+ end: DateTime.fromMillisecondsSinceEpoch(endTimestamp),
);
}
app/lib/model/storage/intervall_store.dart
@@ -4,6 +4,7 @@ import 'package:blood_pressure_app/model/storage/convert_util.dart';
import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Class for storing the current interval, as it is needed in start page, statistics and export.
class IntervallStorage extends ChangeNotifier {
@@ -23,14 +24,14 @@ class IntervallStorage extends ChangeNotifier {
}
/// Create a storage to interact with a display intervall.
- IntervallStorage({TimeStep? stepSize, DateTimeRange? range}) :
+ IntervallStorage({TimeStep? stepSize, DateRange? range}) :
_stepSize = stepSize ?? TimeStep.last7Days {
_currentRange = range ?? _getMostRecentDisplayIntervall();
}
TimeStep _stepSize;
- late DateTimeRange _currentRange;
+ late DateRange _currentRange;
/// Serialize the object to a restoreable map.
Map<String, dynamic> toMap() => <String, dynamic>{
@@ -51,9 +52,9 @@ class IntervallStorage extends ChangeNotifier {
setToMostRecentIntervall();
}
- DateTimeRange get currentRange => _currentRange;
+ DateRange get currentRange => _currentRange;
- set currentRange(DateTimeRange value) {
+ set currentRange(DateRange value) {
_currentRange = value;
notifyListeners();
}
@@ -69,47 +70,47 @@ class IntervallStorage extends ChangeNotifier {
final oldEnd = currentRange.end;
switch (stepSize) {
case TimeStep.day:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
start: oldStart.add(Duration(days: directionalStep)),
end: oldEnd.add(Duration(days: directionalStep)),
);
break;
case TimeStep.week:
case TimeStep.last7Days:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
start: oldStart.add(Duration(days: directionalStep * 7)),
end: oldEnd.add(Duration(days: directionalStep * 7)),
);
break;
case TimeStep.month:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
// No fitting Duration: wraps correctly according to doc
start: oldStart.copyWith(month: oldStart.month + directionalStep),
end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
);
break;
case TimeStep.year:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
// No fitting Duration: wraps correctly according to doc
start: oldStart.copyWith(year: oldStart.year + directionalStep),
end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
);
break;
case TimeStep.lifetime:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
start: DateTime.fromMillisecondsSinceEpoch(1),
end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
);
break;
case TimeStep.last30Days:
- currentRange = DateTimeRange(
+ currentRange = DateRange(
start: oldStart.add(Duration(days: directionalStep * 30)),
end: oldEnd.add(Duration(days: directionalStep * 30)),
);
break;
case TimeStep.custom:
final step = oldEnd.difference(oldStart) * directionalStep;
- currentRange = DateTimeRange(
+ currentRange = DateRange(
start: oldStart.add(step),
end: oldEnd.add(step),
);
@@ -117,35 +118,35 @@ class IntervallStorage extends ChangeNotifier {
}
}
- DateTimeRange _getMostRecentDisplayIntervall() {
+ DateRange _getMostRecentDisplayIntervall() {
final now = DateTime.now();
switch (stepSize) {
case TimeStep.day:
final start = DateTime(now.year, now.month, now.day);
- return DateTimeRange(start: start, end: start.copyWith(day: now.day + 1));
+ return DateRange(start: start, end: start.copyWith(day: now.day + 1));
case TimeStep.week:
final start = DateTime(now.year, now.month, now.day - (now.weekday - 1)); // monday
- return DateTimeRange(start: start, end: start.copyWith(day: start.day + DateTime.sunday)); // end of sunday
+ return DateRange(start: start, end: start.copyWith(day: start.day + DateTime.sunday)); // end of sunday
case TimeStep.month:
final start = DateTime(now.year, now.month);
- return DateTimeRange(start: start, end: start.copyWith(month: now.month + 1));
+ return DateRange(start: start, end: start.copyWith(month: now.month + 1));
case TimeStep.year:
final start = DateTime(now.year);
- return DateTimeRange(start: start, end: start.copyWith(year: now.year + 1));
+ return DateRange(start: start, end: start.copyWith(year: now.year + 1));
case TimeStep.lifetime:
final start = DateTime.fromMillisecondsSinceEpoch(1);
final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
- return DateTimeRange(start: start, end: endOfToday);
+ return DateRange(start: start, end: endOfToday);
case TimeStep.last7Days:
final start = now.subtract(const Duration(days: 7));
final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
- return DateTimeRange(start: start, end: endOfToday);
+ return DateRange(start: start, end: endOfToday);
case TimeStep.last30Days:
final start = now.subtract(const Duration(days: 30));
final endOfToday = now.copyWith(hour: 23, minute: 59, second: 59);
- return DateTimeRange(start: start, end: endOfToday);
+ return DateRange(start: start, end: endOfToday);
case TimeStep.custom:
- return DateTimeRange(
+ return DateRange(
start: now.subtract(currentRange.duration),
end: now,
);
app/lib/model/horizontal_graph_line.dart
@@ -1,5 +1,5 @@
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:flutter/material.dart';
+import 'package:health_data_store/health_data_store.dart';
/// Information about a straight horizontal line through the graph.
///
app/lib/screens/elements/display_interval_picker.dart
@@ -1,3 +1,4 @@
+import 'package:blood_pressure_app/model/datarange_extension.dart';
import 'package:blood_pressure_app/model/storage/intervall_store.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -71,12 +72,13 @@ class IntervalPicker extends StatelessWidget {
onChanged: (TimeStep? value) async {
if (value == TimeStep.custom) {
final res = await showDateRangePicker(
- context: context,
- firstDate: DateTime.fromMillisecondsSinceEpoch(1),
- lastDate: DateTime.now(),);
+ context: context,
+ firstDate: DateTime.fromMillisecondsSinceEpoch(1),
+ lastDate: DateTime.now(),
+ );
if (res != null) {
intervall.changeStepSize(value!);
- intervall.currentRange = res;
+ intervall.currentRange = res.dateRange;
}
} else if (value != null) {
intervall.changeStepSize(value);
app/lib/screens/elements/legacy_measurement_list.dart
@@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:collection';
import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
import 'package:blood_pressure_app/model/storage/intervall_store.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:blood_pressure_app/screens/elements/blood_pressure_builder.dart';
@@ -86,7 +85,6 @@ class LegacyMeasurementsList extends StatelessWidget {
confirmDismiss: (direction) async {
final repo = RepositoryProvider.of<BloodPressureRepository>(context);
if (direction == DismissDirection.startToEnd) { // edit
- final model = Provider.of<BloodPressureModel>(context, listen: false);
final entry = await showAddEntryDialoge(context,
Provider.of<Settings>(context, listen: false),
RepositoryProvider.of<MedicineRepository>(context),
@@ -94,11 +92,11 @@ class LegacyMeasurementsList extends StatelessWidget {
);
if (entry?.$1 != null) {
if (context.mounted) {
- // TODO: reimplement
+ // FIXME
// repo.addAndExport(context, entry!.$1!);
throw UnimplementedError('addAndExport not supported');
} else {
- unawaited(repo.add(entry!.$1!));
+ await repo.add(entry!.$1!);
}
}
assert(entry?.$2 == null);
@@ -139,7 +137,7 @@ class LegacyMeasurementsList extends StatelessWidget {
action: SnackBarAction(
label: AppLocalizations.of(context)!.btnUndo,
onPressed: () async {
- // TODO: reimplement
+ // FIXME
/*
model.addAndExport(context, BloodPressureRecord(
data[index].creationTime,
app/lib/screens/elements/measurement_graph.dart
@@ -15,8 +15,8 @@ import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class _LineChart extends StatefulWidget {
-
const _LineChart({this.height = 200});
+
final double height;
@override
@@ -26,86 +26,86 @@ class _LineChart extends StatefulWidget {
class _LineChartState extends State<_LineChart> {
@override
Widget build(BuildContext context) => SizedBox(
- height: widget.height,
- child: RepositoryBuilder<MedicineIntake, MedicineIntakeRepository>(
- rangeType: IntervallStoreManagerLocation.mainPage,
- onData: (context, List<dynamic> intakesData) => Consumer<Settings>(
- builder: (context, settings, child) => BloodPressureBuilder(
- rangeType: IntervallStoreManagerLocation.mainPage,
- onData: (BuildContext context, UnmodifiableListView<BloodPressureRecord> records) {
- // TODO: Figure out why type safety isn't possible. (see home_screen for more info)
- final List<MedicineIntake> intakes = intakesData.cast();
+ height: widget.height,
+ child: RepositoryBuilder<MedicineIntake, MedicineIntakeRepository>(
+ rangeType: IntervallStoreManagerLocation.mainPage,
+ onData: (context, List<dynamic> intakesData) => Consumer<Settings>(
+ builder: (context, settings, child) => BloodPressureBuilder(
+ rangeType: IntervallStoreManagerLocation.mainPage,
+ onData: (BuildContext context, UnmodifiableListView<BloodPressureRecord> records) {
+ // TODO: Figure out why type safety isn't possible. (see home_screen for more info)
+ final List<MedicineIntake> intakes = intakesData.cast();
- final List<BloodPressureRecord> data = records.toList();
- data.sort((a, b) => a.time.compareTo(b.time));
+ final List<BloodPressureRecord> data = records.toList();
+ data.sort((a, b) => a.time.compareTo(b.time));
- // calculate lines for graph
- final pulSpots = <FlSpot>[];
- final diaSpots = <FlSpot>[];
- final sysSpots = <FlSpot>[];
- int maxValue = 0;
- final int minValue = (settings.validateInputs ? 30 : 0);
- /// Horizontally first value
- double? graphBegin;
- /// Horizontally last value
- double? graphEnd;
- for (final e in data) {
- final x = e.time.millisecondsSinceEpoch.toDouble();
- if (e.dia != null) {
- diaSpots.add(FlSpot(x, e.dia!.mmHg.toDouble()));
- maxValue = max(maxValue, e.dia!.mmHg);
- }
- if (e.sys != null) {
- sysSpots.add(FlSpot(x, e.sys!.mmHg.toDouble()));
- maxValue = max(maxValue, e.sys!.mmHg);
- }
- if (e.pul != null) {
- pulSpots.add(FlSpot(x, e.pul!.mmHg.toDouble()));
- maxValue = max(maxValue, e.pul!.mmHg);
- }
- graphBegin ??= x;
- graphEnd ??= x;
- if (x < graphBegin) graphBegin = x;
- if (x > graphEnd) graphEnd = x;
- }
+ // calculate lines for graph
+ final pulSpots = <FlSpot>[];
+ final diaSpots = <FlSpot>[];
+ final sysSpots = <FlSpot>[];
+ int maxValue = 0;
+ final int minValue = (settings.validateInputs ? 30 : 0);
+ /// Horizontally first value
+ double? graphBegin;
+ /// Horizontally last value
+ double? graphEnd;
+ for (final e in data) {
+ final x = e.time.millisecondsSinceEpoch.toDouble();
+ if (e.dia != null) {
+ diaSpots.add(FlSpot(x, e.dia!.mmHg.toDouble()));
+ maxValue = max(maxValue, e.dia!.mmHg);
+ }
+ if (e.sys != null) {
+ sysSpots.add(FlSpot(x, e.sys!.mmHg.toDouble()));
+ maxValue = max(maxValue, e.sys!.mmHg);
+ }
+ if (e.pul != null) {
+ pulSpots.add(FlSpot(x, e.pul!.toDouble()));
+ maxValue = max(maxValue, e.pul!);
+ }
+ graphBegin ??= x;
+ graphEnd ??= x;
+ if (x < graphBegin) graphBegin = x;
+ if (x > graphEnd) graphEnd = x;
+ }
- if (diaSpots.length < 2 && sysSpots.length < 2 && pulSpots.length < 2 || graphBegin == null || graphEnd == null) {
- return Text(AppLocalizations.of(context)!.errNotEnoughDataToGraph);
- }
+ if (diaSpots.length < 2 && sysSpots.length < 2 && pulSpots.length < 2 || graphBegin == null || graphEnd == null) {
+ return Text(AppLocalizations.of(context)!.errNotEnoughDataToGraph);
+ }
- // Add padding to avoid overflowing vertical lines.
- final len = graphEnd - graphBegin;
- graphBegin -= len / 40;
- graphEnd += len / 40;
+ // Add padding to avoid overflowing vertical lines.
+ final len = graphEnd - graphBegin;
+ graphBegin -= len / 40;
+ graphEnd += len / 40;
- return TweenAnimationBuilder<double>(
- duration: Duration(milliseconds: settings.animationSpeed), // interacts with LineChart duration property
- tween: Tween<double>(begin: 0, end: settings.graphLineThickness),
- builder: (context, animatedThickness, child) => LineChart(
- duration: const Duration(milliseconds: 200),
- LineChartData(
- minY: minValue.toDouble(),
- maxY: maxValue + 5,
- minX: graphBegin,
- maxX: graphEnd,
- clipData: const FlClipData.all(),
- titlesData: _buildFlTitlesData(settings,
- DateTimeRange(start: data.first.time, end: data.last.time),),
- lineTouchData: const LineTouchData(
- touchTooltipData: LineTouchTooltipData(tooltipMargin: -200, tooltipRoundedRadius: 20),
- ),
- lineBarsData: buildBars(animatedThickness, settings, sysSpots, diaSpots, pulSpots,
- maxValue, minValue, graphBegin, graphEnd, records,
- intakes,
- ),
- ),
- ),
- );
- },
+ return TweenAnimationBuilder<double>(
+ duration: Duration(milliseconds: settings.animationSpeed), // interacts with LineChart duration property
+ tween: Tween<double>(begin: 0, end: settings.graphLineThickness),
+ builder: (context, animatedThickness, child) => LineChart(
+ duration: const Duration(milliseconds: 200),
+ LineChartData(
+ minY: minValue.toDouble(),
+ maxY: maxValue + 5,
+ minX: graphBegin,
+ maxX: graphEnd,
+ clipData: const FlClipData.all(),
+ titlesData: _buildFlTitlesData(settings,
+ DateTimeRange(start: data.first.time, end: data.last.time),),
+ lineTouchData: const LineTouchData(
+ touchTooltipData: LineTouchTooltipData(tooltipMargin: -200, tooltipRoundedRadius: 20),
+ ),
+ lineBarsData: buildBars(animatedThickness, settings, sysSpots, diaSpots, pulSpots,
+ maxValue, minValue, graphBegin, graphEnd, records,
+ intakes,
+ ),
+ ),
),
- ),
+ );
+ },
),
- );
+ ),
+ ),
+ );
List<LineChartBarData> buildBars(
double animatedThickness,
app/lib/screens/subsettings/foreign_db_import_screen.dart
@@ -1,14 +1,13 @@
-import 'dart:convert';
-
import 'package:blood_pressure_app/components/consistent_future_builder.dart';
import 'package:blood_pressure_app/components/dialoges/tree_selection_dialoge.dart';
-import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
-import 'package:blood_pressure_app/model/blood_pressure/record.dart';
import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
import 'package:blood_pressure_app/model/storage/convert_util.dart';
+import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
+import 'package:provider/provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqlparser/sqlparser.dart';
@@ -92,29 +91,32 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
&& madeSelections.every(row.containsKey),);
final timestamp = ConvertUtil.parseTime(row[timeColumn]);
if (timestamp == null) throw FormatException('Unable to parse time: ${row[timeColumn]}'); // TODO: error handling
- var record = BloodPressureRecord(timestamp, null, null, null, '');
+ var record = BloodPressureRecord(time: timestamp);
+ final settings = context.read<Settings>();
for (final colType in dataColumns) {
switch (colType.$2) {
case RowDataFieldType.timestamp:
assert(false, 'Not up for selection');
case RowDataFieldType.sys:
+ final val = ConvertUtil.parseInt(row[colType.$1]);
record = record.copyWith(
- systolic: ConvertUtil.parseInt(row[colType.$1]),
+ sys: (val == null) ? null : settings.preferredPressureUnit.wrap(val), // TODO: is this correct?
);
case RowDataFieldType.dia:
+ final val = ConvertUtil.parseInt(row[colType.$1]);
record = record.copyWith(
- diastolic: ConvertUtil.parseInt(row[colType.$1]),
+ dia: (val == null) ? null : settings.preferredPressureUnit.wrap(val),
);
case RowDataFieldType.pul:
record = record.copyWith(
- pulse: ConvertUtil.parseInt(row[colType.$1]),
+ pul: ConvertUtil.parseInt(row[colType.$1]),
);
case RowDataFieldType.notes:
- record = record.copyWith(
+ /*re cord = record.copyWith( FIXME
notes: ConvertUtil.parseString(row[colType.$1]),
- );
+ );*/
case RowDataFieldType.needlePin:
- try {
+ /*try { FIXME
final json = jsonDecode(row[colType.$1].toString());
if (json is! Map<String, dynamic>) continue;
final pin = MeasurementNeedlePin.fromMap(json);
@@ -123,7 +125,7 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
);
} on FormatException {
// Not parsable: silently ignore for now
- }
+ }*/
}
}
measurements.add(record);
app/lib/screens/home_screen.dart
@@ -3,7 +3,6 @@ import 'dart:async';
import 'package:blood_pressure_app/components/dialoges/add_measurement_dialoge.dart';
import 'package:blood_pressure_app/components/measurement_list/measurement_list.dart';
import 'package:blood_pressure_app/components/repository_builder.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
import 'package:blood_pressure_app/model/storage/intervall_store.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:blood_pressure_app/screens/elements/blood_pressure_builder.dart';
@@ -118,7 +117,7 @@ class AppHome extends StatelessWidget {
tooltip: localizations.addMeasurement,
autofocus: true,
onPressed: () async {
- final model = Provider.of<BloodPressureModel>(context, listen: false);
+ final model = Provider.of<BloodPressureRepository>(context, listen: false);
final intakes = RepositoryProvider.of<MedicineIntakeRepository>(context);
final measurement = await showAddEntryDialoge(context,
Provider.of<Settings>(context, listen: false),
@@ -127,13 +126,14 @@ class AppHome extends StatelessWidget {
if (measurement == null) return;
if (measurement.$1 != null) {
if (context.mounted) {
- model.addAndExport(context, measurement.$1!);
+ await model.add(measurement.$1!);
+ // model.addAndExport(context, measurement.$1!); FIXME
} else {
- model.add(measurement.$1!);
+ await model.add(measurement.$1!);
}
}
if (measurement.$2 != null) {
- intakes.add(measurement.$2!);
+ await intakes.add(measurement.$2!);
}
},
child: const Icon(Icons.add,),
app/lib/screens/settings_screen.dart
@@ -4,7 +4,6 @@ import 'package:blood_pressure_app/components/consistent_future_builder.dart';
import 'package:blood_pressure_app/components/dialoges/enter_timeformat_dialoge.dart';
import 'package:blood_pressure_app/components/dialoges/input_dialoge.dart';
import 'package:blood_pressure_app/components/settings/settings_widgets.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
import 'package:blood_pressure_app/model/blood_pressure/pressure_unit.dart';
import 'package:blood_pressure_app/model/blood_pressure/warn_values.dart';
import 'package:blood_pressure_app/model/iso_lang_names.dart';
@@ -19,7 +18,9 @@ import 'package:blood_pressure_app/screens/subsettings/version_screen.dart';
import 'package:blood_pressure_app/screens/subsettings/warn_about_screen.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:health_data_store/health_data_store.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path/path.dart';
import 'package:provider/provider.dart';
@@ -296,7 +297,7 @@ class SettingsPage extends StatelessWidget {
assert(dbPath != inMemoryDatabasePath);
dbPath = join(dbPath, 'config.db');
assert(Platform.isAndroid);
- PlatformClient.shareFile(dbPath, 'application/vnd.sqlite3');
+ await PlatformClient.shareFile(dbPath, 'application/vnd.sqlite3');
},
),
ListTile(
@@ -369,12 +370,12 @@ class SettingsPage extends StatelessWidget {
return;
}
// TODO: Show import preview
- final model = Provider.of<BloodPressureModel>(context, listen: false);
- await model.addAll(data, context);
+ final repo = RepositoryProvider.of<BloodPressureRepository>(context);
+ await Future.forEach(data, repo.add);
// TODO: give feedback
},
- )
+ ),
],
),
TitledColumn(title: Text(localizations.aboutWarnValuesScreen), children: [
app/lib/main.dart
@@ -2,7 +2,6 @@ import 'dart:io';
import 'package:blood_pressure_app/components/consistent_future_builder.dart';
import 'package:blood_pressure_app/model/blood_pressure/medicine/intake_history.dart';
-import 'package:blood_pressure_app/model/blood_pressure/model.dart';
import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
import 'package:blood_pressure_app/model/storage/db/config_db.dart';
@@ -22,7 +21,6 @@ import 'package:provider/provider.dart';
import 'package:sqflite/sqflite.dart';
late final ConfigDB _database;
-late final BloodPressureModel _bloodPressureModel;
void main() async {
runApp(ConsistentFutureBuilder(
@@ -36,9 +34,7 @@ void main() async {
Future<Widget> _loadApp() async {
WidgetsFlutterBinding.ensureInitialized();
// 2 different db files
- _bloodPressureModel = await BloodPressureModel.create();
-
- _database = await ConfigDB.open();
+ _database = await ConfigDB.open();
final configDao = ConfigDao(_database);
final settings = await configDao.loadSettings(0);
@@ -99,7 +95,6 @@ Future<Widget> _loadApp() async {
// TODO: fix navigation test failures
return MultiProvider(providers: [
- ChangeNotifierProvider(create: (context) => _bloodPressureModel),
ChangeNotifierProvider(create: (context) => settings),
ChangeNotifierProvider(create: (context) => exportSettings),
ChangeNotifierProvider(create: (context) => csvExportSettings),
@@ -195,5 +190,4 @@ Future<void> closeDatabases() async {
_isDatabaseClosed = true;
await _database.database.close();
- await _bloodPressureModel.close();
}
app/pubspec.lock
@@ -360,10 +360,10 @@ packages:
dependency: "direct main"
description:
name: intl
- sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
+ sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
- version: "0.18.1"
+ version: "0.19.0"
js:
dependency: transitive
description:
@@ -392,18 +392,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
+ sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
url: "https://pub.dev"
source: hosted
- version: "10.0.4"
+ version: "10.0.5"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
+ sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
url: "https://pub.dev"
source: hosted
- version: "3.0.3"
+ version: "3.0.5"
leak_tracker_testing:
dependency: transitive
description:
@@ -448,18 +448,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
- sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
+ sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
source: hosted
- version: "0.8.0"
+ version: "0.11.1"
meta:
dependency: transitive
description:
name: meta
- sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
+ sha256: "25dfcaf170a0190f47ca6355bdd4552cb8924b430512ff0cafb8db9bd41fe33b"
url: "https://pub.dev"
source: hosted
- version: "1.12.0"
+ version: "1.14.0"
mockito:
dependency: "direct dev"
description:
@@ -845,10 +845,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
+ sha256: "2419f20b0c8677b2d67c8ac4d1ac7372d862dc6c460cdbb052b40155408cd794"
url: "https://pub.dev"
source: hosted
- version: "0.7.0"
+ version: "0.7.1"
translations_cleaner:
dependency: "direct dev"
description:
@@ -941,10 +941,10 @@ packages:
dependency: transitive
description:
name: vm_service
- sha256: a2662fb1f114f4296cf3f5a50786a2d888268d7776cf681aa17d660ffa23b246
+ sha256: "7475cb4dd713d57b6f7464c0e13f06da0d535d8b2067e188962a59bac2cf280b"
url: "https://pub.dev"
source: hosted
- version: "14.0.0"
+ version: "14.2.2"
watcher:
dependency: transitive
description:
health_data_store/lib/src/health_data_store.dart
@@ -31,6 +31,7 @@ class HealthDataStore {
/// returned. This is done to improve performance while interacting with the
/// database.
static Future<HealthDataStore> load(Database db) async {
+ // TODO: loading readOnly dbs
assert(db.isOpen);
final mngr = await DatabaseManager.load(db);
unawaited(mngr.performCleanup());