返回

代码分析**

Android

InheritedWidget 源码分析和应用

#
源代码路径:packages/flutter/lib/src/widgets/inherited_notifier.dart

abstract class InheritedNotifier<T> extends InheritedWidget {
  const InheritedNotifier({
    Key key,
    @required Widget child,
    @required this.notifier,
  }) : super(key: key, child: child);

  final ChangeNotifier notifier;

  @override
  bool updateShouldNotify(InheritedNotifier<T> old) => notifier != old.notifier;
}

InheritedWidget 的关键属性

  • notifier :要管理的状态,可以是任何实现 ChangeNotifier 接口的对象。

  • child :InheritedWidget 的子元素,将在其状态更改时接收更新通知。

  • key :InheritedWidget 的唯一标识符,在子元素更新时用作比较。

updateShouldNotify 方法

  • 比较当前 InheritedWidget 的 notifier 与旧的 InheritedWidget 的 notifier 是否相同,如果不同则返回 true,否则返回 false。

  • 如果 updateShouldNotify 方法返回 true,则子元素将收到更新通知,并有机会重建。


#

  1. 创建 InheritedWidget 子类

    • 扩展 InheritedNotifier 类并实现 notifier 字段。
    • notifier 字段应该是一个 ChangeNotifier 类的实例,它包含要管理的状态。
  2. 将 InheritedWidget 添加到 widget 树中

    • 在要共享状态的子元素的上方添加 InheritedNotifier widget。
  3. 从 InheritedWidget 中获取状态

    • 使用 InheritedModel.inheritedFrom 方法从子元素中获取 InheritedWidget 的状态。
    • InheritedModel.inheritedFrom 方法返回一个 InheritedNotifier 类的实例,可以通过 notifier 字段访问状态。
  4. 监听状态更改

    • 添加 ChangeNotifier 类的 addListener 方法,并在状态更改时更新 UI。
  5. 移除监听状态更改

    • 添加 ChangeNotifier 类的 removeListener 方法,并在不再需要状态更新时移除监听。

#

  • 共享状态 :InheritedWidget 可以用于在 widget 树中共享状态,例如应用程序主题、语言或用户首选项。

  • 管理状态更新 :InheritedWidget 可以用于管理状态更新,例如表单字段的值或列表中的项目。

  • 构建自定义组件 :InheritedWidget 可以用于构建自定义组件,例如主题或语言切换器。

#

#