Почему все виджеты Slider перемещаются вместе в ListView.builder?
У меня есть метод ListView.builder(), который создает несколько карт, которые содержат изображение, текст и ползунок для каждой карты. Проблема в том, что всякий раз, когда я двигаю ползунок, они все движутся вместе, как и ценность.
double _sliderValue = 0.0;
final List<String> cardList = [
'assets/food.jpg',
'assets/food.jpg',
'assets/food.jpg',
];
void _setValue(double value) {
setState(() {
_sliderValue = value;
});
}
Widget _buildFoodCard(BuildContext context, int index) {
return Container(
height: 350,
child: Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
child: Column(
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: Image.asset(
cardList[index],
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.only(top: 15.0),
child: Text(
'${_sliderValue.round()}' + ' ITEMS',
style: TextStyle(color: Colors.white, fontSize: 15.0),
),
),
SliderTheme(
data: SliderTheme.of(context).copyWith(
thumbColor: Colors.white,
thumbShape: RoundSliderThumbShape(enabledThumbRadius: 10.0),
activeTrackColor: Color(0xff3ADEA7),
inactiveTrackColor: Colors.grey,
overlayColor: Colors.transparent,
trackHeight: 1.0),
child: Slider(
value: _sliderValue,
onChanged: _setValue,
min: 0.0,
max: 150.0,
divisions: 30,
),
),
],
),
color: Colors.transparent,
elevation: 0.0,
margin: EdgeInsets.all(10.0),
),
);
}
Widget _buildCardList() {
return ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: _builFoodCard,
itemCount: cardList.length,
);
}
Что я могу сделать, чтобы каждый слайдер и значение двигались / увеличивались индивидуально?
1 ответ
Решение
Вы реализуете состояние для каждой карты с помощью ползунка с собственным состоянием ползунка.
Widget _buildCardList() {
return ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (BuildContext context, int index) =>
MyWidgetSlider(cardList[index]),
itemCount: cardList.length,
);
}
class MyWidgetSlider extends StatefulWidget {
final String data;
MyWidgetSlider(this.data) : super();
_MyWidgetSliderState createState() => _MyWidgetSliderState();
}
class _MyWidgetSliderState extends State<MyWidgetSlider> {
double _sliderValue;
@override
void initState() {
super.initState();
_sliderValue = 0.0;
}
void _setValue(double value) {
setState(() {
_sliderValue = value;
});
}
@override
Widget build(BuildContext context) {
return Container(
height: 350,
child: Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
child: Column(
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: Image.asset(
this.widget.data,
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.only(top: 15.0),
child: Text(
'${_sliderValue.round()}' + ' ITEMS',
style: TextStyle(color: Colors.white, fontSize: 15.0),
),
),
SliderTheme(
data: SliderTheme.of(context).copyWith(
thumbColor: Colors.white,
thumbShape: RoundSliderThumbShape(enabledThumbRadius: 10.0),
activeTrackColor: Color(0xff3ADEA7),
inactiveTrackColor: Colors.grey,
overlayColor: Colors.transparent,
trackHeight: 1.0),
child: Slider(
value: _sliderValue,
onChanged: _setValue,
min: 0.0,
max: 150.0,
divisions: 30,
),
),
],
),
color: Colors.transparent,
elevation: 0.0,
margin: EdgeInsets.all(10.0),
),
);
}
}