考慮以下情況:
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...
感謝您的任何建議!
uj5u.com熱心網友回復:
如果您需要依賴找到的祖先小部件,即在祖先更改時收到通知,請使用以下方法:
- 找到所需的祖先,從而呼叫
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
uj5u.com熱心網友回復:
每個Element持有HashMap<Type, InheritedElement>。這就是為什么我們可以按型別快速訪問繼承的祖先。但是這種方法將我們限制在一個給定型別的可訪問小部件上。
另一種方法是迭代父母的元素,直到找到我們需要的元素。這種方法在 and 中實作,findAncestorStateOfType并由findRootAncestorStateOfTypeandNavigator.of使用ScaffoldState.of。請注意,它是 O(N)。我們可以使用它來查找具有給定屬性的祖先:
extension BuildContextX on BuildContext {
Iterable<T> findAncestorStatesOfType<T extends State>() sync* {
final ancestor = findAncestorStateOfType<T>();
if (ancestor != null) {
yield ancestor;
yield* ancestor.context.findAncestorStatesOfType<T>();
}
}
}
class MyWidget extends StatefulWidget {
final String identity;
...
static MyWidgetState findWith(
BuildContext context, {
required String identity,
}) {
return context
.findAncestorStatesOfType<MyWidgetState>()
.firstWhere((state) => state.widget.identity == identity);
}
@override
State<MyWidget> createState() => MyWidgetState();
}
class MyWidgetState extends State<MyWidget> {
...
}
像這樣使用它:
MyWidget.findWith(context, identity: 'x')
完整示例:https ://dartpad.dev/?id=e66d474b5685f6a2c815040ffda0b027
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430833.html
