Това е подобен въпрос (с грешно заглавие): Flutter Web - Как да презареди текущата активна страница
Изпълнявайки уеб приложението Flutter като PWA, трябва да позволя на потребителите да инициират опресняване и по този начин да актуализират (уеб) приложението.
За съжаление import 'dart:html' as html;
вече не е разрешен, когато имате една и съща кодова база за уеб и мобилни собствени приложения. Така че следният код не е опцията:
RaisedButton(
child: Text("Update me"),
onPressed: () {
if (kIsWeb) html.window.location.reload();
},
),
Какъв е правилният подход?
РЕДАКТИРАНЕ: Успях да използвам „dart:js“ в същата кодова база за pwa и mobile, използвайки условни импорти. Това означава, че мога да извикам JavaScript от кода на Flutter. За съжаление location.reload(true);
не презарежда PWA.
В идеалния случай бих използвал подхода на Flutter за PWA презареждане/актуализация или заобиколно решение на JavaScript.
РЕДАКТИРАНЕ 2: Целият проблем е в обработката на PWA за бутон за опресняване / презареждане на прозорец.
За съжаление skipWaiting() на service worker може да се извика само от service worker ( https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#skip_the_waiting_phase )
Правилният подход е изпращането на съобщението skipWaiting до новото копие на услугата.
Въпреки това skipWaiting все още не се поддържа напълно в някои браузъри (iOS?), така че по-безопасният подход изглежда просто отписване на работника...
В крайна сметка използвах следното, за да спра работника и да презаредя.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistration().then(swr => {swr.unregister().then(
() => {location.reload(true)}
)});
} else {location.reload(true)}
Свързани:
Access service worker skipWaiting from within App build with Webpack+Workbox
https://medium.com/@nekrtemplar/self-destroying-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/