2017-04-27 13 views
2

私はこの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フィールドを抽出し、二つの変数にsummarylastを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画面が表示されます:

enter image description here

もう一度、正しい画面が表示されます:enter image description here

私は知っています最初のbuildの間に、オブジェクト_bs,_lbはまだ存在せず、リモートAPIへの非同期呼び出しは返された応答をまだポピュレートしようとしているので、この場合は_bs['bc']は間違いなく呼び出し可能になります。したがって、非ブロッキングエラーが飛び出します。

回避策

私は変数の束を宣言することでこのエラーを排除し、initState機能に割り当てることができます。 _bs['bc']をレンダリングする代わりに、新しい変数_bookCoountをレンダリングします。この方法では、レンダリングはこのREDスクリーンなしで行われ、その変数の値は最初はnullになり、間もなくリモートAPIから正しい値がフェッチされます。

しかし、これはあまりにも面倒です。私が言っていることを知っていれば、これは使いすぎです。

または、データを親レベルでフェッチして、このウィジェットに小道具として渡すようにしますか?まだ試していない。

あなたのベストプラクティスの入力をお待ちしております。

更新

問題は本当にint.parseから来ています。私がその電話を取った場合、プログラムは平和的に実行されます。

は、そこで問題は、今私はそれを解析しようとしている値が有効になる前にエラーを促すint.parseを抑えるだろう

になります。

+0

を行う必要がありますね。 –

答えて

1

あなたの回避策の意味を理解できていません。あなたの例では、が値を返す前に、setState()は呼び出されません。

私はこれがあなたのコンソールで見た場合は、エラーがある場所を正確に示してスタックトレースなど、より詳細なエラーレポートが表示されます

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

これは回避できます。私はすべての変数を宣言するよりも優れています。 – TaylorR

関連する問題