考虑以下情况:
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...
感谢您的任何建议!
最佳答案
如果您需要依赖已找到的祖先小部件,即在祖先更改时收到通知,请使用此方法:
- 找到所需的祖先,随后调用
getElementForInheritedWidgetOfExactType
- 为找到的元素调用
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/