createA11yNodes method
Returns a list of A11yNodes for this chart.
Implementation
@override
List<A11yNode> createA11yNodes() {
final nodes = <_DomainA11yNode>[];
// Update the selection model when the a11y node has focus.
final selectionModel = _chart.getSelectionModel(SelectionModelType.info);
final domainSeriesDatum = <D, List<SeriesDatum<D>>>{};
for (final series in _seriesList) {
for (var index = 0; index < series.data.length; index++) {
final Object? datum = series.data[index];
final domain = series.domainFn(index);
domainSeriesDatum[domain] ??= <SeriesDatum<D>>[];
domainSeriesDatum[domain]!.add(SeriesDatum<D>(series, datum));
}
}
domainSeriesDatum.forEach((D domain, List<SeriesDatum<D>> seriesDatums) {
final a11yDescription = _vocalizationCallback(seriesDatums);
final firstSeries = seriesDatums.first.series;
final domainAxis = firstSeries.getAttr(domainAxisKey) as ImmutableAxis<D>;
final location = domainAxis.getLocation(domain)!;
/// If the step size is smaller than the minimum width, use minimum.
final stepSize = (domainAxis.stepSize > minimumWidth)
? domainAxis.stepSize
: minimumWidth;
nodes.add(_DomainA11yNode(a11yDescription,
location: location,
stepSize: stepSize,
chartDrawBounds: _chart.drawAreaBounds,
isRtl: _chart.context.isRtl,
renderVertically: _chart.vertical,
onFocus: () => selectionModel.updateSelection(seriesDatums, [])));
});
// The screen reader navigates the nodes based on the order it is returned.
// So if the chart is RTL, then the nodes should be ordered with the right
// most domain first.
//
// If the chart has multiple series and one series is missing the domain
// and it was added later, we still want the domains to be in order.
nodes.sort();
return nodes;
}