循环中特定元素的setState
setState for specific element in a loop
我在列表视图中有一个列表视图构建器和一个时间选择器,允许用户选择时间。但是,当我想更改 ex: index[1] 的时间时,它也更改了另一个索引元素(在本例中为 index[0]、index[2])。
如何仅更改循环中一个元素的状态,例如:index[1] 而不是循环中的所有元素?
代码:
ListView.builder(
shrinkWrap: true,
itemCount: item.length,
itemBuilder: (BuildContext context, int index) {
return Column(
children: [
GestureDetector(
onTap: () {
_selectTime(context, index);
},
)]),
_selectTime(BuildContext context, int index) async {
final TimeOfDay? timeOfDay = await showTimePicker(
context: context,
initialTime: selectedTime,
initialEntryMode: TimePickerEntryMode.dial,
);
if (timeOfDay != null && timeOfDay != selectedTime) {
if (index == index) {
setState(() {
selectedTime = timeOfDay;
});
}
}
}
_selectTime
方法是未来的,因此您需要等待选择数据,_selectTime
方法已经包含需要更新的index
。并定义 GestureDetector
child.
运行 dartPad。
List<TimeOfDay> item =
List.generate(4, (index) => const TimeOfDay(hour: 1, minute: 3));
....
Future<void> _selectTime(BuildContext context, int index) async {
final TimeOfDay? timeOfDay = await showTimePicker(
context: context,
initialTime: const TimeOfDay(hour: 3, minute: 3),
initialEntryMode: TimePickerEntryMode.dial,
);
if (timeOfDay != null) {
if (index == index) {
setState(() {
item[index] = timeOfDay;
});
}
}
}
.....
ListView.builder(
itemCount: item.length,
itemBuilder: (BuildContext context, int index) {
return Column(children: [
GestureDetector(
onTap: () async {
await _selectTime(context, index);
},
child: Text("date: ${item[index].toString()}"),
)
]);
},
),
我在列表视图中有一个列表视图构建器和一个时间选择器,允许用户选择时间。但是,当我想更改 ex: index[1] 的时间时,它也更改了另一个索引元素(在本例中为 index[0]、index[2])。 如何仅更改循环中一个元素的状态,例如:index[1] 而不是循环中的所有元素?
代码:
ListView.builder(
shrinkWrap: true,
itemCount: item.length,
itemBuilder: (BuildContext context, int index) {
return Column(
children: [
GestureDetector(
onTap: () {
_selectTime(context, index);
},
)]),
_selectTime(BuildContext context, int index) async {
final TimeOfDay? timeOfDay = await showTimePicker(
context: context,
initialTime: selectedTime,
initialEntryMode: TimePickerEntryMode.dial,
);
if (timeOfDay != null && timeOfDay != selectedTime) {
if (index == index) {
setState(() {
selectedTime = timeOfDay;
});
}
}
}
_selectTime
方法是未来的,因此您需要等待选择数据,_selectTime
方法已经包含需要更新的index
。并定义 GestureDetector
child.
运行 dartPad。
List<TimeOfDay> item =
List.generate(4, (index) => const TimeOfDay(hour: 1, minute: 3));
....
Future<void> _selectTime(BuildContext context, int index) async {
final TimeOfDay? timeOfDay = await showTimePicker(
context: context,
initialTime: const TimeOfDay(hour: 3, minute: 3),
initialEntryMode: TimePickerEntryMode.dial,
);
if (timeOfDay != null) {
if (index == index) {
setState(() {
item[index] = timeOfDay;
});
}
}
}
.....
ListView.builder(
itemCount: item.length,
itemBuilder: (BuildContext context, int index) {
return Column(children: [
GestureDetector(
onTap: () async {
await _selectTime(context, index);
},
child: Text("date: ${item[index].toString()}"),
)
]);
},
),