buildTree static method

List<TopicModel> buildTree(
  1. List<TopicModel> flatList
)

Build a tree of TopicModel from a flat list using parent_topic_id.

Implementation

static List<TopicModel> buildTree(List<TopicModel> flatList) {
  final Map<String, List<TopicModel>> childrenMap = {};

  for (final topic in flatList) {
    final parentId = topic.parentTopicId ?? '';
    childrenMap.putIfAbsent(parentId, () => []);
    childrenMap[parentId]!.add(topic);
  }

  TopicModel attachChildren(TopicModel node) {
    final kids = childrenMap[node.id] ?? [];
    kids.sort((a, b) => a.sortOrder.compareTo(b.sortOrder));
    final resolvedKids = kids.map(attachChildren).toList();
    return node.copyWith(children: resolvedKids);
  }

  // Root nodes have no parent
  final roots = childrenMap[''] ?? [];
  roots.sort((a, b) => a.sortOrder.compareTo(b.sortOrder));
  return roots.map(attachChildren).toList();
}