import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final List<Color> _colors = [Colors.blue, Colors.red, Colors.green, Colors.orange];
int _currentIndex = 0;
void _changeColor() {
setState(() {
_currentIndex = (_currentIndex + 1) % _colors.length;
});
}
@override
Widget build(BuildContext context) {
return ColorProvider(
color: _colors[_currentIndex],
child: MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Theme Color Changer')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ColorBox(),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _changeColor,
child: const Text('Change Color'),
),
const SizedBox(height: 20),
ThemedText(),
],
),
),
),
),
);
}
}
class ColorProvider extends InheritedWidget {
final Color color;
const ColorProvider({required this.color, required super.child, super.key});
static ColorProvider? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<ColorProvider>();
}
@override
bool updateShouldNotify(ColorProvider oldWidget) {
return oldWidget.color != color;
}
}
class ColorBox extends StatelessWidget {
@override
Widget build(BuildContext context) {
final color = ColorProvider.of(context)?.color ?? Colors.black;
return Container(
width: 100,
height: 100,
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(8),
border: Border.all(color: Colors.black26),
),
);
}
}
class ThemedText extends StatelessWidget {
@override
Widget build(BuildContext context) {
final color = ColorProvider.of(context)?.color ?? Colors.black;
return Text(
'This text uses the theme color',
style: TextStyle(fontSize: 18, color: color),
);
}
}
We created a ColorProvider class that extends InheritedWidget. It holds a Color value and notifies dependents when the color changes.
The MyApp stateful widget manages the current color index and cycles through a list of colors when the button is pressed. It rebuilds the ColorProvider with the new color.
The ColorBox and ThemedText widgets read the current color from ColorProvider.of(context). Because they depend on the inherited widget, they rebuild automatically when the color changes.
This shows how InheritedWidget shares data down the widget tree and triggers rebuilds efficiently.