【问题标题】:Cannot access decoded json body flutter无法访问解码的 json 身体颤动
【发布时间】:2021-08-20 21:36:33
【问题描述】:

我在颤振中获取数据并创建了一个帮助类,如下所示

import 'dart:convert';

import 'package:http/http.dart' as http;

class HttpClient {
  final Map<String, String> _headers = {};

  void setHeader(String key, String value) {
    if (!_headers.containsKey(key)) {
      _headers[key] = value;
    }
  }

  Future<http.Response> get(String url) async {
    try {
      var uri = Uri.parse(url);
      var response = await http.get(uri, headers: _headers);
      if (response.statusCode == 200) {
        dynamic result = jsonDecode(response.body);
        return result;
      } else {
        throw Error();
      }
    } on Exception catch (_) {
      rethrow;
    }
  }
}

HttpClient appClient = HttpClient();

我从一个类中调用方法,如下所示

abstract class AbstractTodoService {
  dynamic getTodos() {}
}

class HttpTodoService implements AbstractTodoService {
  @override
  Future<Response> getTodos() async {
    try {
      var todos =
          await appClient.get('https://jsonplaceholder.typicode.com/todos');
      print(todos);
      return todos;
    } on Exception catch (error) {
      print(error);
      rethrow;
    }
  }
}

但是,当我在等待调用 HttpClient 之后在 HttpTodoService 中打印 todos 或任何字符串时,我什么也看不到。但是,当我在 HttpClient 中打印 result 时,我看到了响应但没有返回。当我返回一个正常的字符串或映射时,一切正常,但是当我尝试使用 jsonDecoded 响应时,没有任何返回。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    这可能是因为您的函数返回了 http.Response 的未来,这实际上是您使用 http.get 后的响应类型。使用 jsonDecode 后,您应该得到一个 Map 代表 json。

    来自文档:

    通过查看 dart:convert 文档,您会发现可以通过调用 jsonDecode() 函数来解码 JSON,并将 JSON 字符串作为方法参数。

    Map<String, dynamic> user = jsonDecode(jsonString);
    
    print('Howdy, ${user['name']}!');
    print('We sent the verification link to ${user['email']}.');
    

    不幸的是,jsonDecode() 返回一个 Map,这意味着直到运行时您才知道值的类型。使用这种方法,您将失去大多数静态类型语言的特性:类型安全、自动完成以及最重要的编译时异常。您的代码将立即变得更容易出错。

    例如,每当您访问姓名或电子邮件字段时,您可能很快就会出现拼写错误。编译器不知道的错字,因为 JSON 存在于映射结构中。

    使用 jsonDecode 后,您应该使用工厂 fromJson 方法将地图转换为要使用的对象。

    您可以在文档https://flutter.dev/docs/development/data-and-backend/json中阅读更多信息

    【讨论】:

      【解决方案2】:

      您的jsonDecode(response.body); 返回List&lt;dynamic&gt; 类型,但您的函数返回类型是Future&lt;http.Response&gt;。这就是您没有获取数据的原因。

      您可以通过以下方式检查变量的运行时数据类型

      print(result.runtimeType); // variable_name.runtimeType
      

      将函数返回类型更改为Future&lt;List&lt;dynamic&gt;&gt;get(String url)getTodos() 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多