gpt4 book ai didi

php - 如何在 dart 的 Future 函数中从 JSON 创建一个类对象?

转载 作者:行者123 更新时间:2023-12-03 02:41:52 24 4
gpt4 key购买 nike

我的主要问题是下面的代码对我来说工作正常,但没有优化,我有一个包含以下 MySQL 请求的 PHP 文件:

if("GET_CLIENT" == $action){
$code = $_POST['code'];
$db_data = array();
$sql = "SELECT `nom` , `prenom`, `age` FROM `client` WHERE `code` LIKE '$code'" ;
$result = $conn->query($sql);
$row = $result->fetch_assoc())
echo json_encode($db_data);
$conn->close();
return;}
在我的 Dart 应用程序中,我有以下类(class) Client :
  class Client {
String code;
String nom;
String prenom;
Client({this.code, this.prenom, this.nom });

factory Client.fromJson(Map<String, dynamic> json) {
return Client(
code: json['code'] as String,
nom: json['nom'] as String,
prenom: json['prenom'] as String, ); } }
现在从数据库中获取返回的单行我有以下 Future功能 :
Future<Client> fetchClient(String code) async {
var map = Map<String, dynamic>();
map['action'] = 'GET_CLIENT';
map['code'] = code;
var response = await http.post(uri, body: map);
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String, dynamic>>();
List<Client> listOfClients = items.map<Client>((json) {
return Client.fromJson(json);
}).toList();
print(listOfClients.first.code);
return listOfClients.first;
} else {
throw Exception('Failed to load data.');
}
}
这对我来说很好,但正如你所看到的 Future函数正在创建一个客户列表,这个列表当然只有一个项目,所以我使用了 return listOfClients.first;现在我的问题是如何优化我的 Future 函数以仅返回一个客户端,如下所示:
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String, dynamic>>();
Client client = .. somthing ??
// instead of List Client
return client; // instead of return listOfClients.first
}
PS:这篇文章的标题有点令人困惑,任何更改它的建议请编辑

最佳答案

如果Get_only_one_situation方法写得正确,它应该只返回一个值,你只需要 decode它,像这样:

const uri = 'http://10.0.2.2/re/App_agent/agent.php';
Future<Situation> fetchOneSituation(String ID) async {
var map = Map<String, dynamic>();
map['action'] = 'Get_only_one_situation';
map['ID'] = ID;
var response = await http.post(uri, body: map);
if (response.statusCode == 200) {
return Situation.fromJson(json.decode(response.body));
// You probably need this
// return Situation.fromJson(json.decode(response.body)['data'])
} else {
throw Exception('Failed to load data.');
}
}
更新您的问题后,我很清楚您正在使用此操作获取所有扇区 Get_only_one_situation ,这不是首选。
如果必须获取整个表,您需要做的就是使用 firstWhere 获取适当的项目。方法,像这样:
Future<Situation> fetchSituation(String ID) async {
var map = Map<String, dynamic>();
map['action'] = 'Get_only_one_situation';
var response = await http.post(uri, body: map);
if (response.statusCode == 200) {
final items = json.decode(response.body).cast<Map<String, dynamic>>();
List<Situation> listOfSituations = items.map<Client>((json) {
return Situation.fromJson(json);
}).toList();
return listOfSituations.firstWhere((item)=>item.ID==item.ID);
} else {
throw Exception('Failed to load data.');
}
}
当然,我不推荐这种方法,因为在数据库上查询比flutter中的代码要快,尤其是在这么多数据的情况下。

关于php - 如何在 dart 的 Future 函数中从 JSON 创建一个类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63679014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com