type '(dynamic) = ›dynamic' не является подтипом типа '(dynamic) =› bool' of 'test', когда я использую функцию карты

У меня есть виджет StatefulWidget с членом LinkedHashMap, выполненным следующим образом:

LinkedHashMap _items = new LinkedHashMap<String, List<dynamic>>();

Теперь мне нужно отфильтровать элементы внутри List<dynamic> элементов карты.

Я использую этот код для фильтрации:

function filter(_items) {
    return _items.map((day, items) {
        return new MapEntry(day, items.where((i) {
          return i.stringProperty.contains(widget.filter);
        }).toList());
    });
}

Но получаю ошибку в теме

type '(dynamic) => dynamic' не является подтипом типа '(dynamic) => bool' из 'test'


person Giacomo M    schedule 15.12.2019    source источник
comment
Аналогичная проблема с Dart версии 2.7.2, и трюк с тернарным оператором решает ее. Я даже не использую функцию типа contains, а использую прямой логический тест (a>0). Возможно, какая-то ошибка или регресс. Кстати, test - это обратный вызов, переданный в where, согласно справочник по языку.   -  person Eric Platon    schedule 20.04.2020


Ответы (3)


Я решил с помощью этого кода:

function filter(_items) {
    return _items.map((day, items) {
        return new MapEntry(day, items.where((i) {
          return i.stringProperty.contains(widget.filter) ? true : false;
        }).toList());
    });
}

Похоже, что функция contains не возвращает логическое значение.

person Giacomo M    schedule 15.12.2019
comment
contains действительно возвращает логическое значение. Что-то еще мешает. - person Randal Schwartz; 16.12.2019
comment
@RandalSchwartz, решение, которое сработало, довольно ясно, проблема заключалась в возвращаемом значении функции contains. Я не могу найти что-то, что мешает. - person Giacomo M; 16.12.2019

Где метод возвращает список, поэтому вам не нужно использовать toList (), и вы должны указать тип возвращаемого значения метода карты, когда вы его используете.

  filter(_items) {
    return _items.map<String, List<bool>>((day, items) {
      return MapEntry(
        day, items.where((i) => i.stringProperty.contains(widget.filter)),
      );
    });
  }
person dshukertjr    schedule 15.12.2019
comment
разве я не должен возвращать <String, List<dynamic>> вместо <String, List<bool>>? - person Giacomo M; 15.12.2019
comment
в любом случае я пробовал и bool, и dynamic, но все равно получаю ошибку. Я даже не могу понять, где возникает эта ошибка - person Giacomo M; 15.12.2019

Я считаю, что это также сработает, но все еще не уверен, почему он не возвращает логическое значение

function filter(_items) {
    return _items.map((day, items) {
        return new MapEntry(day, items.where((i) {
          return (i.stringProperty.contains(widget.filter)) as bool;
        }).toList());
    });
}
person Sunn    schedule 06.07.2020