关于Getx中绑定特定ID的setState仅更新对应Widget的机制疑问
关于Flutter setState((){})绑定所属StatefulWidget的疑问
研究GetX源码时,我碰到一段和setState((){})机制相关的代码,并非纯GetX逻辑,但让我十分困惑。
GetX中存在针对特定ID的Widget进行状态更新的逻辑:
Disposer addListenerId(Object? key, GetStateUpdate listener) { _updatersGroupIds![key] ??= <GetStateUpdate>[]; _updatersGroupIds![key]!.add(listener); return () => _updatersGroupIds![key]!.remove(listener); }
其中_updatersGroupIds是HashMap<Object?, List<void Function()>>?类型。
在StatefulWidget中调用该方法时,代码如下:
controller?.addListenerId( widget.id, setState(() {}), );
这里的id是Widget的属性参数,传入的是当前StatefulWidget的setState((){})方法,此时_updatersGroupIds的结构大致为:
_updatersGroupIds == { "idExample": [ setState(() {}), ] };
当通过控制器调用update方法传入目标ID进行状态更新时:
update(["idExample"]);
其实现逻辑为:
void update([List<Object> ids]) { for (final id in ids) { if (_updatersGroupIds!.containsKey(id)) { final listGroup = _updatersGroupIds![id]!; for (var item in listGroup) { item(); } } } }
我原本预期:取出对应"idExample"的条目后,遍历调用列表中的setState((){})会更新所有StatefulWidget,或至少更新最后调用该方法的Widget,但实际结果是仅带有相同"idExample"的StatefulWidget会更新,其他Widget无任何变化。
核心疑问:
如果将多个Widget的setState((){})存储到列表中,比如:
List<void Function()> staterList = [setState(() {}), setState(() {}), setState(() {})];
调用其中第二个方法staterList[1].call();时,它如何精准地只更新自己所属的那个StatefulWidget,而不影响其他?换一种问法:setState((){})是否自带了所属StatefulWidget的引用,使其在外部被调用时能明确知晓要更新的目标?
内容的提问来源于stack exchange,提问作者Gwhyyy
相关产品推荐
相关产品推荐

