Привет, я новичок во флаттере и прохожу курс по флаттеру, чтобы создать приложение для конвертации юнитов, чтобы попытаться изучить фреймворк.Я пытался создать приложение с помощью блока, но столкнулся с проблемой с моим выпадающим меню.Каждый раз, когда я меняю элемент в раскрывающемся списке, он возвращается к значению по умолчанию при фокусировке на поле ввода текста.Это похоже на дерево виджетов, которое я перестроил, фокусируясь на текстовом поле.Единицами по умолчанию являются сброс, потому что в моем конструкторе блока у меня есть метод установки единиц по умолчанию.Я в недоумении, куда бы я переместил свой метод единиц измерения по умолчанию, чтобы он не конфликтовал.Что я должен сделать в своем блоке, чтобы установить единицы по умолчанию только тогда, когда установлена отдельная категория, и когда она впервые создается.
Я пытался использовать метод _currentCatController.stream.distinct, чтобы обновлять поток только при передаче отдельных данных, но, похоже, это тоже не сработало.Я пытался обернуть метод единиц измерения по умолчанию в различные условные выражения, которые не дали мне желаемого результата.
Вы можете найти весь источник здесь https://github.com/Renzo-Olivares/Units_Flutter
class _ConverterScreenState extends State<ConverterScreen> {
///function that creates dropdown widget
Widget _buildDropdown(
bool selectionType, ValueChanged<dynamic> changeFunction) {
print("build dropdown");
return Padding(
padding: const EdgeInsets.symmetric(vertical: 15.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.black, style: BorderStyle.solid),
borderRadius: BorderRadius.circular(4.0)),
child: DropdownButtonHideUnderline(
child: ButtonTheme(
alignedDropdown: true,
child: StreamBuilder<Unit>(
stream: _conversionBloc.inputUnit,
initialData: widget._category.units[0],
builder: (context, snapshotIn) {
return StreamBuilder<Unit>(
stream: _conversionBloc.outputUnit,
initialData: widget._category.units[1],
builder: (context, snapshotOut) {
return StreamBuilder<Category>(
stream: _conversionBloc.currentCategory,
initialData: widget._category,
builder: (context, snapshotDropdown) {
return DropdownButton(
items: snapshotDropdown.data.units
.map(_buildDropdownItem)
.toList(),
value: selectionType
? snapshotIn.data.name
: snapshotOut.data.name,
onChanged: changeFunction,
isExpanded: true,
hint: Text("Select Units",
style: TextStyle(
color: Colors.black,
)),
);
});
});
})),
),
),
);
}
}
class ConversionBloc {
//input
final _currentCatController = StreamController<Category>();
Sink<Category> get currentCat => _currentCatController.sink;
final _currentCatSubject = BehaviorSubject<Category>();
Stream<Category> get currentCategory => _currentCatSubject.stream;
ConversionBloc() {
print("conversion bloc");
//category
_currentCatController.stream.listen((category) {
print("setting category ${category.name}");
_category = category;
_currentCatSubject.sink.add(_category);
//units default
setDefaultUnits(_category);
});
}
void setDefaultUnits(Category category) {
print("setting default units for ${category.name}");
_inputUnits = category.units[0];
_outputUnits = category.units[1];
_inputUnitSubject.sink.add(_inputUnits);
_outputUnitSubject.add(_outputUnits);
}
}