Зачем вам создавать копию списка, чтобы проверить, содержит ли список элемент копии? - PullRequest
1 голос
/ 17 июня 2020

Скопированные списки

Я наткнулся на следующий фрагмент при просмотре репозитория фреймворка Flutter:

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 отбрасывает некоторые элементы, когда типы элементов не соответствуют match?
Но тогда переменная _listeners уже применяет тот же самый тип, поэтому в любом случае нельзя добавить элемент с несовпадающими типами, верно?

1 Ответ

1 голос
/ 17 июня 2020

То же самое делает и ChangeNotifier.

Причина и для клона списка, и для вызова contains заключается в поддержке добавления и удаления слушателей. В противном случае может быть ConcurrentModificationError.

Например:

ChangeNotifier notifier;

final listener = () => print('hey');

notifier.addListener(() {
  if (something) {
    notifier.removeListener(listener);
  }
});
...