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}