m3_lightmeter/lib/providers/remote_config_provider.dart

79 lines
2 KiB
Dart
Raw Normal View History

2023-10-31 17:18:23 +00:00
import 'dart:async';
2023-10-28 20:40:56 +00:00
import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/feature.dart';
2023-10-31 17:18:23 +00:00
import 'package:lightmeter/data/remote_config_service.dart';
class RemoteConfigProvider extends StatefulWidget {
final RemoteConfigService remoteConfigService;
final Widget child;
const RemoteConfigProvider({
required this.remoteConfigService,
required this.child,
super.key,
});
@override
State<RemoteConfigProvider> createState() => RemoteConfigProviderState();
}
class RemoteConfigProviderState extends State<RemoteConfigProvider> {
late final Map<Feature, dynamic> _config = widget.remoteConfigService.getAll();
late final StreamSubscription<Set<Feature>> _updatesSubscription;
@override
void initState() {
super.initState();
_updatesSubscription = widget.remoteConfigService.onConfigUpdated().listen(_updateFeatures);
}
@override
void dispose() {
_updatesSubscription.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return RemoteConfig(
config: _config,
child: widget.child,
);
}
void _updateFeatures(Set<Feature> updatedFeatures) {
for (final feature in updatedFeatures) {
_config[feature] = widget.remoteConfigService.getValue(feature);
}
setState(() {});
}
}
class RemoteConfig extends InheritedModel<Feature> {
final Map<Feature, dynamic> _config;
2023-10-28 20:40:56 +00:00
const RemoteConfig({
super.key,
2023-10-31 17:18:23 +00:00
required Map<Feature, dynamic> config,
2023-10-28 20:40:56 +00:00
required super.child,
2023-10-31 17:18:23 +00:00
}) : _config = config;
2023-10-28 20:40:56 +00:00
static bool isEnabled(BuildContext context, Feature feature) {
2023-10-31 17:18:23 +00:00
return InheritedModel.inheritFrom<RemoteConfig>(context)!._config[feature] as bool;
2023-10-28 20:40:56 +00:00
}
@override
bool updateShouldNotify(RemoteConfig oldWidget) => true;
2023-10-31 17:18:23 +00:00
@override
bool updateShouldNotifyDependent(RemoteConfig oldWidget, Set<Feature> features) {
for (final feature in features) {
if (oldWidget._config[feature] != _config[feature]) {
return true;
}
}
return false;
}
2023-10-28 20:40:56 +00:00
}