如何从 SfCartesianChart() 覆盖系列级 markerSettings?

How to override series level markerSettings from SfCartesianChart()?

我有一个用例,在同一张图片中有多个样条图表(见图)。正如您在图像中看到的,我只需要在中心曲线上显示一个标志标记,而不是在相邻的图形上。我在图像中实现了类似的行为,但我无法从第一个和第三个图中删除标记。

 @override
  Widget build(BuildContext context) {
    final chartData = <_ChartData>[...];
    final chartData2 = <_ChartData2>[...];
    final chartData3 = <_ChartData3>[...];

    return SfCartesianChart(
      /// ... Some other props
      trackballBehavior: _getTrackBallBehavior(),
      series: <ChartSeries>[
        SplineAreaSeries<_ChartData2, int>(
          dataSource: chartData2,
          xValueMapper: (_ChartData2 data, _) => data.x,
          yValueMapper: (_ChartData2 data, _) => data.y,
          /// INDIVIDUAL LEVEL MARKER SETTING --- not overriding the global one below
          markerSettings: const TrackballMarkerSettings(
            markerVisibility: TrackballVisibilityMode.hidden,
            shape: DataMarkerType.none,
          ),
        ),
        SplineSeries<_ChartData, int>(
          dataSource: chartData,
          xValueMapper: (_ChartData data, _) => data.x,
          yValueMapper: (_ChartData data, _) => data.y,
        ),
        SplineAreaSeries<_ChartData3, int>(
          dataSource: chartData3,
          xValueMapper: (_ChartData3 data, _) => data.x,
          yValueMapper: (_ChartData3 data, _) => data.y,
        ),
      ],
    );
  }

  TrackballBehavior _getTrackBallBehavior() {
    return TrackballBehavior(
      enable: true,
      /// .... some other props
      tooltipSettings: const InteractiveTooltip(
        enable: true,
        arrowLength: 0,
        arrowWidth: 0,
      ),
      /// GLOBAL MARKER SETTING
      markerSettings: const TrackballMarkerSettings(
        markerVisibility: TrackballVisibilityMode.visible,
        shape: DataMarkerType.image,
        width: 10,
        height: 10,
        image: CachedNetworkImageProvider(Images.targetFlagWhite),
      ),
      builder: (ctx, details) {
        if (details.seriesIndex == 0 || details.seriesIndex == 2) 
              return Text('Rs.1304', style: AppText.text14w600Title);

        return Container(
          width: 83.w,
          height: 28.h,
          padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 2.h),
          decoration: BoxDecoration(
           /// Some decore props
          ),
          child: Text('Rs..1344', style: AppText.text14w600Title),
        );
      },
    );
  }

如何实现?或者有解决方法吗?

我建议您使用 onTrackballPositionChanging 回调来隐藏特定系列 1st 和 3rd 的轨迹球标记。在此回调中,您可以获取或设置每个标记的 x 和 y 位置,这里我们将标记的 x 和 y 位置值设置为 double.infinity,当系列索引为 0 和 2 时,否则为实际值。我们附上了下面的代码片段供您参考。

截图:

代码片段:

onTrackballPositionChanging: (args) {
  if (args.chartPointInfo.seriesIndex != 1) {
    args.chartPointInfo.markerXPos = double.infinity;
    args.chartPointInfo.markerYPos = double.infinity;
  }
}