どうも、ちょげ(@chogetarou)です。
Sliderの左右にデフォルトで設定されているマージンを削除する方法を紹介します。
方法

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);
}
}
コメント