我有一个小部件列表:
List<Widget> widgetList = List<Widget>();
widgetList.add(WidgetA());
widgetList.add(WidgetB());
widgetList.add(WidgetC());
widgetList.add(WidgetD());
现在我想在列表中找到WidgetB:
Widget activeWidget = widgetList.firstWhere((x) => x.key == ??);
我正在分配" key "属性,这是我应该使用的唯一标识每个小部件的属性,但我不确定要使用哪种类型的密钥,也不确定如何通过键查找,也不确定这是否是正确的方法。
任何信息都会有帮助的,谢谢。
发布于 2020-01-07 13:42:27
您需要传递每个小部件的密钥:
var keyA = UniqueKey();
var keyB = UniqueKey();
var keyC = UniqueKey();
var keyD = UniqueKey();
List<Widget> widgetList = List<Widget>();
widgetList.add(WidgetA(key: keyA));
widgetList.add(WidgetB(key: keyB));
widgetList.add(WidgetC(key: keyC));
widgetList.add(WidgetD(key: keyD));
现在你可以搜索:
Widget activeWidget = widgetList.firstWhere((x) => x.key == keyB);
发布于 2020-01-07 13:53:53
如果您只想通过Widget
来比较名称/类型,而不考虑其他任何事情。这也是一项工程:
List<Widget> widgetList = [];
widgetList.add(WidgetA());
widgetList.add(WidgetB());
widgetList.add(WidgetC());
widgetList.add(WidgetD());
// using runtimeType
List widgets = widgetList.where((element) => element.runtimeType == WidgetD().runtimeType).toList();
Widget activeWidget = widgets.length > 0 ? widgets.first : null;
print(activeWidget);
// firstWhere() is the shorter form of above(I mean not how firstWhere implementation)
Widget activeWidget = widgetList.firstWhere((element) => element.runtimeType == WidgetD().runtimeType);
print(activeWidget);
还请注意,doc包含如下内容:
/如果两个小部件的runtimeType和关键属性分别为/ operator==,则新小部件将通过/更新基础元素(即使用/新小部件调用Element.update )替换旧小部件。否则,从树中删除旧元素,将新/小部件充气到元素中,并将新元素插入/树中。
https://stackoverflow.com/questions/59629500
复制相似问题