Flutter中的InheritedWidge

在 Flutter 中,InheritedWidget 是一个非常重要的类,它允许沿着 widget 树向下传递数据。这种机制可以使得在 widget 树中较深层次的子 widget 能够访问由其祖先 widget 所持有的数据,而无需通过构造函数手动一层层传递。

基本概念

InheritedWidget 作为一个基类,通常不会直接使用。开发者会创建继承自 InheritedWidget 的自定义类,并在这个类中实现想要共享的数据和逻辑。

当一个 InheritedWidget 被插入到 widget 树中时,它会将自身注册到树上下文(context)中。这样,在树中任何位置的子 widget 都可以通过 context.dependOnInheritedWidgetOfExactType() 方法来获取最近的那个 InheritedWidget 实例,并访问其中包含的数据。

使用步骤

  1. 创建继承自 InheritedWidget 的类 :首先需要创建一个新的类并继承自 InheritedWidget。然后添加你希望共享给子 widgets 的数据作为成员变量。
  2. 实现 updateShouldNotify 方法 :这个方法用于决定当数据发生变化时是否应该通知依赖于此 InheritedWidget 的子 widgets。如果返回 true,则依赖于此 InheritedWidget 的子 widgets 的 didChangeDependencies() 方法将被调用。
  3. 提供静态方法以方便访问 :通常会在继承自 InheritedWidget 的类中提供一个静态方法来简化对共享数据的访问过程。
  4. 在 widget 树中使用:将你创建的 InheritedWidget 放置到 widget 树中合适的位置上,确保它能够覆盖到所有需要访问共享数据的子 widgets。

示例代码

dart 复制代码
class MyData {
  final String data;

  MyData(this.data);
}

class MyInheritedWidget extends InheritedWidget {
  final MyData myData;

  MyInheritedWidget({
    Key? key,
    required this.myData,
    required Widget child,
  }) : super(key: key, child: child);

  @override
  bool updateShouldNotify(MyInheritedWidget old) {
    return myData != old.myData;
  }

  static MyData of(BuildContext context) {
    final MyInheritedWidget? result = context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
    assert(result != null, 'No MyInherited found in context');
    return result!.myData;
  }
}

class SomeChild extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // Accessing the data from the nearest MyInherited instance.
    final myData = MyInheritedWidget.of(context).data;

    return Text(myData);
  }
}

在上面示例代码中:

  • 我们定义了一个名为 MyData 的简单类来存储我们想要共享的数据。
  • 创建了名为 MyInheritedWidget 的类,它继承自 InheritedWidgеt, 并且包含了我们想要共享出去的 MyData.
  • 在静态方法 of() 中,我们使用了上下文(context)来查找最近的那个类型为 MyIhneritedWidgеt 的实例。
  • 在某个子组件(如示例代码中的 SomeChild)里面,我们通过调用静态方法获取并显示了共享数据。

注意事项

  • 当你调用 .of(context) 方法时,Flutter 将会把当前 widget 注册为依赖于找到的最近 InheriedWidgеt。因此当后者更新时前者也会重新构建。
  • 如果你只是想读取 InheriedWidgеt 中包含的数据而不希望注册依赖关系(即不希望重新构建),可以使用 .getElementForIhneritedWidgеtOfExactType().widget as T.

总之,Flutter 中的 InheriedWidgеt 提供了一种高效地在 widget 树间传递和共享数据状态而无需手动传递引用或回调函数等方式。

相关推荐
阿里云云原生8 小时前
还原一次用户等待:深度解析 Flutter RUM SDK 如何打通 Dart 到 Native 的观测链路
flutter
_阿南_9 小时前
flutter 展示的字体突然奔放了
android·flutter·ios
GitLqr13 小时前
玩转 Dart typedef:不仅是函数别名那么简单
flutter·面试·dart
FungLeo15 小时前
Flutter 两个反直觉布局坑:ListTile 水波纹 / VerticalDivider 踩坑实录
android·flutter
年小个大1 天前
受 go-zero 启发,我给 Flutter 写了一套 CLI 脚手架
android·flutter·架构
FungLeo1 天前
Flutter 骨架屏 Shimmer 实现:不用 transform 的扫光法实战
前端·javascript·flutter
GitLqr2 天前
Flutter 居然能直接跑在 Apple Watch 上了?玩转 flutter-watchos
flutter·全栈·apple watch
你听得到112 天前
排查 App 问题:别只盯着报错,把前后发生的事情串起来
android·前端·flutter
天空之城--2 天前
近一周Android Flutter行业动态与实用参考
android·flutter
GitLqr2 天前
玩转 Flutter 项目依赖:从 pubspec.yaml 到实战包管理
flutter·面试·全栈