import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; abstract interface class InheritedSettingsData {} class InheritedSettings extends InheritedWidget { final List settings; const InheritedSettings({ super.key, required super.child, required this.settings, }); static T? maybeSettingsOf(BuildContext context) { final settings = context.dependOnInheritedWidgetOfExactType()?.settings; return (settings?.firstWhereOrNull((s) => s is T) as T?); } static T settingsOf(BuildContext context, T defaultSettings) { return maybeSettingsOf(context) ?? defaultSettings; } static List? maybeOf(BuildContext context) { return context.dependOnInheritedWidgetOfExactType()?.settings; } static List of(BuildContext context) { final List? result = maybeOf(context); assert(result != null, 'No InheritedSettings found in context'); return result!; } @override bool updateShouldNotify(InheritedSettings oldWidget) => settings != oldWidget.settings; } // --- class ActionButtonSettings implements InheritedSettingsData { static ActionButtonSettings defaultSettings = ActionButtonSettings( builder: (context, child, onPressed) => ElevatedButton( onPressed: onPressed, child: child, ), ); final Widget Function(BuildContext context, Widget child, VoidCallback? onPressed) builder; ActionButtonSettings({ required this.builder, }); } // --- class ActionButton extends StatelessWidget { final Widget child; final VoidCallback? onPressed; const ActionButton({ required this.child, required this.onPressed, }); @override Widget build(BuildContext context) { // final settings = InheritedSettings.maybeSettingsOf(context) ?? ActionButtonSettings.defaultSettings; final settings = InheritedSettings.settingsOf(context, ActionButtonSettings.defaultSettings); return ConstrainedBox( constraints: const BoxConstraints( minWidth: 200, ), child: settings.builder( context, child, onPressed, ), ); } } // --- void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData.light(), debugShowCheckedModeBanner: false, home: Scaffold( body: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ InheritedSettings( settings: [ ActionButtonSettings( builder: (context, child, onPressed) => OutlinedButton( onPressed: onPressed, child: child, ), ), ], child: MyWidget(), ), // const Divider(), // MyWidget(), ], ), ), ), ); } } class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return ActionButton( onPressed: () {}, child: const Text('OK'), ); } }