Commit d698580
Changed files (6)
lib
components
measurement_list
screens
lib/components/measurement_list/measurement_list_entry.dart
@@ -36,7 +36,11 @@ class MeasurementListRow extends StatelessWidget {
final model = Provider.of<BloodPressureModel>(context, listen: false);
final measurement = await future;
if (measurement == null) return;
- model.add(measurement);
+ if (context.mounted) {
+ model.addAndExport(context, measurement);
+ } else {
+ model.add(measurement);
+ }
},
icon: const Icon(Icons.edit),
tooltip: localizations.edit,
lib/components/legacy_measurement_list.dart
@@ -86,7 +86,11 @@ class LegacyMeasurementsList extends StatelessWidget {
final model = Provider.of<BloodPressureModel>(context, listen: false);
final measurement = await future;
if (measurement == null) return false;
- model.add(measurement);
+ if (context.mounted) {
+ model.addAndExport(context, measurement);
+ } else {
+ model.add(measurement);
+ }
return false;
} else { // delete
bool dialogeDeletionConfirmed = false;
@@ -126,7 +130,7 @@ class LegacyMeasurementsList extends StatelessWidget {
action: SnackBarAction(
label: AppLocalizations.of(context)!.btnUndo,
onPressed: () async {
- model.add(BloodPressureRecord(
+ model.addAndExport(context, BloodPressureRecord(
data[index].creationTime,
data[index].systolic,
data[index].diastolic,
lib/model/blood_pressure.dart
@@ -1,11 +1,15 @@
import 'dart:async';
import 'dart:convert';
-import 'package:blood_pressure_app/model/central_callback.dart';
+import 'package:blood_pressure_app/model/export_import.dart';
+import 'package:blood_pressure_app/model/export_options.dart';
+import 'package:blood_pressure_app/model/storage/storage.dart';
import 'package:blood_pressure_app/screens/error_reporting.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:path/path.dart';
+import 'package:provider/provider.dart';
import 'package:sqflite/sqflite.dart';
class BloodPressureModel extends ChangeNotifier {
@@ -71,6 +75,9 @@ class BloodPressureModel extends ChangeNotifier {
}
/// Adds a new measurement at the correct chronological position in the List.
+ ///
+ /// This is not suitable for user inputs, as in this case export is needed as well. Consider using
+ /// [BloodPressureModel.addAndExport] instead.
Future<void> add(BloodPressureRecord measurement) async {
if (!_database.isOpen) return;
final existing = await _database.query('bloodPressureModel',
@@ -97,10 +104,25 @@ class BloodPressureModel extends ChangeNotifier {
'needlePin': jsonEncode(measurement.needlePin)
});
}
- CentralCallback.instance?.onMeasurementAdded(measurement);
notifyListeners();
}
+ Future<void> addAndExport(BuildContext context, BloodPressureRecord record) async {
+ await add(record);
+
+ if (!context.mounted) return;
+ final exportSettings = Provider.of<ExportSettings>(context, listen: false);
+ if (exportSettings.exportAfterEveryEntry) {
+ final r = Provider.of<IntervallStoreManager>(context, listen: false).exportPage.currentRange;
+ final loc = AppLocalizations.of(context)!;
+ final exportConfigurationModel = await ExportConfigurationModel.get(loc);
+ final allMeasurements = await getInTimeRange(r.start, r.end);
+ if (!context.mounted) return;
+ final exporter = Exporter.load(context, allMeasurements, exportConfigurationModel);
+ await exporter.export();
+ }
+ }
+
Future<void> delete(DateTime timestamp) async {
if (!_database.isOpen) return;
_database.delete('bloodPressureModel', where: 'timestamp = ?', whereArgs: [timestamp.millisecondsSinceEpoch]);
lib/model/central_callback.dart
@@ -1,73 +0,0 @@
-import 'package:blood_pressure_app/components/consistent_future_builder.dart';
-import 'package:blood_pressure_app/model/blood_pressure.dart';
-import 'package:blood_pressure_app/model/export_import.dart';
-import 'package:blood_pressure_app/model/export_options.dart';
-import 'package:blood_pressure_app/model/storage/storage.dart';
-import 'package:flutter/material.dart';
-import 'package:flutter_gen/gen_l10n/app_localizations.dart';
-import 'package:provider/provider.dart';
-
-/// Central place to put code that needs to be called from multiple places.
-///
-/// This solution is suboptimal, as it doesn't utilize the framework. Before falling back to this for implementing
-/// callbacks, a solution using the framework should be considered. This solution at least allows for simple usage
-/// in the rest of the code.
-class CentralCallback {
- CentralCallback._create(
- this._context,
- this._exportSettings,
- this._bloodPressureModel,
- this._exportConfigurationModel,
- this._intervallStoreManager);
-
- static CentralCallback? _instance;
-
- /// CentralCallback instance.
- ///
- /// This is null until [CentralCallback.init] is called.
- static CentralCallback? get instance => _instance;
-
- /// Creates [CentralCallback.instance] object with values passed on first call.
- ///
- /// Subsequent calls will be ignored.
- static Future<void> init(BuildContext context) async {
- if (instance != null) return;
- assert (context.mounted, 'Expects valid context');
- if (!context.mounted) return;
-
- final loc = AppLocalizations.of(context)!;
- final exportSet = Provider.of<ExportSettings>(context, listen: false);
- final bpModel = Provider.of<BloodPressureModel>(context, listen: false);
- final intervalls = Provider.of<IntervallStoreManager>(context, listen: false);
- _instance = CentralCallback._create(context, exportSet, bpModel, await ExportConfigurationModel.get(loc),intervalls);
- return;
- }
-
- final BuildContext _context;
- final ExportSettings _exportSettings;
- final BloodPressureModel _bloodPressureModel;
- final ExportConfigurationModel _exportConfigurationModel;
- final IntervallStoreManager _intervallStoreManager;
-
- void onMeasurementAdded(BloodPressureRecord record) async {
- final r = _intervallStoreManager.exportPage.currentRange;
- final allMeasurements = await _bloodPressureModel.getInTimeRange(r.start, r.end);
-
- assert(_context.mounted);
- if (_exportSettings.exportAfterEveryEntry && _context.mounted) {
- final exporter = Exporter.load(_context, allMeasurements, _exportConfigurationModel);
- exporter.export();
- }
- }
-}
-
-class CentralCallbackInitializer extends StatelessWidget {
- /// Create a widget that ensures that CentralCallback is initialized before the [child] is visible.
- const CentralCallbackInitializer({super.key, required this.child});
-
- final Widget child;
-
- @override
- Widget build(BuildContext context) => ConsistentFutureBuilder(future: CentralCallback.init(context),
- onData: (context, _) => child, onWaiting: const SizedBox.shrink(),);
-}
\ No newline at end of file
lib/model/ram_only_implementations.dart
@@ -41,4 +41,9 @@ class RamBloodPressureModel extends ChangeNotifier implements BloodPressureModel
@override
Future<void> close() async {}
+
+ @override
+ Future<void> addAndExport(BuildContext context, BloodPressureRecord record) async {
+ add(record);
+ }
}
\ No newline at end of file
lib/screens/home.dart
@@ -2,7 +2,6 @@ import 'package:blood_pressure_app/components/dialoges/add_measurement.dart';
import 'package:blood_pressure_app/components/legacy_measurement_list.dart';
import 'package:blood_pressure_app/components/measurement_graph.dart';
import 'package:blood_pressure_app/model/blood_pressure.dart';
-import 'package:blood_pressure_app/model/central_callback.dart';
import 'package:blood_pressure_app/model/storage/settings_store.dart';
import 'package:blood_pressure_app/screens/settings.dart';
import 'package:blood_pressure_app/screens/statistics.dart';
@@ -14,10 +13,7 @@ import 'package:provider/provider.dart';
import '../components/measurement_list/measurement_list.dart';
-/// Is true during the first [AppHome.build].
-///
-/// The only use of this variable is to avoid calling [showAddMeasurementDialoge] twice,
-/// when startWithAddMeasurementPage is active
+/// Is true during the first [AppHome.build] before creating the widget.
bool _appStart = true;
class AppHome extends StatelessWidget {
@@ -28,14 +24,17 @@ class AppHome extends StatelessWidget {
final localizations = AppLocalizations.of(context)!;
// direct use of settings possible as no listening is required
if (_appStart) {
- CentralCallback.init(context);
if (Provider.of<Settings>(context, listen: false).startWithAddMeasurementPage) {
SchedulerBinding.instance.addPostFrameCallback((_) async {
final future = showAddMeasurementDialoge(context, Provider.of<Settings>(context, listen: false));
final model = Provider.of<BloodPressureModel>(context, listen: false);
final measurement = await future;
if (measurement == null) return;
- model.add(measurement);
+ if (context.mounted) {
+ model.addAndExport(context, measurement);
+ } else {
+ model.add(measurement);
+ }
});
}
}
@@ -91,14 +90,11 @@ class AppHome extends StatelessWidget {
final model = Provider.of<BloodPressureModel>(context, listen: false);
final measurement = await future;
if (measurement == null) return;
- model.add(measurement);
- // TODO: call export after every entry
- /*
- if (settings.exportAfterEveryEntry && context.mounted) {
- final exporter = Exporter.load(context, await model.all, await ExportConfigurationModel.get(localizations));
- exporter.export();
- }
- */
+ if (context.mounted) {
+ model.addAndExport(context, measurement);
+ } else {
+ model.add(measurement);
+ }
},
child: const Icon(Icons.add,),
),