Управление побочными эффектами, когда onDisappear SwiftUI не вызывается немедленно из-за анимации перехода страниц
У меня есть теоретический вопрос о SwiftUI, времени выполнения метода onDisappear() и переходах между представлениями.
Допустим, у вас есть такая настройка навигации:
enum ScreenToShow {
case main, editting, settings
}
@Observable
class NavigationController {
var screen: ScreenToShow = .main
}
Затем в режиме просмотра контента мы переключаемся между экранами следующим образом:
@Environment(NavigationController.self) var navController
var body: some View {
switch navController.screen { ... }
}
Поэтому, когда мы хотим переключить экраны, мы просто устанавливаем для navContrller.screen новое значение.
Допустим, наш экран редактирования содержит виджет записи, с помощью которого пользователи могут записывать голосовые заметки. Этот виджет может находиться в состоянии записи, когда пользователь нажимает «назад» на экране редактирования, и в этом случае мы, очевидно, хотим остановить запись.
Итак, мы добавляем Recorder.stop() в метод onDisappear представления виджета записи.
Это работает, как и ожидалось... но затем мы решили, что хотим использовать скользящий анимационный переход между главным экраном и экраном редактирования, поэтому делаем следующее:
extension AnyTransition {
static var backslide: AnyTransition {
AnyTransition.asymmetric(
insertion: .move(edge: .trailing),
removal: .move(edge: .trailing))}
}
И в нашей «логике переключения навигации» в представлении контента мы меняем
case .editting:
EditScreen(memo: memoToEdit!)
к:
case .editting:
EditScreen(memo: memoToEdit!).transition(.backslide)
Похоже, что это также работает так, как и ожидалось, однако, как могли ожидать знающие из вас (и, следовательно, почему запросы на «дополнительный код» дезинформируются), метод onDisappear виджета записи (содержащийся на экране редактирования) не вызывается немедленно ни при каких обстоятельствах. больше, когда пользователь нажимает кнопку «Назад» на экране редактирования. Теперь он вызывается только после завершения анимации перехода.
Это проблематично, потому что:
- Экран редактирования можно закрыть, и пока скользящий переход обратно к главному экрану все еще происходит (не завершен и все еще «уходит»), к экрану редактирования можно снова перейти, и произойдет обратный переход. представление будет использоваться повторно (независимо от того, редактируем ли мы другой элемент или нет), и onDisappear никогда не будет вызываться.
Мне хочется придумать, как «сообщить» виджету записи: «Вашего родителя увольняют!» когда пользователь отвечает... возможно, с привязкой... но я боюсь, что открываю банку спагетти-червей с любыми обходными путями.
Кто-нибудь знаком с этой проблемой и есть ли способ переосмыслить ее с помощью более встроенного решения?