私はこのAPIを使ってリモートAPIからデータを取得しました。だから私は受け入れるつもりですデータとJSON Future
で表示: {"status":200,"out":{"summary":[{"bc":"1876","wc":"488679","pc":"731904"}],"last":[{"id":"1877","place":"7","publisher":"-1","bookid":"01877","title":"Neither Civil Nor Servant","author":"Peh","region":"\u65b0\u52a0\u5761","copyrighter":"","translated":"0","purchdate":"2017-04-18","price":"200.00","pubdate":"2016-01-01","printdate":"2016-01-01","ver":"1.1","deco":"\u666e\u901a","kword":"0","page":"220","isbn":"978-981-4642-63-7","category":"","location":"","intro":"TT\u8d60\u4e66\u3002","instock":"1","p_name":"\uff08\u672a\u6307\u5b9a\uff09"}]}}
無効な引数:ソースはnullであってはなりません
私は、このJSONからout
フィールドを抽出し、二つの変数にsummary
とlast
をASSINGます:
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']));
});
}
ので_bs
と_lb
はすべて複合オブジェクトです。私のウィジェットbuild
機能で
、私はこれら二つのオブジェクトの内容を表示します。
new TextSpan(
text: numFormatter.format(int.parse(_bs['bc'])),
style: aboutTextStyle,
),
プログラムはOKコンパイルするが、起動すると、迅速なスプラッシュRED画面が表示されます:
私は知っています最初のbuild
の間に、オブジェクト_bs
,_lb
はまだ存在せず、リモートAPIへの非同期呼び出しは返された応答をまだポピュレートしようとしているので、この場合は_bs['bc']
は間違いなく呼び出し可能になります。したがって、非ブロッキングエラーが飛び出します。
回避策
私は変数の束を宣言することでこのエラーを排除し、initState
機能に割り当てることができます。 _bs['bc']
をレンダリングする代わりに、新しい変数_bookCoount
をレンダリングします。この方法では、レンダリングはこのREDスクリーンなしで行われ、その変数の値は最初はnull
になり、間もなくリモートAPIから正しい値がフェッチされます。
しかし、これはあまりにも面倒です。私が言っていることを知っていれば、これは使いすぎです。
または、データを親レベルでフェッチして、このウィジェットに小道具として渡すようにしますか?まだ試していない。
あなたのベストプラクティスの入力をお待ちしております。
更新
問題は本当にint.parse
から来ています。私がその電話を取った場合、プログラムは平和的に実行されます。
は、そこで問題は、今私はそれを解析しようとしている値が有効になる前にエラーを促すint.parse
を抑えるだろう
になります。
を行う必要がありますね。 –