【问题标题】:Why would you create a Copy of a List to check if the List contains an Element of the Copy?为什么要创建列表的副本来检查列表是否包含副本的元素?
【发布时间】:2020-06-16 21:37:13
【问题描述】:

复制列表

我在浏览 Flutter 框架存储库时偶然发现了 following snippet

for (final ValueChanged<RawKeyEvent> listener in List<ValueChanged<RawKeyEvent>>.from(_listeners)) {
  if (_listeners.contains(listener)) {
    listener(event);
  }
}

据我所知,List.from 应该创建一个与原始列表具有完全相同元素的副本,所以它们应该具有相同的元素,我猜?


对于上下文,_listeners 变量的声明和初始化如下:

final List<ValueChanged<RawKeyEvent>> _listeners = <ValueChanged<RawKeyEvent>>[];

问题改写

基本上,if-条件是否曾经不正确

输入List.from

作者没有使用List.of,所以可能List.from在元素类型不匹配的情况下会丢弃一些元素?
但是,_listeners 变量已经强制执行完全相同的类型,所以无论如何都不能添加类型不匹配的元素,对吧?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    ChangeNotifier 也是这样做的。

    列表克隆和contains 调用的原因是支持让侦听器添加和删除侦听器。否则,可能会有ConcurrentModificationError

    例如:

    ChangeNotifier notifier;
    
    final listener = () => print('hey');
    
    notifier.addListener(() {
      if (something) {
        notifier.removeListener(listener);
      }
    });
    

    【讨论】:

    • 我确实相信有更好的解决方案。我在这里打开了一个描述解决方案的问题:github.com/flutter/flutter/issues/59611。我在state_notifier 中使用了该解决方案一段时间
    猜你喜欢
    • 2022-11-10
    • 2018-10-12
    • 1970-01-01
    • 2020-08-12
    • 2019-08-22
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多