【问题标题】:flutter serialize son to list objects throws exception颤振序列化儿子列出对象抛出异常
【发布时间】:2019-07-03 21:28:25
【问题描述】:

我有一个 .net 服务器 Web api 调用,我试图将客户端部分从 Xamarin 移植到 Flutter。除了 json 序列化/反序列化很痛苦之外,flutter/Dart 给我留下了深刻的印象!我的 api 返回一个包含嵌入式机器列表的锻炼程序列表。这是非常简单和正常的东西。我生成的 JSON 看起来像:

[
{"id":1,"
Name":"back",
"userid":1,
"cloned":0,
"Machines":
    [
        {"machineid":2,
        "Name":"Leg Extension","PictureUrl":"https://l},
        {"machineid":3,"Name":"yoga ball","PictureUrl":"https://
         }

我最初尝试使用 dart.convert 的手动方法,这对我序列化例程列表很有用。但是,当我调用 jsonDecode 时,我决定使用here 我的代码通过以下异常描述的代码生成:

类型“列表”不是类型“地图”的子类型

我的 Flutter UI 代码如下:

_fetchData() async {
setState(() {
  isLoading = true;
});

final response =
await http.get("http://fitnesspal.azurewebsites.net/api/routines");
if (response.statusCode == 200) {
 // list = (json.decode(response.body) as List)
 //     .map((data) => new Routine.fromJson(data))
  //    .toList();
//  final jsonResponse = json.decode(response.body);
  try {
    String json1 = response.body;
    Map map1 = jsonDecode(json1);
    var test = Routine.fromJson(map1);
  }
  catch (e) {
    print(e.toString());
  }


  setState(() {
    isLoading = false;
  });
} else {
  throw Exception('Failed to load photos');
}

}

import 'package:json_annotation/json_annotation.dart';
import 'package:fitnesspal/Models/Machine.dart';
part 'Routine.g.dart';

@JsonSerializable(nullable: false)
class Routine{
 final int id;
  final String name;
 @JsonKey(name: 'Machines')
 List<Machine> Machines;

 Routine({this.id,this.name,this.Machines});

 factory Routine.fromJson(Map<String, dynamic> json) =>
  _$RoutineFromJson(json);
 Map<String, dynamic> toJson() => _$RoutineToJson(this);

}

我遵循了所描述的代码生成步骤

【问题讨论】:

    标签: serialization dart flutter


    【解决方案1】:

    这不起作用,因为 json1 是对象的 List,而不是 Map。

     Map map1 = jsonDecode(json1);
    

    试试这个:

    List list = jsonDecode(json1);
    

    获取第一个元素仅用于测试(在真实场景中,您必须循环列表)

      var test = Routine.fromJson(list[0]);
    

    【讨论】:

      【解决方案2】:

      对不起,上面是stackoverflow的DFU错误。你的想法奏效了,但为了得到我想要的例程列表,我最终得到了:

      list = (jsonDecode(response.body) as List)
           .map((data) => new Routine.fromJson(data))
           .toList();
      

      然后我在我的 listBuilder 中使用例程名称,看起来不错,感觉很好,但是我需要将嵌入式机器列表传递给我的机器列表小部件。所以我添加了一个名为 MachineList 的有状态小部件,如下所示:注意我将构造函数设置为接受 List

      class MachineList extends StatefulWidget {
      final List<Machine> machines;
      MachineList({Key key, this.machines}) : super(key: key);
      @override
      _MachineListState createState() => _MachineListState(machines);
      

      }

      然后回到 main.dart 我想在列表项 ontap 中导航:

      Navigator.push(
                        context,
                        MaterialPageRoute(
                           builder: (context) => MachineList(
                               machines: list[index].machines)
                        )
                   );
      

      lib/main.dart:122:82: 错误:参数类型 'dart.core::List' 不能分配给参数类型 'dart.core::List

      天哪,它从哪里获取 lib2

      **** 发现我的问题是导入时大小写不匹配在 Dart 中,两个库是相同的,当且仅当它们使用相同的 URI 导入时。如果使用两个不同的 URI,我有 .../Models/。和../模型 没有意识到 Dart 如此敏感以至于习惯了 c# 的痛苦学习经历

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        相关资源
        最近更新 更多