Custom slider

I'm trying to write a custom widget for a custom slider. I'm getting two errors that I can't figure out how to fix. Anyone that know how to fix it?

Error: // Automatic FlutterFlow imports import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/custom_code/widgets/index.dart'; // Imports other custom widgets import '/flutter_flow/custom_functions.dart'; // Imports custom functions import 'package:flutter/material.dart'; // Begin custom widget code // DO NOT REMOVE OR MODIFY THE CODE ABOVE! class Customslider4 extends StatefulWidget { const Customslider4({ Key? key, this.width, this.height, }) : super(key: key); final double? width; final double? height; @override _Customslider4State createState() => _Customslider4State(); } class _Customslider4State extends State<Customslider4> { RangeValues _currentRangeValues = const RangeValues(40, 80); @override Widget build(BuildContext context) { return SliderTheme( data: SliderTheme.of(context).copyWith( activeTrackColor: Colors.orangeAccent, inactiveTrackColor: Colors.grey, trackHeight: 4.0, thumbShape: CustomThumbImage(), overlayColor: Colors.orange.withAlpha(32), overlayShape: RoundSliderOverlayShape(overlayRadius: 28.0), tickMarkShape: CustomTickMarkShape(), activeTickMarkColor: Colors.orangeAccent, inactiveTickMarkColor: Colors.grey, ), child: RangeSlider( values: _currentRangeValues, min: 0, max: 100, divisions: 100, labels: RangeLabels( _currentRangeValues.start.round().toString(), _currentRangeValues.end.round().toString(), ), onChanged: (RangeValues values) { setState(() { _currentRangeValues = values; }); }, ), ); } } class CustomThumbImage extends SliderComponentShape { @override Size getPreferredSize(bool isEnabled, bool isDiscrete) { return Size(30, 30); // as per your image size } @override void paint( PaintingContext context, Offset center, { required Animation<double> activationAnimation, required Animation<double> enableAnimation, required bool isDiscrete, required TextPainter labelPainter, required RenderBox parentBox, required SliderThemeData sliderTheme, required TextDirection textDirection, required double value, required double textScaleFactor, required Size sizeWithOverflow, }) { final Canvas canvas = context.canvas; final ImageProvider imageProvider = AssetImage( 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/customwidget-rds5ww/assets/zmpys3oa1aoq/rangehandle.png'); // replace with your image path final ImageStream imageStream = imageProvider .resolve(ImageConfiguration(size: getPreferredSize(true, isDiscrete))); final ImageStreamListener listener = ImageStreamListener((ImageInfo image, bool _) { canvas.drawImage(image.image, center - Offset(15, 15), Paint()); // the Offset should center the thumb, adjust as needed }); imageStream.addListener(listener); } } class CustomTickMarkShape extends RoundSliderTickMarkShape { @override Size getPreferredSize({ required SliderThemeData sliderTheme, required bool isEnabled, }) { return Size(2.0, 10.0); // size of the larger tick marks } @override void paint( PaintingContext context, Offset center, { required RenderBox parentBox, required SliderThemeData sliderTheme, required Animation<double> enableAnimation, required Offset thumbCenter, required bool isEnabled, required TextDirection textDirection, }) { final double tickMarkWidth = sliderTheme.trackHeight! / 3; final Paint paint = Paint() ..color = (isEnabled ? sliderTheme.activeTickMarkColor : sliderTheme.inactiveTickMarkColor)!; final double majorTickLength = getPreferredSize(sliderTheme: sliderTheme, isEnabled: isEnabled).height; final double minorTickLength = majorTickLength / 2; // Draw the major tick mark if (center.dx % 10 == 0) { context.canvas.drawLine( Offset(center.dx - tickMarkWidth / 2, center.dy), Offset(center.dx + tickMarkWidth / 2, center.dy + majorTickLength), paint, ); } // Draw the minor tick mark else { context.canvas.drawLine( Offset(center.dx - tickMarkWidth / 2, center.dy), Offset(center.dx + tickMarkWidth / 2, center.dy + minorTickLength), paint, ); } } }


Code:

// Automatic FlutterFlow imports
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/widgets/index.dart'; // Imports other custom widgets
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
// Begin custom widget code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!

class Customslider4 extends StatefulWidget {
  const Customslider4({
    Key? key,
    this.width,
    this.height,
  }) : super(key: key);

  final double? width;
  final double? height;

  @override
  _Customslider4State createState() => _Customslider4State();
}

class _Customslider4State extends State<Customslider4> {
  RangeValues _currentRangeValues = const RangeValues(40, 80);

  @override
  Widget build(BuildContext context) {
    return SliderTheme(
      data: SliderTheme.of(context).copyWith(
        activeTrackColor: Colors.orangeAccent,
        inactiveTrackColor: Colors.grey,
        trackHeight: 4.0,
        thumbShape: CustomThumbImage(),
        overlayColor: Colors.orange.withAlpha(32),
        overlayShape: RoundSliderOverlayShape(overlayRadius: 28.0),
        tickMarkShape: CustomTickMarkShape(),
        activeTickMarkColor: Colors.orangeAccent,
        inactiveTickMarkColor: Colors.grey,
      ),
      child: RangeSlider(
        values: _currentRangeValues,
        min: 0,
        max: 100,
        divisions: 100,
        labels: RangeLabels(
          _currentRangeValues.start.round().toString(),
          _currentRangeValues.end.round().toString(),
        ),
        onChanged: (RangeValues values) {
          setState(() {
            _currentRangeValues = values;
          });
        },
      ),
    );
  }
}

class CustomThumbImage extends SliderComponentShape {
  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return Size(30, 30); // as per your image size
  }

  @override
  void paint(
    PaintingContext context,
    Offset center, {
    required Animation<double> activationAnimation,
    required Animation<double> enableAnimation,
    required bool isDiscrete,
    required TextPainter labelPainter,
    required RenderBox parentBox,
    required SliderThemeData sliderTheme,
    required TextDirection textDirection,
    required double value,
    required double textScaleFactor,
    required Size sizeWithOverflow,
  }) {
    final Canvas canvas = context.canvas;
    final ImageProvider imageProvider = AssetImage(
        'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/customwidget-rds5ww/assets/zmpys3oa1aoq/rangehandle.png'); // replace with your image path
    final ImageStream imageStream = imageProvider
        .resolve(ImageConfiguration(size: getPreferredSize(true, isDiscrete)));
    final ImageStreamListener listener =
        ImageStreamListener((ImageInfo image, bool _) {
      canvas.drawImage(image.image, center - Offset(15, 15),
          Paint()); // the Offset should center the thumb, adjust as needed
    });

    imageStream.addListener(listener);
  }
}

class CustomTickMarkShape extends RoundSliderTickMarkShape {
  @override
  Size getPreferredSize({
    required SliderThemeData sliderTheme,
    required bool isEnabled,
  }) {
    return Size(2.0, 10.0); // size of the larger tick marks
  }

  @override
  void paint(
    PaintingContext context,
    Offset center, {
    required RenderBox parentBox,
    required SliderThemeData sliderTheme,
    required Animation<double> enableAnimation,
    required Offset thumbCenter,
    required bool isEnabled,
    required TextDirection textDirection,
  }) {
    final double tickMarkWidth = sliderTheme.trackHeight! / 3;
    final Paint paint = Paint()
      ..color = (isEnabled
          ? sliderTheme.activeTickMarkColor
          : sliderTheme.inactiveTickMarkColor)!;

    final double majorTickLength =
        getPreferredSize(sliderTheme: sliderTheme, isEnabled: isEnabled).height;
    final double minorTickLength = majorTickLength / 2;

    // Draw the major tick mark
    if (center.dx % 10 == 0) {
      context.canvas.drawLine(
        Offset(center.dx - tickMarkWidth / 2, center.dy),
        Offset(center.dx + tickMarkWidth / 2, center.dy + majorTickLength),
        paint,
      );
    }
    // Draw the minor tick mark
    else {
      context.canvas.drawLine(
        Offset(center.dx - tickMarkWidth / 2, center.dy),
        Offset(center.dx + tickMarkWidth / 2, center.dy + minorTickLength),
        paint,
      );
    }
  }
}
1
3 replies