Flutter InheritedWidget #

一、InheritedWidget基础 #

1.1 什么是InheritedWidget #

InheritedWidget是Flutter中数据向下传递的高效机制,可以让子Widget树中的任何Widget访问祖先Widget的数据。

1.2 基本用法 #

dart
class MyInheritedWidget extends InheritedWidget {
  final int count;
  final VoidCallback increment;
  
  MyInheritedWidget({
    required this.count,
    required this.increment,
    required Widget child,
  }) : super(child: child);
  
  static MyInheritedWidget? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
  }
  
  @override
  bool updateShouldNotify(MyInheritedWidget oldWidget) {
    return count != oldWidget.count;
  }
}

二、完整示例 #

2.1 计数器示例 #

dart
class CounterInherited extends InheritedWidget {
  final int count;
  final VoidCallback increment;
  
  CounterInherited({
    required this.count,
    required this.increment,
    required Widget child,
  }) : super(child: child);
  
  static CounterInherited? of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<CounterInherited>();
  }
  
  @override
  bool updateShouldNotify(CounterInherited oldWidget) {
    return count != oldWidget.count;
  }
}

class CounterProvider extends StatefulWidget {
  final Widget child;
  
  const CounterProvider({required this.child});
  
  @override
  State<CounterProvider> createState() => _CounterProviderState();
}

class _CounterProviderState extends State<CounterProvider> {
  int _count = 0;
  
  void _increment() {
    setState(() {
      _count++;
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return CounterInherited(
      count: _count,
      increment: _increment,
      child: widget.child,
    );
  }
}

class CounterDisplay extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counter = CounterInherited.of(context);
    return Text('Count: ${counter?.count ?? 0}');
  }
}

class IncrementButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counter = CounterInherited.of(context);
    return ElevatedButton(
      onPressed: counter?.increment,
      child: Text('Increment'),
    );
  }
}

三、总结 #

3.1 核心要点 #

要点 说明
InheritedWidget 数据向下传递
of方法 获取数据
updateShouldNotify 判断是否更新

3.2 下一步 #

让我们学习 Provider

最后更新:2026-03-28