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

Posted

技术标签:

【中文标题】如何在 dart 的 Future 函数中从 JSON 创建一个类对象?【英文标题】:How create a class object from JSON inside a Future function in dart? 【发布时间】:2020-12-20 01:22:59 【问题描述】:

我的主要问题是下面的代码对我来说很好,但它没有优化,我有一个包含以下 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;

在我的飞镖应用程序中,我有以下课程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; 现在我的问题是如何优化我的未来函数只返回一个客户,如下所示:

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:这篇文章的标题有点混乱,任何修改它的建议请编辑

【问题讨论】:

问题,代码可以为多个客户重复吗? 如果你的答案是否定的,如果我在我的回答中说,你必须修改查询 $sql = "SELECT nom , prenom, age FROM client WHERE code LIKE '$code limit 1'" ; 【参考方案1】:

如果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中的代码要快,尤其是数据这么多。

【讨论】:

Salam,感谢兄弟的帮助,我更新了我的帖子,我确信这有点误导或混淆,更新将有助于为我提供解决方案。请更新您的答案,因为您现在有更多关于我的问题的信息。 以下看起来正是我想要的,但它不起作用return Client.fromJson(json.decode(response.body)); 我没有 PHP 经验,但您只需要返回一个对象而不是对象列表即可。 您似乎正在以以下形式返回值: ["id":1,"name":"example"] ,正确的是 "id":1," name":"example",不带 [] 是的,我认为这就是问题

以上是关于如何在 dart 的 Future 函数中从 JSON 创建一个类对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中从 SQLite 获取数据?

在 Flutter Web 中从 JS 调用 Dart 方法

在 Dart 中使用带有 Future 的循环

在 dart 中调试时如何访问 Future 值?

如何在 Dart 中扩展函数?

Flutter/Dart - 调用一个 Future<String> ...但只需要返回一个 String 的函数