import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:provider/provider.dart'; class MeteringScreenLayoutProvider extends StatefulWidget { final Widget child; const MeteringScreenLayoutProvider({required this.child, super.key}); static MeteringScreenLayoutProviderState of(BuildContext context) { return context.findAncestorStateOfType()!; } @override State createState() => MeteringScreenLayoutProviderState(); } class MeteringScreenLayoutProviderState extends State { late final MeteringScreenLayoutConfig _config = context.read().meteringScreenLayout; @override Widget build(BuildContext context) { return MeteringScreenLayout( config: MeteringScreenLayoutConfig.from(_config), child: widget.child, ); } void updateFeatures(MeteringScreenLayoutConfig config) { setState(() { config.forEach((key, value) { _config.update( key, (_) => value, ifAbsent: () => value, ); }); }); context.read().meteringScreenLayout = _config; } } class MeteringScreenLayout extends InheritedModel { final MeteringScreenLayoutConfig config; const MeteringScreenLayout({ required this.config, required super.child, super.key, }); static MeteringScreenLayoutConfig of(BuildContext context, {bool listen = true}) { if (listen) { return context.dependOnInheritedWidgetOfExactType()!.config; } else { return context.findAncestorWidgetOfExactType()!.config; } } static bool featureStatusOf(BuildContext context, MeteringScreenLayoutFeature feature) { return InheritedModel.inheritFrom(context, aspect: feature)! .config[feature]!; } @override bool updateShouldNotify(MeteringScreenLayout oldWidget) => true; @override bool updateShouldNotifyDependent( MeteringScreenLayout oldWidget, Set dependencies, ) { for (final dependecy in dependencies) { if (oldWidget.config[dependecy] != config[dependecy]) { return true; } } return false; } }