diff --git a/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart b/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart index d0f67603f..b50e46515 100644 --- a/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart +++ b/lib/src/chart/base/axis_chart/side_titles/side_titles_widget.dart @@ -213,10 +213,19 @@ class _SideTitlesWidgetState extends State { List axisPositions, AxisSide side, ) { + final titlesPadding = titlesData.allSidesPadding; + final borderPadding = widget.axisChartData.borderData.allSidesPadding; + final rotatedParentSize = widget.parentSize.rotateByQuarterTurns( + widget.axisChartData.rotationQuarterTurns, + ); final chartSize = Size( - widget.parentSize.width - thisSidePaddingTotal, - widget.parentSize.height - thisSidePaddingTotal, - ).rotateByQuarterTurns(widget.axisChartData.rotationQuarterTurns); + rotatedParentSize.width - + titlesPadding.horizontal - + borderPadding.horizontal, + rotatedParentSize.height - + titlesPadding.vertical - + borderPadding.vertical, + ); // Add 1 pixel to the chart's edges to avoid clipping the last title. final chartRect = (Offset.zero & chartSize).inflate(1); diff --git a/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart b/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart index b124d7d03..9fb34af09 100644 --- a/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart +++ b/test/chart/base/axis_chart/side_titles/side_titles_widget_test.dart @@ -229,6 +229,38 @@ void main() { ); } + LineChartData createLineChartDataWithLargeBottomReservedSize({ + required int rotationQuarterTurns, + }) { + return lineChartDataBase.copyWith( + rotationQuarterTurns: rotationQuarterTurns, + titlesData: FlTitlesData( + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 30, + interval: 1, + getTitlesWidget: (value, meta) { + return Text('L-${value.toInt()}'); + }, + ), + ), + topTitles: const AxisTitles(), + rightTitles: const AxisTitles(), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 190, + interval: 1, + getTitlesWidget: (value, meta) { + return const SizedBox.shrink(); + }, + ), + ), + ), + ); + } + testWidgets( 'LineChart with no titles', (tester) async { @@ -436,4 +468,51 @@ void main() { expect(find.byType(TextButton), findsOneWidget); }, ); + + testWidgets( + 'LineChart left titles remain visible with large cross-axis reserved size (unrotated and rotated)', + (tester) async { + Future pumpChart({ + required Size parentSize, + required int rotationQuarterTurns, + }) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Center( + child: SizedBox( + width: parentSize.width, + height: parentSize.height, + child: SideTitlesWidget( + side: AxisSide.left, + axisChartData: + createLineChartDataWithLargeBottomReservedSize( + rotationQuarterTurns: rotationQuarterTurns, + ), + parentSize: parentSize, + ), + ), + ), + ), + ), + ); + } + + await pumpChart( + parentSize: const Size(180, 400), + rotationQuarterTurns: 0, + ); + for (var i = 0; i <= 10; i++) { + expect(find.text('L-$i'), findsOneWidget); + } + + await pumpChart( + parentSize: const Size(400, 180), + rotationQuarterTurns: 1, + ); + for (var i = 0; i <= 10; i++) { + expect(find.text('L-$i'), findsOneWidget); + } + }, + ); }