首页 > 解决方案 > Flutter Dio 返回对象

问题描述

我对 Flutter 有点陌生,并且来自 .NET 世界。

在 .NET 中,我有类似httpclient.GetFromJsonAsync<User>执行 GET 并将其反序列化为User对象的操作。在 Flutter 中,我使用 Dio 并看到它们具有相似的外观方法,get<T>. 然而,即使我使用get<List<User>>or get<User>,它总是抛出运行时错误,它无法转换List<dynamic>List<User>or MapUser尽管代码已成功编译。

final List<User> response = await Dio().get<List<User>>('urlThatReturnListOfUser');

有没有更好的方法或包来反序列化动态/映射到对象?

到目前为止我发现的最好的方法是使用 Json_Serializable,但即便如此,我仍然必须编写类似的东西

final List<User> weathers = (response.data as List)
          .map((e) => User.fromJson(e as Map<String, dynamic>))
          .toList();

每次我调用 API。或者这是我目前最好的选择?还是我用错了Dio?

标签: flutterdartjson-deserializationdio

解决方案


这样的库需要使用运行时反射,这在 Flutter 中是禁用的。运行时反射会干扰树抖动,Dart 已经支持了很长时间。通过摇树,您可以从发布版本中“摆脱”未使用的代码。这显着优化了应用程序的大小。

由于反射使默认情况下隐式使用所有代码,因此它使摇树变得困难。这些工具无法知道运行时哪些部分未使用,因此很难去除冗余代码。使用反射时无法轻松优化应用程序大小。

尽管您不能在 Flutter 中使用运行时反射,但某些库为您提供了类似的易于使用的 API,但它们是基于代码生成的。此方法在代码生成库部分中有更详细的介绍。

https://flutter.dev/docs/development/data-and-backend/json

不幸的是,您目前正在使用最准确的反序列化方式。


推荐阅读