[Flutter]Sliderの左右のマージンを無くすには?

Flutter

どうも、ちょげ(@chogetarou)です。

Sliderの左右にデフォルトで設定されているマージンを削除する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

Sliderの左右のマージンを削除するには、RectSliderTrackShapeクラスとSliderThemeを使います。

まず、Sliderのマージンを無くすためのクラスを用意します。

class CustomTrackShape extends RoundedRectSliderTrackShape {
  @override
  Rect getPreferredRect(
      {required RenderBox parentBox,
      Offset offset = Offset.zero,
      required SliderThemeData sliderTheme,
      bool isEnabled = false,
      bool isDiscrete = false}) {

    final double trackHeight = sliderTheme.trackHeight!;
    final double trackLeft = offset.dx;
    final double trackTop =
        offset.dy + (parentBox.size.height - trackHeight) / 2;
    final double trackWidth = parentBox.size.width;

    return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);

  }
}

次に、SliderThemeでSliderをラップし、SliderThemeの引数「data」にSliderThemeDataを指定します。

そして、SliderThemeDataの引数「trackShape」に用意したクラスを指定します。

SliderTheme(
  data: SliderThemeData(
    trackShape: CustomTrackShape(), //用意したクラス
  ),
  child: Slider(
    value: _value,
    onChanged: (newValue) {
      setState(() {
        _value = newValue;
      });
    },
  ),
),

RectSliderTrackShapeとSliderThemeを使うことで、Sliderの左右のマージンを無くすことが出来ます。

使用例

以下は、使用例です。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double _value = 0.5;

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Center(
          child: SliderTheme(
            data: SliderThemeData(
              trackShape: CustomTrackShape(),
            ),
            child: Slider(
              value: _value,
              onChanged: (newValue) {
                setState(() {
                  _value = newValue;
                });
              },
            ),
          ),
        ),
      ),
    );
  }
}

class CustomTrackShape extends RoundedRectSliderTrackShape {
  @override
  Rect getPreferredRect(
      {required RenderBox parentBox,
      Offset offset = Offset.zero,
      required SliderThemeData sliderTheme,
      bool isEnabled = false,
      bool isDiscrete = false}) {

    final double trackHeight = sliderTheme.trackHeight!;
    final double trackLeft = offset.dx;
    final double trackTop =
        offset.dy + (parentBox.size.height - trackHeight) / 2;
    final double trackWidth = parentBox.size.width;

    return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);

  }

}

コメント

タイトルとURLをコピーしました