import 'package:flutter/material.dart'; enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker } 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 { final Map _features = { MeteringScreenLayoutFeature.extremeExposurePairs: true, MeteringScreenLayoutFeature.filmPicker: true, }; @override Widget build(BuildContext context) { return MeteringScreenLayout( features: Map.from(_features), child: widget.child, ); } void updateFeatures(Map features) { setState(() { features.forEach((key, value) { _features.update( key, (_) => value, ifAbsent: () => value, ); }); }); } } class MeteringScreenLayout extends InheritedModel { final Map features; const MeteringScreenLayout({ required this.features, required super.child, super.key, }); static Map of(BuildContext context, {bool listen = true}) { if (listen) { return context.dependOnInheritedWidgetOfExactType()!.features; } else { return context.findAncestorWidgetOfExactType()!.features; } } static bool featureStatusOf(BuildContext context, MeteringScreenLayoutFeature feature) { return InheritedModel.inheritFrom(context, aspect: feature)! .features[feature]!; } @override bool updateShouldNotify(MeteringScreenLayout oldWidget) => true; @override bool updateShouldNotifyDependent( MeteringScreenLayout oldWidget, Set dependencies, ) { for (final dependecy in dependencies) { if (oldWidget.features[dependecy] != features[dependecy]) { return true; } } return false; } }