我的自定义滑块实现不是“SliderComponentShape.paint”的有效覆盖

问题描述 投票:0回答:1

我使用的是 dart 代码 v3.86.0。

我正在尝试为颤动中的滑块制作自定义拇指,但收效甚微。我收到错误:我的自定义滑块实现不是“SliderComponentShape.paint”的有效覆盖 并让我生气,签名是正确的,但它确实有效。

这是我的完整代码:


class _CustomThumbShape extends SliderComponentShape {
  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return Size.fromRadius(18);
  }

  String _formatTime(double value) {
    int hours = value.floor();
    int minutes = ((value - hours) * 60).round();
    return '${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}';
  }

  @override
  void paint(
    PaintingContext context,
    Offset thumbCenter, {
    required Animation<double> enableAnimation,
    required Animation<double> valueAnimation,
    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 Paint paint = Paint()
      ..color = Colors.white
      ..style = PaintingStyle.fill;

    canvas.drawCircle(thumbCenter, 18, paint); // Drawing at 'thumbCenter'

    // TextSpan for displaying time based on the slider's value
    TextSpan span = TextSpan(
      style: TextStyle(
        fontSize: 14.0,
        fontWeight: FontWeight.bold,
        color: Colors.black,
      ),
      text: _formatTime(enableAnimation.value), // Displaying time dynamically
    );

    TextPainter tp = TextPainter(text: span, textAlign: TextAlign.center);

    tp.layout();

    Offset textCenter = Offset(
        thumbCenter.dx - (tp.width / 2), thumbCenter.dy - (tp.height / 2));

    tp.paint(canvas, textCenter);
  }
}

这是完整的错误消息:


'_CustomThumbShape.paint' ('void Function(PaintingContext, Offset, {required Animation<double> enableAnimation, required bool isDiscrete, required TextPainter labelPainter, required RenderBox parentBox, required Size sizeWithOverflow, required SliderThemeData sliderTheme, required TextDirection textDirection, required double textScaleFactor, required double value, required Animation<double> valueAnimation})') isn't a valid override of 'SliderComponentShape.paint' ('void Function(PaintingContext, Offset, {required Animation<double> activationAnimation, required Animation<double> enableAnimation, required bool isDiscrete, required TextPainter labelPainter, required RenderBox parentBox, required Size sizeWithOverflow, required SliderThemeData sliderTheme, required TextDirection textDirection, required double textScaleFactor, required double value})').dartinvalid_override

任何帮助将不胜感激!

我尝试将签名修复为文档中的内容,但无济于事。错误仍然存在。

flutter dart
1个回答
0
投票

根据文档,您没有对 SliderComponentShape 类的绘制方法使用相同的签名

你可以尝试一下这个签名并告诉我它是否有效吗?

@override
  void paint(PaintingContext context, Offset thumbCenter,
      {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 Paint paint = Paint()
      ..color = Colors.white
      ..style = PaintingStyle.fill;

    canvas.drawCircle(thumbCenter, 18, paint); // Drawing at 'thumbCenter'

    // TextSpan for displaying time based on the slider's value
    TextSpan span = TextSpan(
      style: TextStyle(
        fontSize: 14.0,
        fontWeight: FontWeight.bold,
        color: Colors.black,
      ),
      text: _formatTime(enableAnimation.value), // Displaying time dynamically
    );

    TextPainter tp = TextPainter(text: span, textAlign: TextAlign.center);

    tp.layout();

    Offset textCenter = Offset(
        thumbCenter.dx - (tp.width / 2), thumbCenter.dy - (tp.height / 2));

    tp.paint(canvas, textCenter);
  }
© www.soinside.com 2019 - 2024. All rights reserved.