我有以下代码从要显示在 listView 中的资料中过滤串列:
child: FutureBuilder(
future: fetchPacientes('todo'),
builder: (context, snapshot) {
if (snapshot.hasData) {
var filteredList = snapshot.data;
print("a minusculas:"
_controller.text.toLowerCase());
filteredList = filteredList
.where((element) => (element.nombre
.toLowerCase()
.contains(
_controller.text.toLowerCase()) ||
element.NHC.toLowerCase().contains(
_controller.text.toLowerCase()) ||
element.apellidos.toLowerCase().contains(
_controller.text.toLowerCase())))
.toList();
但我在这一点上遇到了一个错误:
.where(...
这是错误输出:
The method 'where' can't be unconditionally invoked because the receiver can be 'null'.
我正在尝试将旧应用程序迁移到 Null Safety,但我无法解决此问题。建议的解决方案是添加一个空检查,filteredList!
但这样做时错误不会被洗掉
uj5u.com热心网友回复:
该错误意味着.
应用 的物件(在本例中为filteredList
)可以是,因此如果实际上是null
,它将引发例外。filteredList
null
因此,为避免该错误,您有以下选择:
- 添加
!
afterfilteredList
: 在这种情况下,您确保编译器filteredList
永远不会为空,并且错误将消失。请注意,这实际上并不能阻止它成为null
:您只是在向编译器保证它,并且filteredList
仍然可能是null
. 在这种情况下,当您在代码中宣告不应该发生这种情况时,应用程序将抛出一个专门的例外,告诉您它找到了一个“空”物件 - 检查是否
filteredList
是null
:添加几行代码测验是否是真的null
,然后处理这种情况,甚至是回传一个Text('filteredList is empty')
. 在此之后,您可以安全地撰写filteredList!
,因为您确定它永远不会null
,因为您实际测验了 id。 - 为它设定一个默认值
filteredList
以防它为空:Dart 有这个运算子,如果它是一个物件,它会为它分配一个值null
:filteredList ??= []
。同样,使用它之后,您可以安全地撰写filteredList!
,因为它永远不会为空。
PS对不起,没有注意到最后一句话。由于添加!
和null
检查不起作用,我会尝试为filteredList
. 或者也许检查null
on snapshot.data
,然后为 设定一个显式的不可为空的型别filteredList
,比如List<Object> filteredList
.
uj5u.com热心网友回复:
错误是因为snapshot.data
可以null
。尝试?
在您.where
喜欢之前添加一个:
filteredList = filteredList?.where(...);
0 评论