build method
Overrides StatelessWidget.build to handle expansion, sliver, and interactions.
Inputs: Build context. Outputs: Expander if children present, else sliver or standard tile. Logic: Asserts no children in sliver mode; builds via buildTile or buildSliver; for expansion, uses Expander with animations (fadeIn for children, divider separator); ignores pointer on header to prevent conflicts; applies blurIn for smooth entry.
Implementation
@override
Widget build(BuildContext context) {
assert((sliver && children.isEmpty) || !sliver,
'Sliver tiles cannot have children');
Widget _build(BuildContext context) => onPressed != null
? GhostButton(
onPressed: onPressed,
density: ButtonDensity.compact,
child: buildTile(context))
: buildTile(context);
if (children.isNotEmpty) {
return Expander(
initiallyExpanded: initiallyExpanded,
controller: expansionController,
duration: expandDuration,
reverseDuration: expandReverseDuration,
curve: expandCurve,
alignment: expandAlignment,
gapPadding: expanderGapPadding,
crossAxisAlignment: expanderCrossAxisAlignment,
header: Builder(
builder: (context) => IgnorePointer(
ignoring: true,
child: _build(context),
)),
overrideSeparator: Divider().animate().fadeIn(
duration: expandDuration * 4,
curve: expandCurve,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
...children.mapIndexed((i, index) => i.animate().fadeIn(
duration: expandDuration * 4,
curve: expandCurve,
delay: Duration(milliseconds: 40 * index)))
],
),
);
}
return sliver ? buildSliver(context) : _build(context);
}