Код возврата аппаратной кнопки не отвечает правильно

<Page actionBarHidden="true" @loaded="pageLoaded" @unloaded="pageUnloaded">
        <DockLayout>
            <DockLayout v-show="search">
               ...
            </DockLayout>
            <DockLayout class="routeDetails" v-show="!search">
               ...
            </DockLayout>
         </DockLayout>
</Page>

           pageLoaded: function () {
                // We only want to register the event in Android
                if (application.android) {
                    console.log("halllo");
                    application.android.on(application.AndroidApplication.activityBackPressedEvent, this.backEvent);
                }
            },
            pageUnloaded: function () {
                // We only want to un-register the event on Android
                if (application.android) {
                    console.log("done");
                    application.android.off(application.AndroidApplication.activityBackPressedEvent, this.backEvent);
                }
            },
            backEvent: function (args) {
                console.log("hey I pressed");
                if (this.search) {
                    args.cancel = true;
                    this.search = false;
                } else {
                    args.cancel = false;
                }
            }

search является стандартным false.

Проблема

Это когда я нахожусь на show просмотре, где search = true. Я хочу снова нажать аппаратную кнопку Android. Он должен быть скрыт и показать другой, где search = false. Но это происходит только после того, как я нажимаю аппаратную кнопку Android 2 раза подряд.

Но когда я нахожусь в представлении, где search = false, он регистрирует console.log после первого нажатия аппаратной кнопки Android.

Код, который я нашел в этом сообщении в блоге. упоминается в этом выпуске Github

Обновлять

Nativescript-Vue Playground

Итак, что вам нужно сделать, это нажать на одну из кнопок на экране. Затем используйте аппаратную кнопку, чтобы вернуться. В этом примере он сделает это напрямую. Но когда вы попытаетесь сделать это во второй раз, вам нужно будет дважды нажать аппаратную кнопку, прежде чем она сработает. В моем случае мне всегда нужно нажимать 2 раза, прежде чем это сработает.


person Steven    schedule 14.09.2019    source источник


Ответы (2)


Вам не хватает контекста, попробуйте

application.android.on(application.AndroidApplication.activityBackPressedEvent, this.backEvent, this);

Передача this в качестве третьего параметра гарантирует, что this в методе backEvent указывает на компонент Vue.

person Manoj    schedule 14.09.2019
comment
Я пробовал, но без разницы. Журналы исчезают только после того, как я нажму аппаратную кнопку 2 раза. - person Steven; 15.09.2019
comment
Можете ли вы поделиться образцом игровой площадки, где воспроизводится проблема. - person Manoj; 15.09.2019
comment
Скоро сделаю! - person Steven; 17.09.2019
comment
Извините за поздний ответ. У меня есть пример детской площадки. Это не совсем то же самое. См. Объяснение - person Steven; 20.09.2019

У вас есть несколько активных слушателей на activityBackPressedEvent?

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

application.android.off(application.AndroidApplication.activityBackPressedEvent);
person Culita Bogdan    schedule 17.09.2019
comment
Извините, не сработало. У меня есть только прослушиватели событий, которые я показываю в задаче. В противном случае нет. - person Steven; 20.09.2019
comment
Я проверил ваш общий код, и он работает должным образом. Единственный раз, когда вам нужно дважды нажать назад, - это когда вы сосредоточены на вводе поиска и клавиатуре, на которой он открыт. Это нормальное поведение. Верно? - person Culita Bogdan; 20.09.2019