Значение DropdownButton не обновляется после выбора значений из DropdownItems. Как обновить значение по умолчанию с selectedValue? - PullRequest
0 голосов
/ 04 января 2019
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 ]

0 голосов
/ 13 января 2019

Запуск 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 работает только для виджетов с отслеживанием состояния.

0 голосов
/ 04 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...