Как сохранить экземпляр блока в дереве виджетов - PullRequest
1 голос
/ 28 мая 2019

Я использую InheritedWidget для предоставления класса блока дочерним компонентам. Однако каждый раз, когда дерево виджетов воссоздается, создается новый экземпляр класса блока. Поскольку я использую классы BehaviourSubject для хранения последних значений некоторых текстовых полей, я теряю текущие значения при каждом воссоздании. Как это можно решить, т. Е. Класс блока должен создаваться только один раз.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Это зависит от того, как был создан ваш провайдер, если это расширение StatefulWidget с InheritedWidget.

Если он распространяется только от InheritedWigdet, вы пропустите метод dispose, поскольку он не распространяется на StatefulBuilder, но никогда больше не будет создаваться, а метод dispose будет при закрытии приложения. Проверьте этот пример:

class Provider extends InheritedWidget {
  Provider({Key key, Widget child}) : super(key: key, child: child);

  final AppBloc bloc = AppBloc();

  static AppBloc of(BuildContext context) =>
      (context.inheritFromWidgetOfExactType(Provider) as Provider).bloc;

  @override
  bool updateShouldNotify(Provider oldWidget) => true;
}

Этот AppBloc является компонентом, в котором есть все блоки моего приложения.

Но если ваш провайдер расширяет StatefulWidget с InheritedWidget, вы можете передать свой блок в качестве параметра конструктора в нужный класс, и этот класс также должен быть Stateful, так что вы можете передать в initState и он будет восстановлен только при повторном доступе.

0 голосов
/ 28 мая 2019

Если вы используете StatefulWidget, то можете создать экземпляр блока в методе initState.

...