Flutter 如何从 JSON 中列出具有多个子项的数组

Posted

技术标签:

【中文标题】Flutter 如何从 JSON 中列出具有多个子项的数组【英文标题】:Flutter How to List Array with multiple children from JSON 【发布时间】:2019-07-08 00:02:48 【问题描述】:

我很难从 json 中解析一个值。 我想创建一个带有扩展的 ListView Builder,并在扩展中有一个子级。 我的意思是像下面

Sample i want

但我不知道如何根据类型解析所有孩子。 有关详细的 sql 表和查询,请查看以下内容:

[

    "ID_Type": "1",
    "Type": "Food",
    "Item": [
        
            "SLU_Number": "3",
            "SLU_Name": "Food"
        
    ]
,

    "ID_Type": "2",
    "Type": "Beverages",
    "Item": [
        
            "SLU_Number": "1",
            "SLU_Name": "Non Alcohol"
        ,
        
            "SLU_Number": "2",
            "SLU_Name": "Alchohol"
        
    ]

]

我观看了一些视频并按照建议创建了一个新的 dart 文件,其中包含名为 ListType.dart 的新类

这里是代码

class Products 
  final ID_Type;
  final Name_Type;
  final Items;

  Products(
    this.ID_Type,
    this.Name_Type,
    this.Items,
  );

  factory Products.fromJson(Map<String, dynamic> json) 
    return Products(
      ID_Type: json["ID_Type"],
      Name_Type: json["Type"],
      Items: Item.fromJson(json["Item"]),
    );
  


class Item 
  final SLU_Number;
  final SLU_Name;

  Item(
    this.SLU_Number,
    this.SLU_Name,
  );

  factory Item.fromJson(Map<String, dynamic> json) 
    return Item(
      SLU_Number: json["SLU_Number"],
      SLU_Name: json["SLU_Name"],
    );
  

但是由于视频将值扔到列表中,所以我不知道将 json 值扔到 ListView.Builder。

下面是我通常如何扔给 List View Builder

//------------------------------Start Syntax for List SLU
  final listslu = new List<ListSLU>();
  final GlobalKey<RefreshIndicatorState> _refreshlistslu =
      GlobalKey<RefreshIndicatorState>();


  Future<void> ListSLUs() async 
    listslu.clear();
    setState(() 
      loading = true;
    );
    try 
      final response = await http.get(BaseUrl.ListSLU);
      if (response.contentLength == 2) 
       else 
        final data = jsonDecode(response.body);
        data.forEach((api) 
          final b = new ListSLU(
            api['ID_Type'].toString(),
            api['SLU_Number'].toString(),
            api['SLU_Name'].toString(),
          );
          listslu.add(b);
          print(api['SLU_Name'].toString());
        );
      
     catch (e) 
      print("Error List SLU :");
      print(e);
    
  
  //------------------------------End Syntax for List Type

下面我根据上面创建的未来异步将其扔到正文

Expanded(
              flex: 2,
              child: ListView.builder(
                itemCount: listslu.length,
                itemBuilder: (context,i)
                  final z = listslu[i];
                  return GestureDetector(
                    onTap: ()

                    ,
                    child: Container(
                      child: Column(
                        children: <Widget>[
                          Row(
                            children: <Widget>[
                          Row(
                          children: <Widget>[
                          Text(z.SLU_Number +' - '+ z.SLU_Name),
                        ],
                      ),
                            ],
                          )
                        ],
                      ),
                    ),
                  );
                
              )
          ),

请多多指教。

【问题讨论】:

非常模糊的图片,可以将代码复制粘贴到 gist.github.com 或任何其他 pastebin - 比屏幕截图好得多。 请检查我的代码 【参考方案1】:

应该可以对item使用where()进行过滤,然后使用map()将每一行json转换成ListTile()

ExpansionTile(
   ...
   children: jsonData
      .where((row) => row["ID_Type"] == listtypes[i].ID_Type)
      .map((row) =>
         ListTile(
            title: Text(row["SLU_Name"])
         )
      )
)

【讨论】:

我已经编辑了我的帖子。你能帮帮我吗,我希望将 json 结果中的所有值都扔给 Listview.builder。 请帮我解决这个问题***.com/questions/60432234/…

以上是关于Flutter 如何从 JSON 中列出具有多个子项的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 dart/flutter 中提取 JSON 子数据

如何在flutter中使用mysql数据库(或json)中的sharedpreferences键选择以列出最喜欢的记录?

如何使用 Flutter 在 Firestore 中删除具有特定值的多个文档

如何在颤动中检索json数据元素以列出view.builder?

如何在flutter中从API创建多个复选框

在flutter项目中列出本地json数据