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

如何从JSON响应动态创建Flutter嵌套树形Widget?

动态生成Flutter嵌套树形Widget解决方案

你的核心问题是手动编写的Widget无法适配动态变化的多层嵌套结构,解决思路是用递归方法遍历嵌套数据,自动生成对应的树形节点,不管新增多少层子节点都能适配。

步骤1:定义数据模型

先把JSON结构转换成Dart实体类,实现类型安全的数据处理:

class Category {
  final String uid;
  final String name;
  final String? description;
  final int? level;
  final String? childrenCount;
  final List<Category>? children;

  Category({
    required this.uid,
    required this.name,
    this.description,
    this.level,
    this.childrenCount,
    this.children,
  });

  // 从JSON转为实体对象的工厂方法
  factory Category.fromJson(Map<String, dynamic> json) {
    return Category(
      uid: json['uid'] ?? '',
      name: json['name'] ?? '',
      description: json['description'],
      level: json['level'] != null ? int.parse(json['level']) : null,
      childrenCount: json['children_count'],
      children: json['children'] != null
          ? (json['children'] as List)
              .map((e) => Category.fromJson(e))
              .toList()
          : null,
    );
  }
}

步骤2:编写递归构建节点的方法

递归遍历每个Category对象,生成flutter_simple_treeview的TreeNode,自动处理子节点嵌套:

import 'package:flutter_simple_treeview/flutter_simple_treeview.dart';

TreeNode buildTreeNode(Category category) {
  // 当前节点的UI,可根据需求自定义样式
  final nodeContent = Padding(
    padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
    child: Text(category.name),
  );

  final children = category.children ?? [];
  // 有子节点则递归生成子节点列表,无则返回单个节点
  return children.isNotEmpty
      ? TreeNode(
          content: nodeContent,
          children: children.map(buildTreeNode).toList(),
        )
      : TreeNode(content: nodeContent);
}

步骤3:在Widget中集成使用

解析API返回的JSON数据,通过递归方法生成完整树形结构:

class CategoryTreePage extends StatelessWidget {
  final Map<String, dynamic> apiResponse; // API返回的原始JSON数据

  const CategoryTreePage({super.key, required this.apiResponse});

  @override
  Widget build(BuildContext context) {
    // 解析根分类列表
    final rootCategories = (apiResponse['data']['categories']['items'] as List)
        .map((e) => Category.fromJson(e))
        .toList();

    // 生成树形节点列表
    final treeNodes = rootCategories.map(buildTreeNode).toList();

    return Scaffold(
      appBar: AppBar(title: const Text('分类树形结构')),
      body: TreeView(
        nodes: treeNodes,
        indent: 24, // 可自定义缩进距离
      ),
    );
  }
}

核心优势

  • 完全适配动态嵌套:无论给任何节点新增多少层子节点,递归逻辑都会自动遍历生成对应Widget
  • 代码易维护:无需手动编写多层嵌套的Widget结构,仅需维护递归逻辑和节点UI
  • 类型安全:通过实体类处理数据,避免JSON解析的潜在错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:46:02