Provider类中Getter与Setter的作用及必要性分析
在Provider类中使用Getter和Setter有必要吗?
答案是:不是必须,但绝大多数场景下更推荐用,核心目的是控制状态的访问与修改逻辑,避免出现「数据变了但UI不更新」的一致性问题。
拿你给出的例子来说:如果直接把customMarker设为公有字段,外部代码可以直接调用customMarker.add(...)或customMarker.clear(),但这类操作不会触发notifyListeners(),最终会导致数据更新了,UI却毫无反应——这显然是状态管理里要避免的坑。
具体拆解场景:
为什么要用Getter?
把字段改成私有(比如_customMarker),通过Getter暴露出去,还能做一层保护:List<Marker> get customMarker => List.unmodifiable(_customMarker);这样外部拿到的是不可变列表,没法直接修改,只能通过你提供的方法(比如
removeCustomMarker)操作,确保每次状态变更都能触发通知。另外,Getter还能灵活加逻辑,比如返回过滤后的列表、懒加载数据,后续需求变动时,不用修改外部调用代码。Setter要不要用?
Setter适合需要直接替换整个列表的场景(比如从接口拿到新的标记集合):set customMarker(List<Marker> newMarkers) { _customMarker = List.from(newMarkers); notifyListeners(); }但如果是添加、删除单个标记这类细粒度操作,更推荐像你写的
removeCustomMarker那样,写专门的业务方法——逻辑更清晰,也能避免外部随意修改状态。什么时候可以不用?
如果你有个纯只读的基础类型字段(比如int count),外部只会读取不会修改,直接暴露公有字段看似没问题,但还是建议用私有+Getter——后续要加逻辑(比如限制count不能为负)时,不用改外部调用代码,扩展性更好。
优化后的示例代码:
class YourMarkerProvider extends ChangeNotifier { // 私有字段,外部无法直接访问 List<Marker> _customMarker = []; // 暴露只读的Getter,返回不可变列表防止外部修改 List<Marker> get customMarker => List.unmodifiable(_customMarker); void removeCustomMarker(String name) { _customMarker.removeWhere( (element) => element.key.toString().substring(3, 7) == name); notifyListeners(); } // 统一添加标记的方法,确保修改触发通知 void addCustomMarker(Marker marker) { _customMarker.add(marker); notifyListeners(); } // 替换整个标记列表的方法 void updateCustomMarkers(List<Marker> newMarkers) { _customMarker = List.from(newMarkers); notifyListeners(); } }
内容的提问来源于stack exchange,提问作者Pannam
相关产品推荐
相关产品推荐

