如何使用带有null布尔值的where方法



我有一个这样的列表:

[
{'country': ' Wakanda', 'languages': null},
{
'country': 'USA',
'languages': [
{'language': 'English'}
]
},
{
'country': 'Germany',
'languages': [
{'language': 'German'}
]
},
{
'country': ' Ireland',
'languages': [
{'language': 'English'},
{'language': 'Irish'}
]
}
]

我试图创建一个"language"包含"eng"toLowwerCase()的新列表,但错误为Failed assertion: boolean expression must not be null所以请帮帮我,这是完整的代码:

void main() async {
List list = [
{'country': ' Wakanda', 'languages': null},
{
'country': 'USA',
'languages': [
{'language': 'English'}
]
},
{
'country': 'Germany',
'languages': [
{'language': 'German'}
]
},
{
'country': ' Ireland',
'languages': [
{'language': 'English'},
{'language': 'Irish'}
]
}
];
List filterList = List.from(list).where((e) {
return e['languages']?.any((l) => l['language'].toLowwerCase().contains('eng').toLowwerCase());
}).toList();
print(filterList);
}

Iterable.where的回调必须返回不可为null的bool类型。如果e['languages']返回null:,则回调可能返回null

return e['languages']?.any(
(l) => l['language'].toLowwerCase().contains('eng').toLowwerCase()
);

解决方法是处理null。如果xnull:,则可以使用x ?? y提供默认值y

return e['languages']?.any(
(l) => l['language'].toLowwerCase().contains('eng').toLowwerCase()
) ?? false;

我还要指出:

  • toLowerCase()拼写错误
  • CCD_ 14是冗余的,并且可能只是CCD_

试试这样的

List filterList = List.from(list).where((e) {
// Avoid check null valúes
if (e['languages'] == null) {
return false;
}
return e['languages']?.any(
(l) => l['language'].toLowwerCase().contains('eng').toLowwerCase());
}).toList();

您还可以验证语言子值

void main() async {
List list = [
{'country': ' Wakanda', 'languages': null},
{
'country': 'USA',
'languages': [
{'language': 'English'}
]
},
{
'country': 'Germany',
'languages': [
{'language': 'German'}
]
},
{
'country': ' Ireland',
'languages': [
{'language': 'English'},
{'language': 'Irish'}
]
}
];
List filterList = List.from(list).where((e) {
try{
return e['languages']?.any((l) => 
l['language'].toLowwerCase().contains('eng').toLowwerCase());
}).toList();
}
catch(e){
return [''];
}
print(filterList);
}

最新更新