buildExpansionTile method
构建单个节点的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(),
);
}