Это аналогичный вопрос (с неправильным названием): Flutter Web - Как перезагрузить текущую активную страницу
Запуск веб-приложения Flutter как PWA Мне нужно разрешить пользователям запускать refre sh и, таким образом, обновите (веб-приложение).
К сожалению, import 'dart:html' as html;
больше не разрешено при наличии одинаковой кодовой базы для веб-приложений и нативных мобильных приложений. Таким образом, следующий код не подходит:
RaisedButton(
child: Text("Update me"),
onPressed: () {
if (kIsWeb) html.window.location.reload();
},
),
Каков правильный подход?
РЕДАКТИРОВАТЬ: мне удалось использовать 'dart: js' в той же кодовой базе для pwa и мобильный с использованием условного импорта. Это означает, что я могу вызвать JavaScript из кода Flutter. К сожалению, location.reload(true);
не перезагружает PWA.
В идеале у меня был бы подход Flutter для перезагрузки / обновления PWA или JavaScript обходной путь.
EDIT2: Вся проблема заключается в обработке PWA перезагрузки кнопки / окна refre sh .
К сожалению, skipWaiting () сервис-воркера может быть вызван только из сервис-воркера (https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#skip_the_waiting_phase)
Правильный подход к отправке сообщения skipWaiting на новый экземпляр сервис-воркера.
Однако skipWaiting еще не полностью поддерживается в некоторых браузерах (iOS?), Поэтому более безопасный подход сводится к тому, чтобы просто отменить регистрацию рабочего ...
В итоге я использовал следующее, чтобы остановить worker и перезагрузить.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistration().then(swr => {swr.unregister().then(
() => {location.reload(true)}
)});
} else {location.reload(true)}
Связано:
Пропуск работника службы доступа Ожидание изнутри сборки приложения с помощью Webpack + Workbox
https://medium.com/@nekrtemplar / самоуничтожение-serviceworker-73d62921d717
https://redfin.engineering/how-to-fix-the-refresh-button-when-using-service-workers-a8e27af6df68
https://deanhume.com/displaying-a-new-version-available-progressive-web-app/