Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在其他json对象中获取json列表对象_Flutter_Flutter Dependencies_Flutter Web - Fatal编程技术网

Flutter 在其他json对象中获取json列表对象

Flutter 在其他json对象中获取json列表对象,flutter,flutter-dependencies,flutter-web,Flutter,Flutter Dependencies,Flutter Web,我的请求是: { "id": 1, "name": "Client1", "areas": [ { "id": 1, "name": "AreaName1", "streetAddress": "street1", &q

我的请求是:

{
    "id": 1,
    "name": "Client1",
    "areas": [
      {
        "id": 1,
        "name": "AreaName1",
        "streetAddress": "street1",
        "postalCode": "postal1",
        "city": "city1"
      },
      {
        "id": 2,
        "name": "AreaName2",
        "streetAddress": "street2",
        "postalCode": "postal2",
        "city": "city2"
      },
      {
        "id": 3,
        "name": "AreaName3",
        "streetAddress": "street3",
        "postalCode": "postal3",
        "city": "city3"
      },
      {
        "id": 4,
        "name": "AreaName4",
        "streetAddress": "street4",
        "postalCode": "postal4",
        "city": "city4"
      },
      {
        "id": 5,
        "name": "AreaName5",
        "streetAddress": "street5",
        "postalCode": "postal5",
        "city": "city5"
      }
    ]
  },

因此,这是一个客户的区域列表

所以我创建了dto类:

客户名单收件人:


class ClientListDto {
  int id;
  String pictureUrl;
  String name;
  List<AreaDto> areas;

  ClientListDto({this.id, this.name, this.areas, this.pictureUrl});

  ClientListDto.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    pictureUrl = json['pictureUrl'];
    name = json['name'];
    if (json['areas'] != null) {
      areas = new List<AreaDto>();
      json['areas'].forEach((v) {
        areas.add(AreaDto.fromJson(v));
      });
    }
  }
}

类ClientListDto{
int-id;
弦图;
字符串名;
列出区域;
ClientListDto({this.id,this.name,this.areas,this.pictureUrl});
ClientListDto.fromJson(映射json){
id=json['id'];
pictureUrl=json['pictureUrl'];
name=json['name'];
如果(json['areas']!=null){
区域=新列表();
json['areas'].forEach((v){
添加(AreaDto.fromJson(v));
});
}
}
}
区域至:

class AreaDto {
  int id;
  String name;
  String streetAddress;
  String postalCode;
  String city;

  AreaDto({this.id, this.name, this.streetAddress, this.postalCode, this.city});

  static AreaDto fromJson(Map<String, dynamic> json) {
    return AreaDto(
        id: json['id'],
        name: json['name'],
        streetAddress: json['streetAddress'],
        postalCode: json['postalCode'],
        city: json['city']);
  }
}

类区域到{
int-id;
字符串名;
字符串地址;
字符串后代码;
字符串城市;
AreaDto({this.id,this.name,this.streetAddress,this.postalCode,this.city});
从json到静态区域(映射json){
返回区域到(
id:json['id'],
名称:json['name'],
streetAddress:json['streetAddress'],
postalCode:json['postalCode'],
城市:json['city']);
}
}
我的模型:

class Client {
  int id;
  String name;
  String pictureUrl;
  List<Area> areas;

  Client({this.id, this.name, this.pictureUrl, this.areas});

  static Client fromDTO(ClientListDto dto) {
    return Client(
      id: dto.id,
        name : dto.name,
        pictureUrl: dto.pictureUrl,
areas : new List<Area>(),
    );
  }

//  TODO: DEFINE DTO
}

class Area {
  String name;
  String streetAddress;
  String postalCode;
  String city;

  Area({this.name, this.streetAddress, this.postalCode, this.city});

  static Area fromDTO(AreaDto dto) {
    return Area(
        name : dto.name,
        streetAddress: dto.streetAddress,
        postalCode: dto.postalCode,
        city: dto.city
    );
  }
}
类客户端{
int-id;
字符串名;
弦图;
列出区域;
客户端({this.id,this.name,this.pictureUrl,this.areas});
静态客户端fromDTO(ClientListDto dto){
返回客户端(
id:dto.id,
名称:dto.name,
pictureUrl:dto.pictureUrl,
区域:新列表(),
);
}
//TODO:定义DTO
}
班级面积{
字符串名;
字符串地址;
字符串后代码;
字符串城市;
区域({this.name,this.streetAddress,this.postalCode,this.city});
从dto到dto的静态区域(区域dto){
返回区(
名称:dto.name,
streetAddress:dto.streetAddress,
postalCode:dto.postalCode,
城市:dto.city
);
}
}
我的存储库和我的服务:

  @override
  Future<List<Client>> getListTest() async {
    final mymissionService = MyMissionService.create();
    final token = await accessTokenRepository.getAccessToken();
    print("Token $token");
    final response = await mymissionService.getClient("Bearer ${token}");
    final body = response.body as List<dynamic>;
    final employees = body.map((e) => ClientListDto.fromJson(e)).toList();
    final result = employees
        .map(
          (e) => new Client(
        id: e.id,
        name: e.name,
        pictureUrl: e.pictureUrl,
      ),
    )
        .toList();
    return result;
  }

@覆盖
Future getListTest()异步{
final mymissionService=mymissionService.create();
final token=等待accessTokenRepository.getAccessToken();
打印(“代币$Token”);
final response=wait mymissionService.getClient(“Bearer${token}”);
最终主体=响应。主体作为列表;
final employees=body.map((e)=>ClientListDto.fromJson(e)).toList();
最终结果=员工
.地图(
(e) =>新客户端(
id:e.id,
姓名:e.name,
pictureUrl:e.pictureUrl,
),
)
.toList();
返回结果;
}
但是,当我收集客户列表时,如何才能获得存储库中的区域列表呢?
如果我只打印了这一部分,我将正确收集客户端而不是我的区域

您可以复制粘贴运行下面的完整代码
您可以使用
clientFromJson(jsonString)进行解析,您可以查看详细信息的完整代码
客户端
区域
定义
并使用嵌套的
列表视图显示

代码片段

List<Client> clientFromJson(String str) =>
List<Client>.from(json.decode(str).map((x) => Client.fromJson(x)));
...
if (response.statusCode == 200) {
  return clientFromJson(jsonString);
List clientFromJson(String str)=>
List.from(json.decode(str.map)(x)=>Client.fromJson(x));
...
如果(response.statusCode==200){
返回clientFromJson(jsonString);
工作演示

完整代码

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

List<Client> clientFromJson(String str) =>
    List<Client>.from(json.decode(str).map((x) => Client.fromJson(x)));

String clientToJson(List<Client> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Client {
  Client({
    this.id,
    this.name,
    this.areas,
  });

  int id;
  String name;
  List<Area> areas;

  factory Client.fromJson(Map<String, dynamic> json) => Client(
        id: json["id"],
        name: json["name"],
        areas: List<Area>.from(json["areas"].map((x) => Area.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "areas": List<dynamic>.from(areas.map((x) => x.toJson())),
      };
}

class Area {
  Area({
    this.id,
    this.name,
    this.streetAddress,
    this.postalCode,
    this.city,
  });

  int id;
  String name;
  String streetAddress;
  String postalCode;
  String city;

  factory Area.fromJson(Map<String, dynamic> json) => Area(
        id: json["id"],
        name: json["name"],
        streetAddress: json["streetAddress"],
        postalCode: json["postalCode"],
        city: json["city"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "streetAddress": streetAddress,
        "postalCode": postalCode,
        "city": city,
      };
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<List<Client>> _future;

  Future<List<Client>> getListTest() async {
    String jsonString = '''
    [{
    "id": 1,
    "name": "Client1",
    "areas": [
      {
        "id": 1,
        "name": "AreaName1",
        "streetAddress": "street1",
        "postalCode": "postal1",
        "city": "city1"
      },
      {
        "id": 2,
        "name": "AreaName2",
        "streetAddress": "street2",
        "postalCode": "postal2",
        "city": "city2"
      },
      {
        "id": 3,
        "name": "AreaName3",
        "streetAddress": "street3",
        "postalCode": "postal3",
        "city": "city3"
      },
      {
        "id": 4,
        "name": "AreaName4",
        "streetAddress": "street4",
        "postalCode": "postal4",
        "city": "city4"
      },
      {
        "id": 5,
        "name": "AreaName5",
        "streetAddress": "street5",
        "postalCode": "postal5",
        "city": "city5"
      }
    ]
  },
  {
    "id": 2,
    "name": "Client2",
    "areas": [
      {
        "id": 21,
        "name": "AreaName1",
        "streetAddress": "street1",
        "postalCode": "postal1",
        "city": "city1"
      },
      {
        "id": 22,
        "name": "AreaName2",
        "streetAddress": "street2",
        "postalCode": "postal2",
        "city": "city2"
      },
      {
        "id": 23,
        "name": "AreaName3",
        "streetAddress": "street3",
        "postalCode": "postal3",
        "city": "city3"
      },
      {
        "id": 24,
        "name": "AreaName4",
        "streetAddress": "street4",
        "postalCode": "postal4",
        "city": "city4"
      },
      {
        "id": 25,
        "name": "AreaName5",
        "streetAddress": "street5",
        "postalCode": "postal5",
        "city": "city5"
      }
    ]
  }
  ]
    ''';

    var response = http.Response(jsonString, 200);

    if (response.statusCode == 200) {
      return clientFromJson(jsonString);
    } else {
      print(response.statusCode);
    }
  }

  @override
  void initState() {
    _future = getListTest();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot<List<Client>> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('none');
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                case ConnectionState.active:
                  return Text('');
                case ConnectionState.done:
                  if (snapshot.hasError) {
                    return Text(
                      '${snapshot.error}',
                      style: TextStyle(color: Colors.red),
                    );
                  } else {
                    return ListView.separated(
                        separatorBuilder: (BuildContext context, int index) {
                          return SizedBox(
                            height: 10,
                          );
                        },
                        shrinkWrap: true,
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return Column(
                            mainAxisAlignment: MainAxisAlignment.center,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: <Widget>[
                              Row(
                                  mainAxisAlignment: MainAxisAlignment.center,
                                  crossAxisAlignment: CrossAxisAlignment.center,
                                  children: <Widget>[
                                    Expanded(
                                        flex: 1,
                                        child: Text(snapshot.data[index].name)),
                                    Expanded(
                                      flex: 5,
                                      child: Container(
                                        //height: 50,
                                        child: ListView.separated(
                                            separatorBuilder:
                                                (BuildContext context,
                                                    int index) {
                                              return SizedBox(
                                                width: 10,
                                              );
                                            },
                                            shrinkWrap: true,
                                            scrollDirection: Axis.vertical,
                                            itemCount: snapshot
                                                .data[index].areas.length,
                                            itemBuilder: (context, index1) {
                                              return Row(
                                                  mainAxisAlignment:
                                                      MainAxisAlignment.center,
                                                  crossAxisAlignment:
                                                      CrossAxisAlignment.center,
                                                  children: <Widget>[
                                                    Container(
                                                      width: 120,
                                                      child: Column(
                                                        children: <Widget>[
                                                          Text(
                                                            snapshot
                                                                .data[index]
                                                                .areas[index1]
                                                                .name,
                                                            style: TextStyle(
                                                                color:
                                                                    Colors.red),
                                                          ),
                                                          Text(
                                                              snapshot
                                                                  .data[index]
                                                                  .areas[index1]
                                                                  .id.toString(),
                                                              style: TextStyle(
                                                                  color: Colors
                                                                      .red)),
                                                        ],
                                                      ),
                                                    )
                                                  ]);
                                            }),
                                      ),
                                    )
                                  ])
                            ],
                          );
                        });
                  }
              }
            }));
  }
}
            
导入“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
List clientFromJson(字符串str)=>
List.from(json.decode(str.map)(x)=>Client.fromJson(x));
字符串clientToJson(列表数据)=>
encode(List.from(data.map((x)=>x.toJson());
类客户端{
客户({
这个身份证,
这个名字,
这就是,,
});
int-id;
字符串名;
列出区域;
工厂客户端.fromJson(映射json)=>客户端(
id:json[“id”],
名称:json[“名称”],
areas:List.from(json[“areas”].map((x)=>Area.fromJson(x)),
);
映射到JSON()=>{
“id”:id,
“姓名”:姓名,
“areas”:List.from(areas.map((x)=>x.toJson()),
};
}
班级面积{
区域({
这个身份证,
这个名字,
这是我的地址,
这是邮政编码,
这个城市,
});
int-id;
字符串名;
字符串地址;
字符串后代码;
字符串城市;
factory Area.fromJson(映射json)=>Area(
id:json[“id”],
名称:json[“名称”],
streetAddress:json[“streetAddress”],
postalCode:json[“postalCode”],
城市:json[“城市”],
);
映射到JSON()=>{
“id”:id,
“姓名”:姓名,
“街道地址”:街道地址,
“postalCode”:postalCode,
“城市”:城市,
};
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
未来,未来;;
Future getListTest()异步{
字符串jsonString='''
[{
“id”:1,
“名称”:“客户1”,
“区域”:[
{
“id”:1,
“名称”:“区域名称1”,
“街道地址”:“街道1”,
“postalCode”:“postal1”,
“城市”:“城市1”
},
{
“id”:2,
“名称”:“区域名称2”,
“街道地址”:“街道2”,
“postalCode”:“postal2”,
“城市”:“城市2”
},
{
“id”:3,
“名称”:“区域名称3”,
“streetAddress”:“street3”,
“postalCode”:“postal3”,
“城市”:“城市3”
},
{
“id”:4,
“名称”:“区域名称4”,
“街道地址”:“街道4”,
“postalCode”:“postal4”,
“城市”:“城市4”
},
{
“id”:5,
“名称”:“区域名称5”,
“街道地址”:“街道5”,
“postalCode”:“postal5”,
“城市”:“城市5”
}
]
},
{
“id”:2,
“名称”:“客户2”,
“区域”:[
{