我有一个这样的列表:
[
{'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
。如果x
是null
:,则可以使用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);
}