【发布时间】:2020-12-25 14:13:54
【问题描述】:
在检查可能不存在的值时,我在使用 edamam api 时遇到了一些问题。查询“一个披萨”之类的营养价值时,没有错误,数据返回成功,但大多数查询并非如此,例如“一碗汤”。
我有一个未来的构建器,一旦用户按下按钮后在文本字段中发送查询,它就会更新
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData &&
!snapshot.hasError &&
snapshot.data != null) {
energy = snapshot.data['totalDaily']['ENERC_KCAL']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['ENERC_KCAL']['quantity'];
fat = snapshot.data['totalDaily']['FAT']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['FAT']['quantity'];
protein = snapshot.data['totalDaily']['PROCNT']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['PROCNT']['quantity'];
cholesterol = snapshot.data['totalDaily']['CHOLE']['quantity'] == null
? 0.0
: snapshot.data['totalDaily']['CHOLE']['quantity'];
变量获取信息并根据 if 检查返回加载程序或信息。我认为添加空检查可以防止任何错误,但它们似乎没有做任何事情。这是我得到的错误
The following NoSuchMethodError was thrown building FutureBuilder<dynamic>(dirty, state: _FutureBuilderState<dynamic>#3bbe5):
The method '[]' was called on null.
Receiver: null
Tried calling: []("quantity")
有没有更好的方法来做到这一点?我在这里做错了什么?
【问题讨论】:
-
你能提供你的错误日志吗?
-
您的问题是您正在执行
x['quantity'],其中x是null。您当前的空检查测试诸如snapshot.data['totalDaily']['ENERC_KCAL']['quantity']之类的东西不为空,但为时已晚;他们忽略了检查snapshot.data['totalDaily']['ENERC_KCAL']等是否不为空。如果您启用了 null-safety 功能,您可以查看snapshot.data['totalDaily']?['ENERC_KCAL']?['quantity'] == null。 -
所以我试了一下,就像你说的 jamesdlin 一样,问题已经解决了,非常感谢,但它很罗嗦。如何启用空安全功能,使其像您写的那样简化?
-
@NanaKwame 请检查我的答案以获得不那么冗长的解决方案
-
启用空安全性可能比您现在愿意做的工作更多。同时,您也可以使用
package:basics和snapshot.data.get('totalDaily')?.get('ENERC_KCAL')?.get('quantity') == null。