Запуск предыдущего состояния из resume() в Ionic2

У меня проблема с приложением ionic2. Ситуация такова, что когда приложение переходит на второй план, я сохраняю последнее состояние в локальном хранилище, когда приложение возобновляет его и проверяет, является ли значение lastState в локальном хранилище. Если оно имеет значение, то это состояние передается. Я получаю ошибку

ERROR Error: Uncaught (in promise): invalid link: <StateName>
at c (file:///android_asset/www/build/polyfills.js:3:13190)
at Object.reject (file:///android_asset/www/build/polyfills.js:3:12546)
at NavControllerBase._fireError (file:///android_asset/www/build/main.js:44942:16)
at NavControllerBase._failed (file:///android_asset/www/build/main.js:44930:14)
at file:///android_asset/www/build/main.js:44985:59
at t.invoke (file:///android_asset/www/build/polyfills.js:3:8971)
at Object.onInvoke (file:///android_asset/www/build/main.js:4407:37)
at t.invoke (file:///android_asset/www/build/polyfills.js:3:8911)
at r.run (file:///android_asset/www/build/polyfills.js:3:4140)
at file:///android_asset/www/build/polyfills.js:3:13731

Но приложение работает отлично. Может ли кто-нибудь сказать мне причину такого поведения?

Код app.component.ts

     this.platform.pause.subscribe(() => {
            console.log('[INFO] App Paused.');
            localStorage.setItem("lastState", this.nav.last().name);
     })

метод resume()

this.platform.resume.subscribe(() => {
            console.log('[INFO] App resumed);           
            if(null != localStorage.getItem("lastState") && localStorage.getItem("lastState") != undefined) {
                this.nav.push(localStorage.getItem("lastState"));
            }
        });

NB: я добавил все имя компонента в app.module.ts

1 ответ

Решение

В случае, если вы пытаетесь вставить строку вместо импортированного модуля со страницы, это будет работать только в том случае, если вы используете Lazy Loading в своих модулях. У вас есть 2 варианта:

  • Ленивая загрузка всех компонентов вашей страницы, чтобы вы могли использовать их в NavController в виде строки вместо имени импортированного модуля.
  • Импортируйте все свои страницы, создайте с ними объект и вызовите this.nav.push(this.yourCreatedObject[localStorage.getItem("lastState")]); чтобы получить доступ к параметру в вашем объекте, который имеет модуль (я даже не знаю, сработает ли это, но стоит попробовать, если вы не хотите терять время на ленивую загрузку).

И просто наблюдение:

Когда вы входите в состояние паузы, приложение останется на той странице, на которой оно находилось до приостановки, нет необходимости сохранять страницу, и они снова ее нажимают, когда пауза не попадает в корень или теряет стек навигации. И это может быть плохо для UX, так как вы будете на странице, а затем снова нажмите на ту же страницу. Так что не делайте этого.

PS: пропал ' в вашем console.log() на метод возобновления.

Надеюсь это поможет

РЕДАКТИРОВАТЬ

Поэтому, если вы хотите, чтобы приложение перезагружалось, вам не нужно нажимать на страницу, вам нужно перейти на корневую страницу вашего приложения, поэтому попробуйте this.nav.popToRoot(), Таким образом, вам не нужно сохранять состояние или переходить в режим отложенной загрузки.

РЕДАКТИРОВАТЬ 2

Итак, перезапуск через 15 минут потребует счетчика, и вы измените свою архитектуру на ленивую загрузку.

Вы можете сделать следующее

public timer: any;
public counter: number = 0; // add these 2 variable to the scope of your class in app.components

this.platform.pause.subscribe(() => {
  localStorage.setItem("lastState", this.nav.last().name);
  this.timer = setInterval(()=>{
    this.counter += 50;
  }, 50);
});

this.platform.resume.subscribe(() => {
  const lastState = localStorage.getItem("lastState"); //GET THE LATEST STATE, YOU'LL ALWAYS HAVE ONE BE CAUSE THE APP'LL ALWAYS PAUSE
  clearInterval(this.timer); // CLEAR THE INTERVAL
  if(this.counter < 900000) // IF IT'S UNDER NEEDED TIME. 900000 == 15 min
    this.nav.setRoot(lastState);
  else
    this.nav.popToRoot();
});

Это будет работать только в том случае, если приложение приостановлено, но не уничтожено, если вы хотите, чтобы такое же поведение было, если пользователь убил и перезапустил приложение, тогда у вас возникнет немного больше проблем, например, сравнение того, когда пользователь последний раз открывал приложение. и если до 15 минут.

Другие вопросы по тегам