Flutter:如何限制用户在Flutter中相应地选择项目

3bygqnnd  于 2022-11-17  发布在  Flutter
关注(0)|答案(1)|浏览(173)

我正在使用flutter_multi_select_items从JSON格式的项目数组中选择多个项目。它以前是工作的,但我想限制用户只能选择项目的顺序从右到左,而不是跳转到任何项目挑选下一个。例如,如果我有一个数组[1,2,3,4],我希望用户选择的顺序1->2->3->4,而不是像1->3->2->4等。
我的代码:

MultiSelectContainer(
    itemsPadding: const EdgeInsets.all(10),
    textStyles: const MultiSelectTextStyles(
    textStyle: TextStyle(fontFamily: 'Montserrat', 
     fontWeight:FontWeight.bold,)),
     showInListView: true,
     listViewSettings: ListViewSettings( scrollDirection: Axis.horizontal,
     separatorBuilder: (_, __) => const SizedBox(
      width: 10,)),
     items: List.generate(dataSchedule == null ? 0 : dataSchedule.length,
     (index) => MultiSelectCard(value: dataSchedule[index]['time_slot'], label: dataSchedule[index]['time_slot'],)),
onChange: (allSelectedItems, selectedItem) { })

下面是我的数组返回结果:

["16:00","17:00","18:00","19:00","20:00","21:00"]

我希望从16:00 to 17:00 to 18:00 to 19:00 to 20:00 to 21:00中选择
从上面的代码allSelectedItems是为一个数组的项目选择和selectedItem只是为一个单一的项目选择。如果有任何需要澄清的一部分,请让我知道,提前感谢。

u2nhd7ah

u2nhd7ah1#

所以我可以通过应用一些逻辑来解决这个问题。因为我不能在onchanged中得到index,所以我在value:中添加了索引,这样我就可以得到每个选择的索引值,然后我从值中删除了多余的值,只留下index值,然后得到上一个选择值和当前选择值。最后,我使用if语句检查当前选择减1是否等于前一个选择,否则它是正确的。我的最终代码如下:

MultiSelectContainer(
                                                    controller: controllerMultipleSelect,
                                                    itemsPadding: const EdgeInsets.all(10),
                                                   
                                                    showInListView: true,
                                                    listViewSettings: ListViewSettings(
                                                        scrollDirection: Axis.horizontal,
                                                        separatorBuilder: (_, __) => const SizedBox(
                                                          width: 10,
                                                        )),

                                                    items: List.generate(dataSchedule == null ? 0 : dataSchedule.length,
                                                            (index) => MultiSelectCard(
                                                              value: index.toString() +"-"+ dataSchedule[index]['time_slot'], label: dataSchedule[index]['time_slot'],)),
                                                    onChange: (allSelectedItems, selectedItem) {

                                                      if(allSelectedItems.length>1) {

                                                        var lst = allSelectedItems[allSelectedItems.length - 2];
            

                                                        var pos = lst.toString().lastIndexOf('-');

        String previousResult = (pos != -1)? lst.substring(0, pos): lst;
        var pos1 = selectedItem.toString().lastIndexOf('-');

        String currResult = (pos1 != -1)? selectedItem.substring(0, pos1): selectedItem;

                                                       if(int.parse(currResult)-1  == int.parse(previousResult)){
                                                         debugPrint("Correct order");
                                                       }else{

                                                         debugPrint("Incorrect order");

                                                       }

                                                      }

                                                    })

相关问题