Изменение MainPage приложения Maui прерывает обратный вызов OnBackPressedDispatcher ⇐ C#
-
Anonymous
Изменение MainPage приложения Maui прерывает обратный вызов OnBackPressedDispatcher
Я обновил свое приложение на Мауи, чтобы оно использовало .net8 и было нацелено на Android 13. При этом я пытаюсь удалить устаревший base.OnBackPressed();, но столкнулся с проблемой.
Старая логика:
// MainActivity.cs публичное переопределение void OnBackPressed() { если (someCondition() == true) { HandleBackPressMyself(); } еще { base.OnBackPressed(); } } Я запускаю свою страницу следующим образом:
// App.xaml.cs общедоступное приложение() { ИнициализироватьКомпонент(); Начинать(); } частный асинхронный недействительный Start() { страница вар = serviceProvider.GetRequiredService(); Application.Current?.Dispatcher.Dispatch(async () => { ((App)Application.Current).MainPage = страница; ждать Task.Delay(1); }; } Это довольно просто и всегда работало. Теперь я пытаюсь использовать OnBackPressedDispatcher следующим образом:
// MainActivity.cs защищенное переопределение void OnCreate (Bundle saveInstanceState) { base.OnCreate(saveInstanceState); OnBackPressedDispatcher.AddCallback(это, новый BackPressedCallback(это)); } // BackPressedCallback.cs открытый класс BackPressedCallback: OnBackPressedCallback { частная активность только для чтения; public BackPressedCallback (активность): база (истина) { this.activity = активность; } публичное переопределение void HandleOnBackPressed() { если (someCondition() == true) { HandleBackPressMyself(); } еще { вар mainPage = ((App)Microsoft.Maui.Controls.Application.Current)?.MainPage; mainPage.SendBackButtonPressed(); } } } Все это работает хорошо, пока я помещаю новые страницы в стек, используя await NavigationPage.PushAsync(newPage);.
Однако есть несколько сценариев, в которых я хочу удалить MainPage и заменить ее совершенно новой страницей, например:
((App)Application.Current).MainPage = страница входа;
Как только я это сделаю, HandleOnBackPressed() в BackPressedCallback перестанет срабатывать, и вся моя обратная навигация полностью перестанет работать.
Может ли кто-нибудь дать представление о том, почему обратный обработчик перестает работать после того, как я установил Application.Current.MainPage = someNewPage?
Спасибо!
*** ОБНОВЛЕНИЕ ***
Я добавил сюда демо-версию проблемы на GitHub, которую можно скачать и поиграть с ней:
https://github.com/mikeluken/MauiSample
Я обновил свое приложение на Мауи, чтобы оно использовало .net8 и было нацелено на Android 13. При этом я пытаюсь удалить устаревший base.OnBackPressed();, но столкнулся с проблемой.
Старая логика:
// MainActivity.cs публичное переопределение void OnBackPressed() { если (someCondition() == true) { HandleBackPressMyself(); } еще { base.OnBackPressed(); } } Я запускаю свою страницу следующим образом:
// App.xaml.cs общедоступное приложение() { ИнициализироватьКомпонент(); Начинать(); } частный асинхронный недействительный Start() { страница вар = serviceProvider.GetRequiredService(); Application.Current?.Dispatcher.Dispatch(async () => { ((App)Application.Current).MainPage = страница; ждать Task.Delay(1); }; } Это довольно просто и всегда работало. Теперь я пытаюсь использовать OnBackPressedDispatcher следующим образом:
// MainActivity.cs защищенное переопределение void OnCreate (Bundle saveInstanceState) { base.OnCreate(saveInstanceState); OnBackPressedDispatcher.AddCallback(это, новый BackPressedCallback(это)); } // BackPressedCallback.cs открытый класс BackPressedCallback: OnBackPressedCallback { частная активность только для чтения; public BackPressedCallback (активность): база (истина) { this.activity = активность; } публичное переопределение void HandleOnBackPressed() { если (someCondition() == true) { HandleBackPressMyself(); } еще { вар mainPage = ((App)Microsoft.Maui.Controls.Application.Current)?.MainPage; mainPage.SendBackButtonPressed(); } } } Все это работает хорошо, пока я помещаю новые страницы в стек, используя await NavigationPage.PushAsync(newPage);.
Однако есть несколько сценариев, в которых я хочу удалить MainPage и заменить ее совершенно новой страницей, например:
((App)Application.Current).MainPage = страница входа;
Как только я это сделаю, HandleOnBackPressed() в BackPressedCallback перестанет срабатывать, и вся моя обратная навигация полностью перестанет работать.
Может ли кто-нибудь дать представление о том, почему обратный обработчик перестает работать после того, как я установил Application.Current.MainPage = someNewPage?
Спасибо!
*** ОБНОВЛЕНИЕ ***
Я добавил сюда демо-версию проблемы на GitHub, которую можно скачать и поиграть с ней:
https://github.com/mikeluken/MauiSample
Мобильная версия