Значение DropdownButton не обновляется после выбора значений из DropdownItems. Как обновить значение по умолчанию с selectedValue?

DropdownButton Value does not update even after selecting different items.

Если значение по умолчанию равно нулю, отображается сообщение об ошибке, и если я передаю любое значение по умолчанию (не ноль), оно никогда не изменяется на другие выбранные значения.

currentCategory устанавливается как значение по умолчанию для DropdownButton.

StreamBuilder<QuerySnapshot>(
                    stream: Firestore.instance
                        .collection('categories')
                        .snapshots(),
                    builder: (BuildContext context,
                        AsyncSnapshot<QuerySnapshot> snapshot) {
                      currentCategory = snapshot.data.documents[0];
                      return DropdownButtonHideUnderline(
                        child:
                            new DropdownButtonFormField<DocumentSnapshot>(
                          value: currentCategory,
                          onChanged: (DocumentSnapshot newValue) {
                            setState(() {
                              currentCategory = newValue;
                            });
                            print(currentCategory.data['name']);
                          },
                          onSaved: (DocumentSnapshot newValue) {
                            setState(() {
                              currentCategory = newValue;
                            });
                          },
                          items: snapshot.data.documents
                              .map((DocumentSnapshot document) {
                            return new DropdownMenuItem<DocumentSnapshot>(
                              value: document,
                              child: Text(
                                document.data['name'],
                              ),
                            );
                          }).toList(),
                        ),
                      );
                    }),

помогите мне решить эту проблему. Заранее спасибо.

2 ответа

Запуск setState запланирует новую сборку (build метод всегда вызывается после получения вызова setState).

Поэтому я предлагаю вам переместить запрос за пределы виджета и инициализировать поток в initState утверждение, чтобы оно не вычислялось каждый раз при изменении состояния (если оно вам действительно не нужно).

Также переместите currentCategory вне виджета build метод.

Примерно так должно работать:

class YourClass extends StatefulWidget {
  ...
}

class _YourClassState extends State<YourClass> {

  Stream<QuerySnapshot> _categories;
  DocumentSnapshot _currentCategory;

  initState() {
    _categories = Firestore.instance.collection('categories').snapshots();
    return super.initState();
  }

  Widget build(BuildContext context) {
    return Container(
      child: StreamBuilder<QuerySnapshot>(
        stream: _categories,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          return DropdownButtonHideUnderline(
            child: new DropdownButtonFormField<DocumentSnapshot>(
              value: _currentCategory,
              onChanged: (DocumentSnapshot newValue) {
                setState(() {
                  _currentCategory = newValue;
                });
              }
            )
          )
        }
      )
    );
  }

}

Также обратите внимание, что setState работают только для виджетов с состоянием.

Это потому, что каждый раз, когда вы делаете setState хотя currentCategory изменилось, оно восстановит ваше дерево и пройдет currentCategory = snapshot.data.documents[0]; снова, давая вам идею, которая не устанавливается.

Заменить его на if(currentCategory == null) currentCategory = snapshot.data.documents[0]; поэтому он будет установлен только при соблюдении этого условия.

Другие вопросы по тегам