Использование блока и выпадающего меню в флаттере - PullRequest
1 голос
/ 13 мая 2019

Привет, я новичок во флаттере и прохожу курс по флаттеру, чтобы создать приложение для конвертации юнитов, чтобы попытаться изучить фреймворк.Я пытался создать приложение с помощью блока, но столкнулся с проблемой с моим выпадающим меню.Каждый раз, когда я меняю элемент в раскрывающемся списке, он возвращается к значению по умолчанию при фокусировке на поле ввода текста.Это похоже на дерево виджетов, которое я перестроил, фокусируясь на текстовом поле.Единицами по умолчанию являются сброс, потому что в моем конструкторе блока у меня есть метод установки единиц по умолчанию.Я в недоумении, куда бы я переместил свой метод единиц измерения по умолчанию, чтобы он не конфликтовал.Что я должен сделать в своем блоке, чтобы установить единицы по умолчанию только тогда, когда установлена ​​отдельная категория, и когда она впервые создается.

Я пытался использовать метод _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);
  }
}
...