我正试图在将来解析一个API响应:
Future<Map<String, dynamic>> getReading() async {
const uri = 'https://xxxxxxxxx';
final response = await http.get(Uri.parse(uri));
if (response.statusCode == HTTP_OK) {
var res = jsonDecode(response.body).cast<Map<String, dynamic>>();
//var hc = res.data;
return res;
} else {
throw Exception('Failed to load Reading summary data.');
}
}上面的代码引发一个运行时错误:NoSuchMethodError.
如果我直接返回解码后的response.body,如下所示:
{
"statusCode": 200,
"data": {
"hc": "148",
"rc": "182"
}
}我只需要hc/rc字段。
我无法使用res.data.hc (提示声音为空安全问题)访问direclty。
谢谢你的帮助。
更新
所有的投入。
地图返回确定。
现在,在FutureBuilder中,我试图做这样的事情:
class _ReadCardState extends State<ReadCard> {
@override
Widget build(BuildContext context) {
return FutureBuilder<Map<String, dynamic>>(
future: getReading(),
builder: (BuildContext context,
AsyncSnapshot<Map<String, dynamic>> snapshot) {
if (snapshot.hasData) {
var res = snapshot.data;
var hc = res?['hc'] ?? 'n/a';
print(hc);
var rc = res?['rc'] ?? '/na';
print(rc);
final text = '截止,共评论书籍$hc本,读书笔记$rc篇';
return Card(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const ListTile(
leading: FaIcon(
FontAwesomeIcons.glasses,
color: Colors.amber,
size: 50,
),
title: Text('读书'),
subtitle: Text('截止,共评论书籍$hc本,读书笔记$rc篇'),
)
],
),
);
} else if (snapshot.hasError) {
return Center(
child: Text('Error: ${snapshot.error}'),
);
} else {
return Center(
child: CircularProgressIndicator(
strokeWidth: 2.0,
),
);
}
});
}
}两个print语句正确地打印数字。问题是,当我想将这两个值插入到Text小部件中时,这是编译时错误:
{
"resource": "/d:/My Programs/rsywx/lib/CardBuilder/ReadCard.dart",
"owner": "_generated_diagnostic_collection_name_#2",
"code": {
"value": "const_constructor_param_type_mismatch",
"target": {
"$mid": 1,
"external": "https://dart.dev/diagnostics/const_constructor_param_type_mismatch",
"path": "/diagnostics/const_constructor_param_type_mismatch",
"scheme": "https",
"authority": "dart.dev"
}
},
"severity": 8,
"message": "A value of type 'Null' can't be assigned to a parameter of type 'String' in a const constructor.\nTry using a subtype, or removing the keyword 'const'.",
"source": "dart",
"startLineNumber": 38,
"startColumn": 36,
"endLineNumber": 38,
"endColumn": 59
}还有什么帮助吗?
发布于 2021-10-02 05:38:28
转换导致错误,请使用as。顺便说一句,你在这里并不需要演员。此外,只有将结果转换为对象,才能使用类似于res.data.hc的东西访问映射项。试试下面的代码:
const jsonString =
'{ "statusCode": 200, "data": { "hc": "148", "rc": "182"}}';
final jsonDecoded = jsonDecode(jsonString) as Map<String, dynamic>;
print(jsonDecoded["data"]["hc"]);发布于 2021-10-02 06:21:53
没必要投。它不用铸造就能工作。但是,如果需要访问类似于此res.data.hc的字段,则需要将解码后的结果转换为自定义对象在模型类中序列化JSON。
Future<Map<String, dynamic>> getReading() async {
const uri = 'https://xxxxxxxxx';
final response = await http.get(Uri.parse(uri));
if (response.statusCode == HTTP_OK) {
var res = jsonDecode(response.body);
var hc = res["data"]["hc"];
return res;
} else {
throw Exception('Failed to load Reading summary data.');
}
}发布于 2021-10-02 07:09:47
我的错..。
这个问题是从const关键字在ListTile上引发的。把这个拿出来,一切都很好。
https://stackoverflow.com/questions/69413631
复制相似问题