flutter RangeSlider 的labels无法一直显示以及自定义解决办法

公司项目需要做一个年龄选择器,所以选择RangeSlider,但是RangeSlider有个问题,就是Labels无法一直显示,只有在交互时才显示,就算将SliderTheme中showValueIndicator设置为ShowValueIndicator.never也不行。 暂没找到其他设置办法,于是通过自定义rangeThumbShape间接达成效果,全部源码如下:

import 'package:flutter/material.dart';
void main() {
    runApp(  MaterialApp(home:const RangerSliderPage() ,));
}
class RangerSliderPage extends StatefulWidget {
  const RangerSliderPage({super.key});
  @override
  State<StatefulWidget> createState() => _RangeSliderPageState();
}
class _RangeSliderPageState extends State<RangerSliderPage>{
  late IndicatorRangeSliderThumbShape<int> indicatorRangeSliderThumbShape =
  IndicatorRangeSliderThumbShape(18, 60);
  late RangeValues rangeValues = const RangeValues(18, 60);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SliderTheme(
            data: Theme.of(context)
                .sliderTheme
                .copyWith(rangeThumbShape: indicatorRangeSliderThumbShape,
              showValueIndicator: ShowValueIndicator.never
            ),
            child: RangeSlider(
              values:  rangeValues,
              onChanged: (values) {
                indicatorRangeSliderThumbShape.start =
                    values.start.toInt();
                indicatorRangeSliderThumbShape.end = values.end.toInt();
                setState(() {
                  rangeValues=values;
                });
              },
              min: 18,
              max: 60,
              divisions: 60 - 18,
            )),
      ),
    );
  }

}

class IndicatorRangeSliderThumbShape<T> extends RangeSliderThumbShape {
  IndicatorRangeSliderThumbShape(this.start, this.end);

  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    // 这里根据设计图或者代码自行计算
    return const Size(15, 40);
  }

  T start;
  T end;
  TextPainter labelTextPainter = TextPainter()
    ..textDirection = TextDirection.ltr;

  @override
  void paint(
    PaintingContext context,
    Offset center, {
    required Animation<double> activationAnimation,
    required Animation<double> enableAnimation,
    bool? isDiscrete,
    bool? isEnabled,
    bool? isOnTop,
    TextDirection? textDirection,
    required SliderThemeData sliderTheme,
    Thumb? thumb,
    bool? isPressed,
  }) {
    final Canvas canvas = context.canvas;
    final Paint strokePaint = Paint()
      ..color = sliderTheme.thumbColor ?? Colors.yellow
      ..strokeWidth = 3.0
      ..style = PaintingStyle.stroke;
    canvas.drawCircle(center, 7.5, Paint()..color = Colors.white);
    canvas.drawCircle(center, 7.5, strokePaint);
    if (thumb == null) {
      return;
    }
    // 以下就是在thumb下添加一个自定义labels
    final value = thumb == Thumb.start ? start : end;
    labelTextPainter.text = TextSpan(
        text: value.toString(),
        style: const TextStyle(fontSize: 14, color: Colors.black));
    labelTextPainter.layout();
    labelTextPainter.paint(
        canvas,
        center.translate(
            -labelTextPainter.width / 2, labelTextPainter.height / 2));
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值