import 'package:flutter/widgets.dart'; /// StatefulWidget that wraps InheritedSettingsState class SettingsStateContainer extends StatefulWidget { const SettingsStateContainer({ Key? key, required this.child, }) : super(key: key); final Widget child; @override State createState() => _SettingsState(); } class _SettingsState extends State { int _expandedSectionCount = 0; void increment() { setState(() { _expandedSectionCount += 1; }); } void decrement() { setState(() { _expandedSectionCount -= 1; }); } @override Widget build(BuildContext context) { return InheritedSettingsState( expandedSectionCount: _expandedSectionCount, increment: increment, decrement: decrement, child: widget.child, ); } } /// Keep track of the number of expanded sections in an entire menu tree. /// /// Since this is an InheritedWidget, subsections can obtain it from the context /// and use the current expansion state to style themselves differently if /// needed. /// /// Example usage: /// /// InheritedSettingsState.of(context).increment() /// class InheritedSettingsState extends InheritedWidget { final int expandedSectionCount; final void Function() increment; final void Function() decrement; const InheritedSettingsState({ Key? key, required this.expandedSectionCount, required this.increment, required this.decrement, required Widget child, }) : super(key: key, child: child); bool get isAnySectionExpanded => expandedSectionCount > 0; static InheritedSettingsState of(BuildContext context) => context.dependOnInheritedWidgetOfExactType()!; static InheritedSettingsState? maybeOf(BuildContext context) => context.dependOnInheritedWidgetOfExactType(); @override bool updateShouldNotify(covariant InheritedSettingsState oldWidget) { return isAnySectionExpanded != oldWidget.isAnySectionExpanded; } }