CupertinoPicker не может вернуть текст из выбранного значения

Я ожидаю, что текстовое поле будет отображать A / B / и т. Д. При выборе, однако оно возвращает только индекс 0/1/2 / …, почему ???

полный код виджета ниже:

ОБНОВЛЕНО:

  int selectedValue;

  Future showPicker() async {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return CupertinoPicker(
            backgroundColor: Colors.white,
            scrollController: FixedExtentScrollController(initialItem: 3),
            onSelectedItemChanged: (value) {
              setState(() {
                if (value != null) {
                  selectedValue = listTextValues[value];
                  regionController.value = TextEditingValue(text: selectedValue.toString());
                }
              });
            },
            itemExtent: 32.0,
            children: const listTextValues = [
              Text('Eastern'),
              Text('South'),
              Text('West'),
              Text('North'),
              Text('Island'),
            ],
          );
        }
        );

  }

Код ниже работает, просто задайтесь вопросом, как упростить код, поскольку я использую 2 списка, один для средства выбора и один для сопоставления индекса.

Решение:

    int selectedValue;
  final List<String> listTextValues = ['Eastern', 'South', 'West', 'North', 'Island'];

  Future showPicker() async {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return CupertinoPicker(
            backgroundColor: Colors.white,
            scrollController: FixedExtentScrollController(initialItem: 3),
            onSelectedItemChanged: (value) {
              setState(() {
                if (value != null) {
                  selectedValue = value;
                  regionController.value = TextEditingValue(text: listTextValues[selectedValue].toString());
                }
              });
            },
            itemExtent: 32.0,
            children: const [
              Text('Eastern'),
              Text('South'),
              Text('West'),
              Text('North'),
              Text('Island'),
            ],
          );
        }
        );

  }

См. также:  MySQL ORDER BY FIELD на месяцы
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. icantcode

    В методе onSelectedItemChanged: (value) значением является выбранный индекс.
    Вы должны сохранить свой список букв в переменной в вашем виджете.

    const listTextValues = [
          Text('A'),
          Text('B'),
          Text('C'),
          Text('D'),
          Text('E'),
        ];
    

    и получить элемент по выбранному индексу в реализации onSelectedItemChanged

    selectedValue = listTextValues[value];
    

    Изменить

    Окончательный результат должен выглядеть следующим образом

    int selectedValue;
    final List<Widget> listTextValues = [
                  Text('Eastern'),
                  Text('South'),
                  Text('West'),
                  Text('North'),
                  Text('Island'),
                ];
    
      Future showPicker() async {
        showModalBottomSheet(
            context: context,
            builder: (BuildContext context) {
              return CupertinoPicker(
                backgroundColor: Colors.white,
                scrollController: FixedExtentScrollController(initialItem: 3),
                onSelectedItemChanged: (value) {
                  setState(() {
                    if (value != null) {
                      selectedValue = listTextValues[value];
                      regionController.value = TextEditingValue(text: selectedValue.toString());
                    }
                  });
                },
                itemExtent: 32.0,
                children: listTextValues,
              );
            }
            );
    
      }
    

    теперь у меня другая ошибка: отсутствует селектор, такой как ‘.identifier’ или ‘[0]’. person icantcode; 04.04.2021

    Не могли бы вы отредактировать свой ответ, показывая вашу новую реализацию? person icantcode; 04.04.2021

    обновил код выше person icantcode; 04.04.2021

    @icantcode обновил ответ, чтобы помочь вам понять, как решить вашу проблему :) person icantcode; 04.04.2021

    Ошибка: только статические поля могут быть объявлены как const. Попробуйте использовать final вместо const или добавить ключевое слово static. const List ‹Widget› listTextValues ​​= [^^^^^ Ошибка: значение типа Widget не может быть присвоено переменной типа int. person icantcode; 04.04.2021

    Ваша ошибка здесь довольно очевидна, просто замените ключевое слово const на final. Дело в том, что вам нужно извлечь свой список текстовых виджетов (или оправдать свой список строк, что было бы чище) за пределами вашего дерева виджетов, чтобы ваш метод обратного вызова onSelectedItemChanged мог получить доступ к этому списку person icantcode; 04.04.2021

    спасибо, я обновил финальную версию выше. person icantcode; 04.04.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: