После некоторых исследований я нашел способ. Я не уверен, единственный или лучший способ, или способ, предусмотренный создателем провайдера, однако он работает.
Идея состоит в том, чтобы сохранить вспомогательный поток внутри моего класса Store (я имею в виду бизнес- logi c, предоставленный поставщиком), и подписаться на его изменения в моем виджете.
Итак, в моем классе Store у меня есть:
final _eventStream = StreamController.broadcast();
Stream get eventStream => _eventStream.stream;
void dispose() {
_eventStream.close();
super.dispose();
}
Я добавляю события в этот поток внутри действий:
void navigateToNextScreen() {
_eventStream.sink.add('nav');
}
void openDialog() {
_eventStream.sink.add('dialog');
}
В моем виджете пользовательского интерфейса:
@override
void afterFirstLayout(BuildContext context) {
context.read<Transactions>().eventStream.listen((event) {
if (event == 'nav') {
Navigator.push(
context,
MaterialPageRoute(
builder: (ctx) => SecondScreen(),
),
);
} else if (event == 'dialog') {
showDialog(
context: context,
builder: (context) => AlertDialog(content: Text("Meow")));
}
});
}
Я использовал здесь метод жизненного цикла afterFirstLayout
из пакета after_layout
, который является просто оболочкой для WidgetsBinding.instance.addPostFrameCallback
07.07.20 UPD .: Только что нашел пакет, который можно использовать для реакции на события: https://pub.dev/packages/event_bus
Он в основном использует тот же подход с StreamController под капотом.