首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从API调用解析响应

从API调用解析响应
EN

Stack Overflow用户
提问于 2021-10-02 02:55:48
回答 3查看 158关注 0票数 0

我正试图在将来解析一个API响应:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
{
    "statusCode": 200,
    "data": {
        "hc": "148",
        "rc": "182"
    }
}

我只需要hc/rc字段。

我无法使用res.data.hc (提示声音为空安全问题)访问direclty。

谢谢你的帮助。

更新

所有的投入。

地图返回确定。

现在,在FutureBuilder中,我试图做这样的事情:

代码语言:javascript
复制
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小部件中时,这是编译时错误:

代码语言:javascript
复制
{
    "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
}

还有什么帮助吗?

EN

回答 3

Stack Overflow用户

发布于 2021-10-02 05:38:28

转换导致错误,请使用as。顺便说一句,你在这里并不需要演员。此外,只有将结果转换为对象,才能使用类似于res.data.hc的东西访问映射项。试试下面的代码:

代码语言:javascript
复制
const jsonString =
    '{ "statusCode": 200, "data": {  "hc": "148", "rc": "182"}}';
final jsonDecoded = jsonDecode(jsonString) as Map<String, dynamic>;
print(jsonDecoded["data"]["hc"]);
票数 0
EN

Stack Overflow用户

发布于 2021-10-02 06:21:53

没必要投。它不用铸造就能工作。但是,如果需要访问类似于此res.data.hc的字段,则需要将解码后的结果转换为自定义对象在模型类中序列化JSON

代码语言:javascript
复制
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.');
  }
}
票数 0
EN

Stack Overflow用户

发布于 2021-10-02 07:09:47

我的错..。

这个问题是从const关键字在ListTile上引发的。把这个拿出来,一切都很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69413631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档