@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33class CustomSlider extends StatefulWidget {
44 final double value;
55 final ValueChanged <double >? onChanged;
6+ final ValueChanged <double >? onChangeEnd;
67 final double trackHeight;
78 final double thumbRadius;
89 final bool showThumb;
@@ -14,6 +15,7 @@ class CustomSlider extends StatefulWidget {
1415 super .key,
1516 required this .value,
1617 this .onChanged,
18+ this .onChangeEnd,
1719 this .trackHeight = 2 ,
1820 this .thumbRadius = 5 ,
1921 this .showThumb = true ,
@@ -28,19 +30,32 @@ class CustomSlider extends StatefulWidget {
2830
2931class _CustomSliderState extends State <CustomSlider > {
3032 bool _dragging = false ;
33+ double _dragValue = 0.0 ;
3134
3235 void _handleTapDown (TapDownDetails d, double width) {
3336 if (widget.onChanged == null ) return ;
3437 final v = (d.localPosition.dx / width).clamp (0.0 , 1.0 );
3538 widget.onChanged !(v);
39+ widget.onChangeEnd? .call (v);
3640 }
3741
38- void _handleDrag (DragUpdateDetails d, double width) {
42+ void _handleDragStart (DragStartDetails d, double width) {
43+ _dragValue = (d.localPosition.dx / width).clamp (0.0 , 1.0 );
44+ setState (() => _dragging = true );
45+ }
46+
47+ void _handleDragUpdate (DragUpdateDetails d, double width) {
3948 if (widget.onChanged == null ) return ;
4049 final v = (d.localPosition.dx / width).clamp (0.0 , 1.0 );
50+ _dragValue = v;
4151 widget.onChanged !(v);
4252 }
4353
54+ void _handleDragEnd (DragEndDetails _) {
55+ setState (() => _dragging = false );
56+ widget.onChangeEnd? .call (_dragValue);
57+ }
58+
4459 @override
4560 Widget build (BuildContext context) {
4661 final cs = Theme .of (context).colorScheme;
@@ -55,9 +70,9 @@ class _CustomSliderState extends State<CustomSlider> {
5570 return GestureDetector (
5671 behavior: HitTestBehavior .opaque,
5772 onTapDown: (d) => _handleTapDown (d, w),
58- onHorizontalDragStart: (_ ) => setState (() => _dragging = true ),
59- onHorizontalDragUpdate: (d) => _handleDrag (d, w),
60- onHorizontalDragEnd: (_) => setState (() => _dragging = false ) ,
73+ onHorizontalDragStart: (d ) => _handleDragStart (d, w ),
74+ onHorizontalDragUpdate: (d) => _handleDragUpdate (d, w),
75+ onHorizontalDragEnd: _handleDragEnd ,
6176 child: SizedBox (
6277 height: widget.thumbRadius * 2 + 8 ,
6378 child: CustomPaint (
@@ -99,7 +114,6 @@ class _SliderPainter extends CustomPainter {
99114 @override
100115 void paint (Canvas canvas, Size size) {
101116 final cy = size.height / 2 ;
102- final trackY = cy;
103117 final left = thumbRadius;
104118 final right = size.width - thumbRadius;
105119 final trackW = right - left;
@@ -117,17 +131,13 @@ class _SliderPainter extends CustomPainter {
117131 ..strokeWidth = trackHeight
118132 ..style = PaintingStyle .stroke;
119133
120- // inactive track
121- canvas.drawLine (Offset (left, trackY), Offset (right, trackY), trackPaint);
122- // active track
134+ canvas.drawLine (Offset (left, cy), Offset (right, cy), trackPaint);
123135 if (fillX > left) {
124- canvas.drawLine (Offset (left, trackY ), Offset (fillX, trackY ), fillPaint);
136+ canvas.drawLine (Offset (left, cy ), Offset (fillX, cy ), fillPaint);
125137 }
126-
127- // thumb
128138 if (showThumb) {
129139 canvas.drawCircle (
130- Offset (fillX, trackY ),
140+ Offset (fillX, cy ),
131141 thumbRadius,
132142 Paint ()..color = thumbColor,
133143 );
0 commit comments