Size: a a a

Cicerone Chat (RUS)

2020 November 02

PK

Paul Kugaev in Cicerone Chat (RUS)
Aleksei B.
например, mainRouter.back()
Вооооот
источник

PK

Paul Kugaev in Cicerone Chat (RUS)
Касательно этого момента
источник

PK

Paul Kugaev in Cicerone Chat (RUS)
Изначально вопрос звучал "как связать между собой разные роутеры". Исходя из такой логики получается, что навигатор должен знать о всех роутерах?
источник

AB

Aleksei B. in Cicerone Chat (RUS)
как связать это уже вопрос конкретной реализации приложения
источник

AB

Aleksei B. in Cicerone Chat (RUS)
в каждом случае все будет по-разному
источник

AB

Aleksei B. in Cicerone Chat (RUS)
по хорошему Navigator вообще не должен ничего знать о роутерах, это разные вещи
но чтобы вручную не проверять back stack у фрагмент менеджера можно схитрить и довериться activityBack(), который вызывается только когда надо закрыть активити
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
роутер не должен знать ничего про то, как реализована навигация.
в вашем случае переключить на другой таб должен парент, когда чайлд ему сообщит, что он пуст
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
это не относится к логике в контроллерах ваших экранов, так как они без понятия где находятся в стеке
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
(и не должны этого знать)
источник

PK

Paul Kugaev in Cicerone Chat (RUS)
Konstantin Tskhovrebov
роутер не должен знать ничего про то, как реализована навигация.
в вашем случае переключить на другой таб должен парент, когда чайлд ему сообщит, что он пуст
Так а есть ли возможность чайлду сообщить паренту, что он пуст, не прибегая к прямому обращению к фрагмент менеджеру? По сути интересует именно это
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
так это и есть суть чайлд-парент. они сами содержат фрагмент менеджеры и рулят ими. и отношение чайлд-парент известно только им
источник

AB

Aleksei B. in Cicerone Chat (RUS)
Дополню, что когда чайл стек фрагментов пуст, вызывается activityBack()
дальше вся логика уведомления парента не зависит от Сicerone
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
то есть я бы сделал так:
у чайлд контейнеров есть свойство: пуст он или нет.
парент, когда в него прилетает бек прессед, узнает у текущего это свойство.
если он не пуст, то отдает событие ему, а если пуст, то переключает на соседа
источник

KT

Konstantin Tskhovreb... in Cicerone Chat (RUS)
так как событи бекПрессед идет от активити, то всю эту цепочку легко контроллировать
источник

PK

Paul Kugaev in Cicerone Chat (RUS)
А. Я понял загвоздку в понимании. Поскольку в качестве бекпресседа используется onBackPressedDispatcher, то у него есть особенность - клики на бек перехватывает только топ фрагмент. То бишь в моем случае клик на бек будет перехватывать чайлд фрагмент до тех пор, пока диспатчеру не сказать "всё, хорош". Тогда его перехватит парент. По сути мне в чайлд фрагменте надо лишь узнать, навигатор дошел до конца бекстека или нет. И я так понимаю из чичерона такую инфу фрагменту никак не достать
источник

AB

Aleksei B. in Cicerone Chat (RUS)
@pavel_kugaev как же вы уперто игнорируете
источник

AB

Aleksei B. in Cicerone Chat (RUS)
protected open fun back() {
   
if (localStackCopy.isNotEmpty()) {
       fragmentManager.popBackStack()
       localStackCopy.removeAt(localStackCopy.lastIndex)
   }
else {
       activityBack()
   }
}

protected open fun activityBack() {
   activity.finish()
}
источник

AB

Aleksei B. in Cicerone Chat (RUS)
почитайте код навигатора в Cicerone
источник

AB

Aleksei B. in Cicerone Chat (RUS)
все просто
источник

AB

Aleksei B. in Cicerone Chat (RUS)
Cicerone сам проверяет все, что нужно
источник