Как говорит Дари sh, Widget
, который удерживает состояние, должен быть Родителем, в данном случае Flutter Example
. Он должен обеспечить ListTileItem
функциями, которые изменяют состояние переменных.
Я быстро изменил ваш код. Вы можете попробовать его на DartPad
Фрагмент:
class FlutterExample extends StatefulWidget {
@override
_FlutterExampleState createState() => _FlutterExampleState();
}
class _FlutterExampleState extends State<FlutterExample> {
int total = 0;
List<int> individualCount = [];
List<String> individualTitle = [];
@override
void initState() {
List.generate(5, (i) {
individualCount.add(0);
individualTitle.add('item ${i + 1}');
});
super.initState();
}
void increment(int index) {
setState(() {
individualCount[index]++;
total++;
});
}
void decrement(int index) {
setState(() {
individualCount[index]--;
total--;
});
}
@override
Widget build(BuildContext context) {
return Container(
width: 120,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text('total: $total', style: TextStyle(fontSize: 24)),
SizedBox(height: 24),
Expanded(
child: ListView.builder(
itemCount: individualCount.length,
itemBuilder: (context, index) {
return ListTileItem(
title: individualTitle[index],
count: individualCount[index],
decrement: () => decrement(index),
increment: () => increment(index),
);
},
),
),
],
),
);
}
}
class ListTileItem extends StatelessWidget {
final String title;
final int count;
final Function decrement;
final Function increment;
ListTileItem({this.title, this.count, this.decrement, this.increment});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('$title'),
Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.remove),
onPressed: decrement,
),
Text('$count'),
IconButton(
icon: Icon(Icons.add),
onPressed: increment,
)
],
),
],
);
}
}