showAlertDialog() вызывается N раз.
То есть количество отображаемых диалоговых окон пропорционально количеству перезаходов на экран. При первом заходе отображается 1 диалог, при втором - 2, и так далее.
Я предполагаю, что при каждом перезаходе на экран, на AsyncValue ставится ещё один листенер.
Если это так, то нужно как-то удалить старый листенер при покидании экрана.
Как это можно реализовать?
Вот мой код:
// tags_screen.dart
@override
Widget build(BuildContext context) {
var state = ref.watch(tagsProvider);
ref.listen<AsyncValue>(
tagsProvider,
(_, state) {
if (!state.isRefreshing && state.hasError) {
showAlertDialog(context: context, message: state.error.toString()); // Вызывается N раз
}
},
);
return Scaffold(
...
я юзаю риверпод постоянно) это скорей всего autodispose не стоит в провайдере
Ты в билд методе создаёшь его
я использую AutoDisposeAsyncNotifier, если верить названию, то стоит
не это норма для риверпод так и делается
Полный код провайдера на сервис скинь так непоянтно
https://pastebin.com/rJ6xAeUb
незнаю откуда откапал такой) ни разу не пользовался AutoDisposeAsyncNotifierProvider
это типа замена StateNotifier<AsyncValue<...>>, как я понял
я тоже его юзал , с ним вообще проблематично. AsyncValue вообще не юзать лучше. задача какая в асинке просто проверить если ошибка и вывести showsnack если есть?
да, если ошибка, то вывести диалоговое окно. и ещё состояние загрузки реализовать
состояний много , если на ривеподе хочешь делать я так последнее время делаю по аналогии с Bloc состояния делаю loading loaded erro туда же можно событие скинуть на показ ошибки иначе сложно читаемая ерунда будет либо сразу на кубит
я тут прочитал, то что autoDispose не работает, если используется ref.watch(provider)
работает это я проверял не раз
когда в билдер ref.watch(provider) начинается вопроизвадтся он как раз таки и сбрасывается если autodipose стоит
Обсуждают сегодня