Как правильно создать экземпляр блока в didChangeDependencies?

Я пытаюсь использовать блочную архитектуру в приложении для преобразования единиц, которое я создал из курса Google Flutter udacity. Моя проблема связана с созданием экземпляра моего блока. Я следил за документацией и создал экземпляр своего блока из контекста, а также некоторых других свойств в методе 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. . Любая обратная связь приветствуется


person Renzo Olivares    schedule 20.06.2019    source источник


Ответы (1)


Не могли бы вы просто заключить инициализацию и 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);
  }
}
person Jordan Davies    schedule 20.06.2019
comment
откуда здесь context? - person Théo Champion; 27.08.2019
comment
@ ThéoChampion ознакомьтесь с этим сообщением - person galki; 15.11.2019