我試圖把json數據放入一個變量中。當我打印jsondata時,爲什麼會變爲NULL?Dart HTTP請求變量
當我更改jsondata打印似乎工作正常,當我使用類型命令它確認它作爲一個列表。那麼當我傳遞給變量時,我做錯了什麼?
HttpRequest.getString('file.json').then(
(result) => print(JSON.decode(result))); //this prints fine as type list
我試圖把json數據放入一個變量中。當我打印jsondata時,爲什麼會變爲NULL?Dart HTTP請求變量
當我更改jsondata打印似乎工作正常,當我使用類型命令它確認它作爲一個列表。那麼當我傳遞給變量時,我做錯了什麼?
HttpRequest.getString('file.json').then(
(result) => print(JSON.decode(result))); //this prints fine as type list
的HttpRequest.getString
是,也就是說,它不會立即執行 - 它在未來執行一段時間(和返回類型是,作爲回報,Future<String>
)。考慮下面的程序:
print('1');
getData().then((data) => print('2'));
print('3');
在正常運行的飛鏢運行,這將從未打印「1」「2」「3」,而是將打印「1」,「3」和也許打印「2」如果getData()
有完成(即沒有錯誤發生,沒有超時/互聯網連接問題)。
達特(和其他語言)添加await
關鍵字,使其更容易編寫看同步程序(即不使用的「後」之稱的嵌套回調),但在其他方面表現得完全一樣,以前的代碼:
print123() async {
print('1');
await getData();
print('2');
print('3');
}
將上面的代碼,如果表現良好(再次,沒有超時等),打印「1」「2」「3」 - 正是你所期望的。現在,讓我們運用同樣的模式到你上面的代碼:
import 'dart:html';
import 'dart:convert';
var jsondata;
main() async {
jsondata = JSON.decode(await HttpRequest.getString('file.json'));
print(jsondata);
}
你不有使用await
/async
,但我覺得更容易的大部分時間!如果您想保留當前的代碼,確保jsondata
分配之後調用print
:
main() {
HttpRequest.getString('file.json').then((data) {
jsondata = JSON.decode(data);
print(jsondata);
});
}
謝謝你,你的解釋是非常有益的。 –