Commit d698580

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-11-13 16:53:21
improve code quality
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent ae785d0
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,),
                     ),