main
1import 'package:blood_pressure_app/data_util/consistent_future_builder.dart';
2import 'package:blood_pressure_app/model/storage/interval_store.dart';
3import 'package:flutter/material.dart';
4import 'package:flutter_bloc/flutter_bloc.dart';
5import 'package:health_data_store/health_data_store.dart';
6import 'package:provider/provider.dart';
7
8/// A builder that provides the contents of a repository.
9class RepositoryBuilder<T, R extends Repository<T>> extends StatefulWidget {
10 /// Create a builder that provides the contents of a repository.
11 const RepositoryBuilder({super.key,
12 required this.rangeType,
13 required this.onData,
14 });
15
16 /// Which measurements to load.
17 final IntervalStoreManagerLocation rangeType;
18
19 /// The build strategy once the data loaded.
20 final Widget Function(BuildContext, List<T>) onData;
21
22 @override
23 State<RepositoryBuilder<T, R>> createState() => _RepositoryBuilderState<T, R>();
24}
25
26class _RepositoryBuilderState<T, R extends Repository<T>> extends State<RepositoryBuilder<T, R>> {
27 late final R _repo;
28
29 @override
30 void initState() {
31 super.initState();
32 _repo = RepositoryProvider.of<R>(context);
33 }
34
35 @override
36 Widget build(BuildContext context) => Consumer<IntervalStoreManager>(
37 builder: (context, intervallManager, child) {
38 final range = intervallManager.get(widget.rangeType).currentRange;
39 return StreamBuilder(
40 stream: _repo.subscribe(),
41 builder: (context, _) => ConsistentFutureBuilder(
42 future: _repo.get(range),
43 onData: widget.onData,
44 ),
45 );
46 },
47 );
48}