Flutter (web) - как да презаредите Flutter PWA

Това е подобен въпрос (с грешно заглавие): 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/


person Radek    schedule 26.05.2020    source източник
comment
› За съжаление импортирайте 'dart:html' като html; вече не е разрешено, когато имате една и съща кодова база за уеб и мобилни собствени приложения. Така че следният код не е опцията: все още можете да го използвате, като добавите условие към вашия оператор за импортиране на dart и импортирате един или друг файл за изпълнение на dart: ~~~ import 'impl/impl_nonweb.dart' if (dart.library.html) ' impl/impl_web.dart'; ~~~   -  person Dmitri Livotov    schedule 10.06.2021


Отговори (2)


Заобиколно решение би било да навигирате до маршрута на входната точка на вашето приложение '/'

`Navigator.of(context).pushNamedAndRemoveUntil(
              '/,
              (Route<dynamic> route) => false
            );`
person griffins    schedule 26.05.2020
comment
Току-що тествах това и не води до мрежова активност в инструментите за разработка на Chrome. - person Radek; 29.05.2020

PWA ще се актуализира, след като уеб страницата/браузърът се затвори и отвори отново!

person Bharathraj Elangovan    schedule 26.05.2020
comment
За съжаление не. Тествах това с Chrome на настолен компютър и Brave на мобилно устройство. Дори когато изпращате заглавки с: cache-control = max-age=0,no-cache,no-store, must-revalidate'''' - person Radek; 27.05.2020
comment
Проблемът с PWA на мобилни устройства е, че изглежда, че е затворен, когато потребителят превключи към дома или някое друго приложение. Докато е настроен само на фон. Следователно новият сервизен работник на PWA все още е в състояние на изчакване, докато PWA не бъде убит. - person Radek; 14.06.2020