Как правильно создать экземпляр блока в didChangeDependencies? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь использовать блочную архитектуру в приложении для конвертации единиц, которое я создал из курса gdter.Моя проблема в том, чтобы создать экземпляр моего блока.Я следовал за документацией и создавал свой блок из контекста, а также некоторые другие свойства в методе didChangeDependencies.В didChangeDependencies я установил единицы измерения по умолчанию для блока.Это работает, пока я не сконцентрируюсь на поле ввода текста, заставляя дерево виджета обновляться.Когда это случается, didChangeDependencies запускается снова, восстанавливает единицы измерения по умолчанию.Это не позволяет мне использовать какие-либо преобразования, кроме значений по умолчанию, потому что didChangeDependencies сбрасывает единицы измерения каждый раз, когда он вызывается.

Я пытался создать экземпляр блока в состоянии инициализации, но это не разрешено, поскольку он наследуетсявиджет.

class _ConverterScreenState extends State<ConverterScreen> {
  ConversionBloc _conversionBloc;

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    print("change dependencies ran");
    super.didChangeDependencies();
    _conversionBloc = ConversionProvider.of(context);
    _conversionBloc.setDefaultUnits(widget._category);
  }

  @override
  Widget build(BuildContext context) {
    print("converter screen - build widget");
    // TODO: implement build
    _conversionBloc.currentCat.add(widget._category);
       return Scaffold(
         body: _buildConverterScreen(MediaQuery.of(context).orientation));
  }
}

class ConversionBloc {
  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);
  }
}

Я ожидаю изменить единицы ввода / вывода на желаемое значение, и значение не сбрасывается, когда поле textinput сфокусировано или вызывается didChangeDependencies.В настоящее время я изменяю единицы на желаемое значение, затем меняю фокус на поле ввода текста, затем единицы сбрасывается на значение по умолчанию, но это неправильно, единицы должны оставаться на выбранном значении и не сбрасываться.Полный исходный код моего проекта здесь https://github.com/Renzo-Olivares/Units_Flutter.Любые отзывы приветствуются

1 Ответ

1 голос
/ 20 июня 2019

Не могли бы вы просто обернуть инициализацию и setDefaultUnits вызвать if?

@override
void didChangeDependencies() {
  // TODO: implement didChangeDependencies
  print("change dependencies ran");
  super.didChangeDependencies();
  if (_conversionBloc == null) {
    _conversionBloc = ConversionProvider.of(context);
    _conversionBloc.setDefaultUnits(widget._category);
  }
}
...