json - Flutter Http Request 从 JSON 响应中删除重复项
问题描述
我按照教程https://www.digitalocean.com/community/tutorials/flutter-flutter-http制作了一个向 API 端点发送 get 请求并返回 JSON 响应的应用程序。
JSON 响应如下所示:
[{"Order":"order1","Driver":"Driver1","Company":"Company1","Address":"Address1"},{"Order":"order2","Driver":"Driver1","Company":"Company2","Address":"Address2"},{"Order":"order3","Driver":"Driver1","Company":"Company3","Address":"Address3"},{"Order":"order4","Driver":"Driver1","Company":"Cpmpany4","Address":"Address4"},{"Order":"order5","Driver":"Driver1","Company":"Company5","Address":"Address5"},{"Order":"order6","Driver":"Driver2","Company":"Company6","Address":"Address6"},{"Order":"order7","Driver":"Driver2","Company":"Company7","Address":"Address7"},{"Order":"order8","Driver":"Driver2","Company":"Company8","Address":"Address8"},{"Order":"order9","Driver":"Driver2","Company":"Company9","Address":"Address9"},{"Order":"order10","Driver":"Driver2","Company":"Company10","Address":"Address10"},{"Order":"ord0439506","Driver":"Driver3","Company":"Company11","Address":"Address11"},{"Order":"ord0439517","Driver":"Driver3","Company":"Company12","Address":"Address12"},{"Order":"ord0439508","Driver":"Driver3","Company":"Company13","Address":"Address13"}]
http_service.dart
class HttpService {
final String postsURL = "https://myapi:8080/getOrders";
Future<List<Post>> getPosts() async {
Response res = await get(postsURL);
if (res.statusCode == 200) {
List<dynamic> body = jsonDecode(res.body);
List<Post> posts = body
.map(
(dynamic item) => Post.fromJson(item),).toList();
)
.toList();
return posts;
} else {
throw "Can't get posts.";
}
}
}
post_model.dart
import 'package:flutter/foundation.dart';
class Post {
final String order;
final String driver;
final String company;
final String address;
Post({
@required this.order,
@required this.driver,
@required this.company,
@required this.address,
});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
order: json['Order'] as String,
id: json['Driver'] as String,
title: json['Company'] as String,
body: json['Address'] as String,
);
}
}
帖子.dart
class PostsPage extends StatelessWidget {
final HttpService httpService = HttpService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Orders"),
),
body: FutureBuilder(
future: httpService.getPosts(),
builder: (BuildContext context, AsyncSnapshot<List<Post>> snapshot){
if(snapshot.hasData){
List<Post> posts = snapshot.data;
return ListView(
children: posts
.map(
(Post post) => ListTile(
title: Text(post.driver),
trailing: Icon(Icons.keyboard_arrow_right),
),
)
.toList(),
);
}
return Center(
child: CircularProgressIndicator());
},
));
}
}
main.dart
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'HTTP',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
home: PostsPage(),
);
}
}
当应用程序完成对我的 API 的发布请求时,它会将驱动程序显示为
- 司机 1
- 司机 1
- 司机 1
- 司机 1
- 司机 2
- 司机 2
- 司机 2
- 司机 2
- 司机 3
- 司机 3
- 司机 3
我希望视图只显示每个驱动程序一次,没有重复
- 司机 1
- 司机 2
- 司机 3
根据研究,大多数人说要将列表变成一个集合,我已经尝试在posts.dart中添加一个 .toSet() 到 .toList() 但仍然显示重复项。我已经搞砸了一段时间,但仍然无法弄清楚。任何帮助将不胜感激。
解决方案
假设您只想要驱动程序的名称,您可以执行类似遍历列表并将名称添加到另一个列表(如果它不存在)的操作
class PostsPage extends StatelessWidget {
final HttpService httpService = HttpService();
List<String> getDrivers(List<Post> posts) {
List<String> res = [];
posts.forEach((e) => if(!res.contains(e.driver)) res.add(e.driver));
return res;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Orders"),
),
body: FutureBuilder(
future: httpService.getPosts(),
builder: (BuildContext context, AsyncSnapshot<List<Post>> snapshot){
if(snapshot.hasData){
List<Post> posts = snapshot.data;
List<String> drivers = getDrivers(posts);
return ListView(
children: drivers
.map(
(driver) => ListTile(
title: Text(driver),
trailing: Icon(Icons.keyboard_arrow_right),
),
)
.toList(),
);
}
return Center(
child: CircularProgressIndicator());
},
));
}
}
推荐阅读
- php - 我想使用 php 使用 mapmyindiaapi 查找给定地址的纬度。试图获取非对象的属性
- java - 为什么 Spring Boot Maven 插件有时会搞乱重新打包我的反应器模块?
- ios - 获取没有行的collectionview标题的IndexPath
- spring - 不能为弹簧执行器使用特定的基本路径
- java - 如何提取与 CoreEntityMention (WikiDictAnnotator) 匹配的维基百科实体
- postgresql - Pyspark Dataframe Insert 覆盖并具有多个分区
- ruby - Cucumber 如何解析配置文件中的环境变量?
- c# - 检查列表顺序是错还是对,如何使代码清晰
- isabelle - 规则 conjI 拆分所有项
- python - 突出显示超过一周的日期单元格!!!Dash