flutter - `dependOnInheritedWidgetOfExactType` 但获得非最近的祖先?

标签 flutter dart

考虑以下情况:

MyInheritedWidget(
  identity: "a",
  child: MyInheritedWidget(
    identity: "b",
    child: MyChildWidget(),
  ),
)

内部MyChildWidget , 我可以使用 context.dependOnInheritedWidgetOfExactType<MyInheritedWiget>()获取 MyInheritedWiget最近实例在我的祖先。即 b在这种情况下。但是,我希望有一种方法可以依赖于非最近 一个,a在这种情况下。

比如希望这样的API存在:

context.dependOnInheritedWidgetOfExactType<MyInheritedWiget>((widget) => widget.identity == 'a')

或者这样的API也可以:

context.findAllInheritedWidgetsOfExactType<MyInheritedWiget>().where((widget) => widget.identity == 'a')

等等。但是我找不到像这样合适的 API...

感谢您的任何建议!

最佳答案

如果您需要依赖已找到的祖先小部件,即在祖先更改时收到通知,请使用此方法:

  1. 找到所需的祖先,随后调用 getElementForInheritedWidgetOfExactType
  2. 为找到的元素调用dependOnInheritedElement并使用返回值
extension BuildContextX on BuildContext {
  Iterable<InheritedElement> getElementsForInheritedWidgetsOfExactType<
      T extends InheritedWidget>() sync* {
    final element = getElementForInheritedWidgetOfExactType<T>();
    if (element != null) {
      yield element;

      Element? parent;
      element.visitAncestorElements((element) {
        parent = element;
        return false;
      });

      if (parent != null) {
        yield* parent!.getElementsForInheritedWidgetsOfExactType<T>();
      }
    }
  }

  T? dependOnSpecificInheritedWidgetOfExactType<T extends InheritedWidget>(
    bool Function(T) test,
  ) {
    final element = getElementsForInheritedWidgetsOfExactType<T>()
        .where((element) => test(element.widget as T))
        .firstOrNull;
    if (element == null) {
      return null;
    }
    return dependOnInheritedElement(element) as T;
  }
}
class MyWidget extends StatelessWidget {
  final String identity;

  ...

  static _MyWidget dependOnSpecific(
    BuildContext context, {
    required String identity,
  }) {
    return context.dependOnSpecificInheritedWidgetOfExactType<_MyWidget>(
      (widget) => widget.identity == identity,
    )!;
  }

  @override
  Widget build(BuildContext context) {
    return _MyWidget(
      identity: identity,
      child: ...,
    );
  }
}

class _MyWidget extends InheritedWidget {
  ...
}

像这样使用它:

MyWidget.dependOnSpecific(context, identity: 'x')

完整示例:https://dartpad.dev/?id=c311ca15d54dd905660fe9e2b1c8c337

关于flutter - `dependOnInheritedWidgetOfExactType` 但获得非最近的祖先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71200969/

相关文章:

flutter - Flutter-如何更改AppBar的高度并对齐标题垂直中心?

dart - 在 Flutter 中的组件顶部叠加一条线

flutter - 您应该为 ChangeNotifier 使用 "extends"还是 "with"关键字? - flutter

android - 构建到 Android 时解决 gradle 依赖关系的问题

dart - Http响应正文中未显示阿拉伯字母- flutter

java - 是否可以将 Dart 嵌入到 Java 应用程序中?

dart - 创建具有网络图像和波纹效果的圆形按钮

flutter - 关闭小部件时如何将 : Remove separator from ListView. 分开?

flutter - 将列表中的颜色传递到小部件中-Flutter

flutter - 位置参数太多,预期为 0,但找到了 3