对 Python 来说,发出网络请求很容易,而 sync
更容易做到这一点。请求。
在 Dart 中,我可以提出这样的请求:
HttpClient client = new HttpClient();
client.getUrl(Uri.parse("http://www.example.com/"))
.then((HttpClientRequest request) {
// Optionally set up headers...
// Optionally write to the request object...
// Then call close.
...
return request.close();
})
.then((HttpClientResponse response) {
// Process the response.
...
});
显然是异步请求。在我看来,上面的代码可以重复使用很多次。 所以我想发出一个请求并返回一个 JSON 对象。
getResponse(String url) async {
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));
HttpClientResponse response = await request.close();
String responseBody = await response.transform(utf8.decoder).join();
Map jsonResponse = jsonDecode(responseBody) as Map;
httpClient.close();
return jsonResponse;
}
如你所见,上面的方法getResponse
返回 Future<dynamic>
.那么如何调用它并获取 json 值呢?
最佳答案
要从 Future 中获取动态,请执行以下操作之一:
// option 1 async method
MyAsyncMethod() async {
dynamic result = await getResponse("http://google.com");
if (result is Map) {
// process the data
}
}
// option 2 callback with .then()
MyNonAsyncMethod() {
getResponse("http://google.com").then ( (dynamic result) {
if (result is Map) {
// process the data
}
});
}
请注意,您自己的异步方法也可以返回 Future<something>
并在调用时以相同的两种方式进行处理。
其中 map 是嵌套的 Map<String, Dynamic>
并且 result 是您创建的符合 Json 序列化接口(interface)的类型的对象(参见 link)。
访问 map 中的数据:
//given example json structure
var map = {
"myPropertyName":50,
"myArrayProperty":[
"anArrayEntry"
],
"mySubobject": {
"subObjectProperty":"someValue"
}
};
var myProperty = map["myPropertyName"]; // get a property value from the object
var myArrayEntry = map["myArrayProperty"][0]; // get first element of an array property
var mySubobjectPropertyValue = map["mySubobject"]["subObjectProperty"]; // get a property value from a subobject
https://stackoverflow.com/questions/54158508/
相关文章:
dart - Flutter - 如何在 flutter 的数字键盘中添加完成按钮
dart - Flutter:StatelessWidget.build 被多次调用
android - 使用 pushNamed() 从屏幕错误中 flutter 返回数据
dart - flutter ListView 滚动到索引不可用
android - 如何在 Flutter 中删除 Firebase 云消息传递 token
android - Flutter:构建 APK 时如何传递 Gradle 参数?
amazon-web-services - 在 Flutter 中从 AWS S3 上传和获取媒体文