Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fragment Result Bug #37

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

omaeewa
Copy link

@omaeewa omaeewa commented Aug 23, 2024

Когда показывается диалоговое окно об успешной авторизации, и в этот момент изменяется конфигурация устройства, кнопка "Продолжить" становится некликабельной.

video_2024-08-23_13-31-14.mp4

Что происходит в приложении:

У нас есть такой стек: LoginF -> TemplateDialogF. Когда мы находимся в LoginF (VerificationControllerOnFlowF), мы регистрируем колбек на результат в функции registerForTemplateDialogNavResult, которая берет currentBackStackEntry как текущий элемент в стеке.

inline fun <T : Any> Fragment.registerForNavigationResult(
    key: String,
    crossinline resultEvent: (T) -> Unit
) {
    findNavController()
        .currentBackStackEntry //<----- Вот этот хулиган
        ?.savedStateHandle
        ?.getLiveData<T>(key)
        ?.observe(viewLifecycleOwner) {
            validateClassType(it)
            resultEvent.invoke(it)
        }
}

Затем мы переходим на TemplateDialogF. На этом этапе все работает хорошо. Однако при смене конфигурации LoginF снова регистрирует колбек, но на этот раз currentBackStackEntry — это наш TemplateDialogF, так как он является последним в стеке. После этого, когда мы нажимаем кнопку "Далее", результат передается в previousBackStackEntry(LoginF), но безуспешно ведь новый колбек зарегистрирован в currentBackStackEntry, то есть в TemplateDialogF, поскольку колбек был перерегистрирован при смене конфигурации. Таким образом, наш предыдущий фрагмент не сможет получить результат.

Чтобы решить этот конфликт, нужно обеспечить, чтобы колбек не регистрировался заново. Однако для реализации этого решения пришлось бы писать костыли, чего делать не хотелось бы. По крайней мере, мне в голову приходят только такие решения. Вместо этого я решил заменить кастомную реализацию на стандартную, а именно использовать setFragmentResultListener и setFragmentResult, которые работают довольно хорошо. Таким образом, удалось пофиксить баг.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant