Commit ae2d196
Changed files (4)
app
lib
components
health_data_store
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" />