buildExpansionTile method

Widget buildExpansionTile(
  1. T data
)

构建单个节点的ExpansionTile

Implementation

Widget buildExpansionTile(T data) {
  final V? nodeValue = widget.valueMapper(data);
  final String? label = widget.labelMapper(data);
  final List<T>? children = getChildren(data);
  final bool hasChildren = children != null && children.isNotEmpty;
  final bool selected = isDataSelected(data);

  // 如果是叶子节点或者使用了自定义构建器
  if (!hasChildren) {
    return buildCascadePickerItem(data);
  }

  List<T> filterChildren = [...children];
  if (controller != null) {
    filterChildren = filterChildren.where(_isNodeMatched).toList();
  }

  // 父节点使用ExpansionTile
  return ExpansionTile(
    collapsedBackgroundColor:
        selected ? Theme.of(context).listTileTheme.selectedTileColor : null,
    tilePadding: const EdgeInsets.only(left: 4.0, right: 16.0),
    key: ValueKey(nodeValue),
    initiallyExpanded: isExpanded(nodeValue),
    onExpansionChanged: (expanded) => setExpanded(nodeValue, expanded),
    leading: parentCheckable ? buildParentChecker(data) : null,
    title: TxMatchingText(label ?? '', query: controller?.text),
    childrenPadding: const EdgeInsets.only(left: 16),
    children: filterChildren.map(buildExpansionTile).toList(),
  );
}