Commit 10222f4

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-11-13 14:54:26
reimplement export after import
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent e4b9937
lib/model/blood_pressure.dart
@@ -1,6 +1,7 @@
 import 'dart:async';
 import 'dart:convert';
 
+import 'package:blood_pressure_app/model/central_callback.dart';
 import 'package:blood_pressure_app/screens/error_reporting.dart';
 import 'package:collection/collection.dart';
 import 'package:flutter/material.dart';
@@ -8,7 +9,6 @@ import 'package:path/path.dart';
 import 'package:sqflite/sqflite.dart';
 
 class BloodPressureModel extends ChangeNotifier {
-  static const maxEntries = 2E64; // https://www.sqlite.org/limits.html Nr.13
   late final Database _database;
 
   BloodPressureModel._create();
@@ -97,6 +97,7 @@ class BloodPressureModel extends ChangeNotifier {
         'needlePin': jsonEncode(measurement.needlePin)
       });
     }
+    CentralCallback.instance?.onMeasurementAdded(measurement);
     notifyListeners();
   }
 
lib/model/central_callback.dart
@@ -0,0 +1,73 @@
+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/main.dart
@@ -1,5 +1,6 @@
 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/central_callback.dart';
 import 'package:blood_pressure_app/model/storage/db/config_dao.dart';
 import 'package:blood_pressure_app/model/storage/db/config_db.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
@@ -55,7 +56,7 @@ Future<Widget> _loadApp() async {
     ChangeNotifierProvider(create: (context) => csvExportSettings),
     ChangeNotifierProvider(create: (context) => pdfExportSettings),
     ChangeNotifierProvider(create: (context) => intervalStorageManager),
-  ], child: const AppRoot());
+  ], child: AppRoot());
 }
 
 class AppRoot extends StatelessWidget {
@@ -93,7 +94,7 @@ class AppRoot extends StatelessWidget {
         ],
         supportedLocales: AppLocalizations.supportedLocales,
         locale: settings.language,
-        home: const AppHome(),
+        home: const CentralCallbackInitializer(child: AppHome()),
       );
     });
   }