循环中特定元素的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()}"),
      )
    ]);
  },
),