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