Skip to content

Track ball line strange behavior #2447

@IslamShawky

Description

@IslamShawky
Code sample
import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:icap_ui_components/utils/extensions/string_date_format_extension.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:intl/intl.dart';
import '../../../../utils/app_colors.dart';
import '../../../../utils/app_text_styles.dart';
import 'data_model.dart';

class ChartWidget extends StatelessWidget {
  final List<ChartData> chartData;
  final bool isCandleStick;
  final bool showLineAndCandle;

  const ChartWidget({
    super.key,
    required this.chartData,
    required this.isCandleStick,
    this.showLineAndCandle = false,
  });

  List<ChartData> _getSampledDataForColumnChart() {
    const int numberOfColumns = 48;
    List<ChartData> sampledData = [];

    if (chartData.isEmpty) {
      final now = DateTime.now();
      for (int i = 0; i < numberOfColumns; i++) {
        sampledData.add(
          ChartData(now.add(Duration(days: i)), 0.0, 0.0, 0.0, 0.0),
        );
      }
    } else {
      for (int i = 0; i < numberOfColumns; i++) {
        int originalIndex;
        if (chartData.length == 1) {
          originalIndex = 0;
        } else {
          double ratio = i / (numberOfColumns - 1); // 0.0 to 1.0
          originalIndex = (ratio * (chartData.length - 1)).round();
        }
        sampledData.add(chartData[originalIndex]);
      }
    }
    return sampledData;
  }

  @override
  Widget build(BuildContext context) {
    final List<ChartData> columnChartDataSample =
        _getSampledDataForColumnChart();

    return Column(
      children: [
        SfCartesianChart(
          borderWidth: 0,
          plotAreaBorderWidth: 0,
          backgroundColor: AppColors.white,
          margin: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
          primaryXAxis: DateTimeAxis(
            majorGridLines: const MajorGridLines(width: 0),
            minorGridLines: const MinorGridLines(width: 0),
            majorTickLines: const MajorTickLines(width: 0),
            minorTickLines: const MinorTickLines(width: 0),
            axisLine: const AxisLine(width: 0),
            labelStyle: const TextStyle(fontSize: 0),
            intervalType: DateTimeIntervalType.auto,
            interval: 1,
            edgeLabelPlacement: EdgeLabelPlacement.shift,
          ),
          primaryYAxis: NumericAxis(
            majorGridLines: const MajorGridLines(width: 0),
            minorGridLines: const MinorGridLines(width: 0),
            majorTickLines: const MajorTickLines(width: 0),
            minorTickLines: const MinorTickLines(width: 0),
            axisLine: const AxisLine(width: 0),
            labelStyle: TextStyle(
              color: AppColors.greyTextColor,
              fontSize: 10,
              fontFamily: 'Inter',
            ),
            numberFormat: NumberFormat.compact(),
            opposedPosition: true,
            initialVisibleMinimum: chartData.isNotEmpty
                ? chartData
                      .map((data) => data.low)
                      .reduce((a, b) => math.min(a, b))
                : 0.0,
          ),
          tooltipBehavior: TooltipBehavior(
            enable: !isCandleStick ? true : false,
            canShowMarker: true,
            elevation: 8,
            duration: 3000,
            color: AppColors.white,
            tooltipPosition: TooltipPosition.pointer,
            builder: (data, point, series, pointIndex, seriesIndex) =>
                Container(
                  height: 45.h,
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8.r),
                    color: AppColors.white,
                  ),
                  child: Padding(
                    padding: EdgeInsets.symmetric(
                      horizontal: 9.w,
                      vertical: 5.h,
                    ),
                    child: IntrinsicWidth(
                      child: Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Padding(
                            padding: EdgeInsets.only(top: 4.h),
                            child: Icon(
                              Icons.circle,
                              size: 5.r,
                              color: AppColors.chartGreen,
                            ),
                          ),
                          SizedBox(width: 5.w),
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text(
                                point.x.toString().toFormattedDayMonthYear(),
                                style: AppTextStyles.regular(
                                  10.sp,
                                  color: AppColors.grey6Color,
                                ),
                              ),
                              Text(
                                "${point.y!.toStringAsFixed(2)} SAR",
                                style: AppTextStyles.medium(
                                  12.sp,
                                  color: AppColors.black,
                                ),
                              ),
                            ],
                          ),
                          SizedBox(width: 5.w),
                        ],
                      ),
                    ),
                  ),
                ),
          ),
          trackballBehavior: isCandleStick
              ? null
              : TrackballBehavior(
                  enable: true,
                  activationMode: ActivationMode.singleTap,
                  lineType: TrackballLineType.vertical,
                  lineDashArray: const <double>[6, 4],
                  lineColor: AppColors.greyTextColor.withValues(alpha: 0.5),
                  lineWidth: 1,
                  tooltipDisplayMode: TrackballDisplayMode.floatAllPoints,
                  hideDelay: 3000,
                  tooltipSettings: const InteractiveTooltip(
                    enable: true,
                    arrowLength: 0,
                    arrowWidth: 0,
                    color: Colors.white,
                    connectorLineWidth: 0,
                    borderWidth: 1,
                    borderRadius: 8,
                    decimalPlaces: 6,
                  ),
                  markerSettings: TrackballMarkerSettings(
                    markerVisibility: TrackballVisibilityMode.visible,
                    height: 14,
                    width: 14,
                    color: AppColors.chartGreen,
                    borderColor: AppColors.white,
                    borderWidth: 2,
                    shape: DataMarkerType.image,
                    image: AssetImage("assets/images/chart_point.png"),
                  ),
                  builder: (context, trackballDetails) =>
                      const SizedBox.shrink(),
                ),
          series: <CartesianSeries>[
            if (isCandleStick)
              CandleSeries<ChartData, DateTime>(
                dataSource: chartData,
                xValueMapper: (ChartData data, _) => data.x,
                openValueMapper: (ChartData data, _) => data.open,
                highValueMapper: (ChartData data, _) => data.high,
                lowValueMapper: (ChartData data, _) => data.low,
                closeValueMapper: (ChartData data, _) => data.close,
                enableSolidCandles: true,
                bearColor: AppColors.chartRed,
                bullColor: AppColors.chartGreen,
                width: 1,
                borderWidth: 1.0,
                spacing: 0.5,
                animationDuration: 500,
              )
            else
              LineSeries<ChartData, DateTime>(
                dataSource: chartData,
                xValueMapper: (ChartData data, _) => data.x,
                yValueMapper: (ChartData data, _) => data.close,
                color: AppColors.chartGreen,
                width: 2,
                animationDuration: 500,
                enableTooltip: true,
              ),
          ],
        ),
        SizedBox(
          height: 30.h,
          child: SfCartesianChart(
            borderWidth: 0,
            plotAreaBorderWidth: 0,
            backgroundColor: AppColors.white,
            margin: const EdgeInsets.only(right: 10, bottom: 0, left: 10),
            primaryXAxis: CategoryAxis(
              majorGridLines: const MajorGridLines(width: 0),
              majorTickLines: const MajorTickLines(width: 0),
              axisLine: const AxisLine(width: 0),
              labelStyle: const TextStyle(fontSize: 0),
              arrangeByIndex: true,
            ),
            primaryYAxis: NumericAxis(
              majorGridLines: const MajorGridLines(width: 0),
              minorGridLines: const MinorGridLines(width: 0),
              majorTickLines: const MajorTickLines(width: 0),
              minorTickLines: const MinorTickLines(width: 0),
              axisLine: const AxisLine(width: 0),
              labelStyle: const TextStyle(fontSize: 0),
              numberFormat: NumberFormat.compact(),
              opposedPosition: true,
              initialVisibleMinimum: 0.0,
            ),
            series: <CartesianSeries>[
              ColumnSeries<ChartData, String>(
                dataSource: columnChartDataSample, // Using sampled data
                xValueMapper: (ChartData data, int index) => index.toString(),
                yValueMapper: (ChartData data, _) => data.close,
                color: AppColors.lightColumnChartColor,
                animationDuration: 500,
                enableTooltip: true,
              ),
            ],
          ),
        ),
      ],
    );
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    chartsCharts componentsolvedSolved the query using existing solutionswaiting for customer responseCannot make further progress until the customer responds.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions