#flutter #dart #flutter-web #flutter-navigation
Вопрос:
Я разработал веб-приложение flutter, которое использует веб-сайты. Есть кнопка, которая используется для возврата на целевую страницу веб-сайта, я использовал popUntil для достижения этой цели, которая хорошо работает, но я обнаружил, что если я отслеживаю вкладку «Сеть», все подключения к сокетам все еще открыты.
Я попытался переопределить dispose (), чтобы закрыть подключения к websocket, но затем обнаружил, что если я продолжу использовать веб-сайт, то у меня будет несколько экземпляров других страниц, открытых с разными подключениями к websocket.
Есть ли способ в flutter web по существу перейти на страницу и полностью уничтожить стек навигации и все представления/состояния? Даже просто возможность запустить перенаправление и обновить целевую страницу на той же вкладке (сбросить все) было бы здорово.
Ответ №1:
Вам нужно установить экземпляру сокета значение null, прежде чем покинуть страницу, на которой вы вызвали его экземпляр. Не только в методе dispose () (disposed вызывается, когда состояние страницы уничтожается) , но и перед маршрутизацией с этой страницы. Только тогда он не будет работать в фоновом режиме.
Комментарии:
1. Это все равно не работает. Проблема в том, что, когда я возвращаюсь на страницу после перехода с корневой страницы, кажется, что несколько экземпляров этой страницы открыты, открыто несколько экземпляров сокета. Поэтому, если я вернусь и повторю 5 раз, даже если я установлю все сокеты равными нулю, будет открыто 5 подключений к сокетам и отправка данных. Было бы намного проще, если бы я мог просто сбросить все приложение при навигации обратно в корневой каталог, как если бы кто-то нажал обновить. на вкладке
2. О, я понимаю, хотя это уже другой вопрос сам по себе. Для этого вам нужен одноэлементный класс. Вы не можете просто создать несколько экземпляров этих сокетов.
3. Спасибо за ответ. Легко ли «модифицировать» существующий виджет с отслеживанием состояния и сделать его одноэлементным? Я думал, что если вы не передавали уникальный ключ, то он всегда повторно использовал один и тот же виджет с отслеживанием состояния? (возможно, я неправильно понял, я новичок в Flutter)
4. Вы можете открыть отладчик средств разработки и посмотреть, сколько классов состояния существует на странице стека. Всякий
initState()
раз, когда вызывается класс, создается новый экземпляр этого виджета и помещается поверх этого стека. Вы можете подтвердить это, просто перенаправив несколько раз в один и тот же класс состояния и вернувшись, чтобы увидеть, что в стеке существуют разные экземпляры одного и того же класса состояния. Итак, если вы используете анимацию, потоки или сокет и т. Д., Это означает, что они вызываются каждый раз при инициализации нового класса состояния.