Dart 无效参数:源不能为null

Dart 无效参数:源不能为null,dart,flutter,Dart,Flutter,我有一个从远程API获取数据的应用程序。因此,我将在JSON未来中接收和显示的数据: {“状态”:200,输出:{“摘要”:[{“bc”:“1876”,“wc”:“488679”,“pc”:“731904”}],“最后一次”:[{“id”:“1877”,“地点”:“7”,“出版商”:“-1”,“图书id”:“01877”,“标题”:“既不是公务员也不是公务员”,“作者”:“Peh”,“地区”:“\u65b0\u52a0\u5761”,“版权人”:“翻译的”:“0”,“采购日期”:“2017-0

我有一个从远程API获取数据的应用程序。因此,我将在JSON
未来中接收和显示的数据:

{“状态”:200,输出:{“摘要”:[{“bc”:“1876”,“wc”:“488679”,“pc”:“731904”}],“最后一次”:[{“id”:“1877”,“地点”:“7”,“出版商”:“-1”,“图书id”:“01877”,“标题”:“既不是公务员也不是公务员”,“作者”:“Peh”,“地区”:“\u65b0\u52a0\u5761”,“版权人”:“翻译的”:“0”,“采购日期”:“2017-04-18”,“价格”:“200.00”,“出版日期”:“2016-01-01”,“打印日期”:“2016-01-01-01”,“版本”:“1.1”、“装饰”:“u666e\u901a”、“kword”:“0”、“页码”:“220”、“isbn”:“978-981-4642-63-7”、“类别”:“位置”:“简介”:“TT\u8d60\u4e66\u3002”、“instock”:“1”、“p_名称”:“\uff08\u672a\u6307\u5b9a\uff09”}”

我将从此JSON中提取
out
字段,并将
summary
last
分配为两个变量:

initState() async {
    var getter = createHttpClient();
    String uri='http://api.rsywx.com/book/summary';
    var res=await getter.get(uri);
    Map data=JSON.decode(res.body);

    var out=data['out'];

    setState(() {
      _today=formatDate(new DateTime.now());
      _lb=out['last'][0];
      _bs=out['summary'][0];
      _lb['purchdate']=formatDate(DateTime.parse(_lb['purchdate']));
    });
  }
所以
\u bs
\u lb
都是复合对象

在我的widget
build
函数中,我将显示这两个对象的内容:

 new TextSpan(
     text: numFormatter.format(int.parse(_bs['bc'])),
     style: aboutTextStyle,
 ),
程序编译正常,但启动时,会出现一个快速的红色闪屏:

很快,将出现正确的屏幕:

我知道在最初的
构建过程中,
\u bs
\u lb
对象还不存在,对远程API的异步调用仍在尝试填充返回的响应,因此在这种情况下,
\u bs['bc']
肯定无法调用。因此,非阻塞错误会弹出

解决方法

我可以通过声明一组变量并在
initState
函数中分配它们来消除这个错误;而不是呈现
\u bs['bc']
,我将渲染一个新变量
\u bookoount
。这样,渲染将在没有此红色屏幕的情况下完成,该变量的值最初将为
null
,很快将成为从远程API获取的正确值

但这太麻烦了,如果你明白我的意思:很多变量只使用一次

或者,我是否应该在父级获取数据,以便将其作为道具传递给此小部件?尚未尝试

非常感谢您的最佳实践意见

更新

问题实际上来自
int.parse
。如果我调用了该调用,程序将和平运行

所以现在的问题是


在将要分析的值生效之前,我将禁止
int.parse
提示错误。

不确定您的解决方法是什么意思。在您的示例中,
setState()
不会在
等待getter.get(uri);
返回值之前调用

我想这应该可以

 new TextSpan(
     text: _bs != null && _bs['bc'] != null ? [numFormatter.format(int.parse(_bs['bc'])) : 0,
     style: aboutTextStyle,
 ),

这可以解决问题。比我声明所有变量更好。如果你在控制台中查看,你会看到更详细的错误报告,包括一个堆栈跟踪,它精确地显示了错误的位置。