You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何在ListView Builder里访问JSON的model字段

在Flutter ListView.builder中访问JSON的"model"字段

核心问题分析

你的JSON结构里,model是嵌套在动态键的category对象中的可选字段,需要先遍历提取所有model数据,再用ListView.builder渲染。


方法1:直接操作Map(快速实现)

步骤1:解析JSON字符串

先把JSON转成Dart的List<Map<String, dynamic>>:

import 'dart:convert';

// 假设你的JSON数据已获取(比如从API、本地文件)
String jsonData = '''[
  {
    "vehicle": "roadways",
    "id": "10000",
    "category": {
      "500": {
        "id": "500",
        "name": "Bike",
        "icon": "http://example.com/bike.jpg",
        "model": [
          {
            "id": "510",
            "name": "Harley"
          },
          {
            "id": "520",
            "name": "Kawasaki"
          }
        ]
      },
      "50": {
        "id": "50",
        "name": "Car",
        "icon": "http://example.com/car.jpg"
      }
    }
  },
  {
    "vehicle": "waterways",
    "id": "20000",
    "category": {
      "600": {
        "id": "600",
        "name": "Ship",
        "icon": "http://example.com/ship.jpg",
        "model": [
          {
            "id": "610",
            "name": "model_1"
          },
          {
            "id": "520",
            "name": "model_2"
          }
        ]
      },
      "700": {
        "id": "700",
        "name": "model_3",
        "icon": "http://example.com/car.jpg"
      }
    }
  }
]''';

List<Map<String, dynamic>> vehicles = jsonDecode(jsonData);

步骤2:提取所有model数据

遍历每个车辆的分类,筛选出包含model的项并收集数据:

List<Map<String, dynamic>> allModels = [];

for (var vehicle in vehicles) {
  // 获取所有分类对象(忽略分类的动态键)
  var categoryValues = vehicle['category'].values;
  for (var category in categoryValues) {
    // 检查当前分类是否有model字段
    if (category.containsKey('model')) {
      allModels.addAll(List<Map<String, dynamic>>.from(category['model']));
    }
  }
}

步骤3:用ListView.builder渲染

直接基于收集到的allModels构建列表:

ListView.builder(
  padding: const EdgeInsets.all(16),
  itemCount: allModels.length,
  itemBuilder: (context, index) {
    final model = allModels[index];
    return ListTile(
      title: Text(model['name']),
      subtitle: Text('Model ID: ${model['id']}'),
      leading: const Icon(Icons.directions_car),
    );
  },
)

方法2:使用模型类(规范、类型安全)

对于复杂JSON,推荐用模型类避免类型错误,先创建对应的Dart类:

import 'dart:convert';

class Vehicle {
  final String vehicle;
  final String id;
  final Map<String, Category> categories;

  Vehicle({
    required this.vehicle,
    required this.id,
    required this.categories,
  });

  factory Vehicle.fromJson(Map<String, dynamic> json) {
    final categoryMap = json['category'] as Map<String, dynamic>;
    final categories = <String, Category>{};
    categoryMap.forEach((key, value) {
      categories[key] = Category.fromJson(value);
    });
    return Vehicle(
      vehicle: json['vehicle'],
      id: json['id'],
      categories: categories,
    );
  }
}

class Category {
  final String id;
  final String name;
  final String icon;
  final List<Model>? models; // 可选字段,部分分类无model

  Category({
    required this.id,
    required this.name,
    required this.icon,
    this.models,
  });

  factory Category.fromJson(Map<String, dynamic> json) {
    List<Model>? models;
    if (json.containsKey('model')) {
      models = (json['model'] as List)
          .map((item) => Model.fromJson(item))
          .toList();
    }
    return Category(
      id: json['id'],
      name: json['name'],
      icon: json['icon'],
      models: models,
    );
  }
}

class Model {
  final String id;
  final String name;

  Model({
    required this.id,
    required this.name,
  });

  factory Model.fromJson(Map<String, dynamic> json) {
    return Model(
      id: json['id'],
      name: json['name'],
    );
  }
}

解析与提取数据

// 解析成模型对象列表
List<Vehicle> vehicleList = (jsonDecode(jsonData) as List)
    .map((item) => Vehicle.fromJson(item))
    .toList();

// 收集所有model数据
List<Model> allModels = [];
for (var vehicle in vehicleList) {
  for (var category in vehicle.categories.values) {
    if (category.models != null) {
      allModels.addAll(category.models!);
    }
  }
}

渲染列表

ListView.builder(
  padding: const EdgeInsets.all(16),
  itemCount: allModels.length,
  itemBuilder: (context, index) {
    final model = allModels[index];
    return ListTile(
      title: Text(model.name),
      subtitle: Text('Model ID: ${model.id}'),
      leading: const Icon(Icons.directions_car),
    );
  },
)

内容的提问来源于stack exchange,提问作者flutterlearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:12:22