Commit ae2d196

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-04-04 13:03:20
implement repository builder
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 46c6eda
Changed files (4)
app/lib/components/repository_builder.dart
@@ -0,0 +1,50 @@
+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';
+import 'package:health_data_store/health_data_store.dart';
+import 'package:provider/provider.dart';
+
+/// A builder that provides the contents of a repository.
+class RepositoryBuilder<T, R extends Repository<T>> extends StatefulWidget {
+  /// Create a builder that provides the contents of a repository.
+  const RepositoryBuilder({super.key,
+    required this.rangeType,
+    required this.onData,
+  });
+
+  /// Which measurements to load.
+  final IntervallStoreManagerLocation rangeType;
+
+  /// The build strategy once the data loaded.
+  final Widget Function(BuildContext, List<T>) onData;
+
+  @override
+  State<RepositoryBuilder> createState() => _RepositoryBuilderState<T, R>();
+}
+
+class _RepositoryBuilderState<T, R extends Repository<T>> extends State<RepositoryBuilder> {
+  late final R _repo;
+
+  @override
+  void initState() {
+    super.initState();
+    _repo = RepositoryProvider.of<R>(context);
+  }
+
+  @override
+  Widget build(BuildContext context) => Consumer<IntervallStoreManager>(
+    builder: (context, intervallManager, child) {
+      final range = intervallManager.get(widget.rangeType).currentRange;
+      return StreamBuilder(
+        stream: _repo.subscribe(),
+        builder: (context, _) => ConsistentFutureBuilder(
+          future: _repo.get(range.dateRange),
+          onData: widget.onData,
+        ),
+      );
+    },
+  );
+}
+// TODO: test
app/lib/model/datarange_extension.dart
@@ -0,0 +1,8 @@
+import 'package:flutter/material.dart';
+import 'package:health_data_store/health_data_store.dart';
+
+/// Allow converting to custom [DateRange] implementation.
+extension DateRangeCompat on DateTimeRange {
+  /// Convert to [DateRange].
+  DateRange get dateRange => DateRange(start: start, end: end);
+}
health_data_store/lib/health_data_store.dart
@@ -30,6 +30,7 @@ export 'src/repositories/blood_pressure_repository.dart';
 export 'src/repositories/medicine_intake_repository.dart';
 export 'src/repositories/medicine_repository.dart';
 export 'src/repositories/note_repository.dart';
+export 'src/repositories/repository.dart';
 // types
 export 'src/types/blood_pressure_record.dart';
 export 'src/types/date_range.dart';
blood_pressure_app.iml
@@ -141,6 +141,12 @@
       <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows/example/.dart_tool" />
       <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows/example/.pub" />
       <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/url_launcher_windows/example/build" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/.dart_tool" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/.pub" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/build" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/example/.dart_tool" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/example/.pub" />
+      <excludeFolder url="file://$MODULE_DIR$/app/windows/flutter/ephemeral/.plugin_symlinks/permission_handler_windows/example/build" />
     </content>
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="Dart SDK" level="project" />