добавить отдельные значения в DropDownButton - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть виджет со строителем предметов. В конструкторе элементов я хочу создать раскрывающийся список для каждого элемента.

Для свойства value этого DropdownMenuItem я использую SaleRef _selectedRef;

Проблема в том, что когда я объявляю это SaleRef _selectedRef; внутри itemBuilder , значение не меняется после выбора элемента.

Когда я объявляю его вне этого виджета, но в классе он меняет значение каждого раскрывающегося списка

Что можно сделать, чтобы выбрать отдельные значения для каждого раскрывающегося списка?

Это код для создания предметов

ListView.separated(
                itemBuilder: (context, index) {
                  return Row(
                    children: <Widget>[                      
                      Container(
                        height: 40,
                        width: MediaQuery.of(context).size.width * 1 / 5,
                        decoration: BoxDecoration(
                          color: Colors.white,
                          borderRadius: new BorderRadius.circular(25.0),
                          border: Border.all(
                              color: Colors.grey,
                              style: BorderStyle.solid,
                              width: 0.80),
                        ),
                        child: DropdownButton<SaleRef>(
                          hint: Text("  Select Ref"),
                          value: _selectedRef,
                          onChanged: (SaleRef value) {
                            setState(() {
                              _selectedRef = value;
                              print(_selectedRef.refID);
                            });
                          },
                          items: _filteredSaleRef.map((SaleRef ref) {
                            return DropdownMenuItem<SaleRef>(
                              value: ref,
                              child: Row(
                                children: <Widget>[
                                  Text(
                                    "  " + ref.refName,
                                    style: TextStyle(color: Colors.black),
                                  ),
                                ],
                              ),
                            );
                          }).toList(),
                        ),
                      ),
                    ],
                  );
                },
                separatorBuilder: (context, index) {
                  return Divider(height: 16);
                },
                itemCount: filteredShopItem.length,
              )

Когда я объявляю это так

class _AssignRefPageState extends State<AssignRefPage>
    with  {

  SaleRef _selectedRef;

Это происходит после выбора значения

enter image description here

Когда я провозглашаю это так внутри конструктора, как это

itemBuilder: (context, index) {
                   SaleRef _selectedRef;
                  return Row(

Это то, что я получаю, это всегда подсказка, даже после того, как я выберу один

enter image description here

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Проблема в том, что вы используете одну и ту же переменную для каждой выпадающей кнопки, и когда вы пытаетесь объявить ее в ListView itemBuilder и вызываете setState, весь виджет создается, снова устанавливая его в ноль

Что вы можно создать список значений (размер должен соответствовать числу выпадающих кнопок)

Примерно так:

class _AssignRefPageState extends State<AssignRefPage>
    with  {

  List<SaleRef>_selectedRef = List.generate(numberOfDropDowns, (index) => SaleRef());

Затем использовать массив в вашем setState

DropdownButton<SaleRef>(
                          hint: Text("  Select Ref"),
                          value: _selectedRef,
                          onChanged: (SaleRef value) {
                            setState(() {
                              _selectedRef[index] = value;
                              print(_selectedRef[index].refID); //<- The index is from itemBuilder
                            });
                          }
0 голосов
/ 04 апреля 2020

Как сказал @ Josteve-Adekanbi, проблема была в том, что я использовал ту же переменную

Создание массива с размером вне класса помогло мне решить мою проблему

List<SaleRef> _selectedRef = new List(filteredShopItem.length);

Затем я использовал его как это

                         DropdownButton<SaleRef>(
                          hint: Text("  Select Ref"),
                          value: _selectedRef[index],
                          onChanged: (SaleRef value) {
                            setState(() {
                              _selectedRef[index] = value;
                              print(_selectedRef[index].refID);
                            });
                          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...