Size: a a a

Cicerone Chat (RUS)

2018 September 08

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Это упрощённый пример. Может быть несколько фрагментов и первый Майн может допускать неавторизованного  пользователя а десяток других - нет
источник

RV

Rinat Vasilev in Cicerone Chat (RUS)
Ребят, как-нибудь можно вернуться на предыдущий фрагмент не пересоздавая его?
источник

RV

Rinat Vasilev in Cicerone Chat (RUS)
Чтобы при router.exit() или router.backTo() у фрагмента, к которому мы возвращаемся, не вызывался onCreateView ¯\_(ツ)_/¯
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Konstantin Tskhovrebov
Гляну, когда дома буду
Судя по всему, исключение возникает в классе SupportFragmentNavigator в методе  applyCommands команда fragmentManager.executePendingTransactions(); Исходя из описания метода рекомендуется использовать commitNow. Либо можно обернуть команду в try-catch
источник

KT

Konstantin Tskhovrebov in Cicerone Chat (RUS)
Нет. Это советы со стека.
Команда вызывается как надо. КоммитНау совсем для другого и работать не будет
источник

AO

Aleksey Orekhov in Cicerone Chat (RUS)
В 25.0.0 версии, такое поведение не вызывает исключений и все транзакции выполняются корректно.
источник

AO

Aleksey Orekhov in Cicerone Chat (RUS)
самым простым решением. наверное, будет, delay в 1 милисекунду на вызов транзакции
источник

ЕН

Евгений Низамиев in Cicerone Chat (RUS)
Это всё неправильно. Достаточно предотвращать вообще такие вызовы, чем потом ловить такие классные ошибки и что-то делать, чтобы исправить это
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Для того чтобы их предотвращать - нужен безопасный колбек, чтобы можно было начать выполнение кода, который может привести к новой транзакции, я пока такого колбека не нашел
источник

AO

Aleksey Orekhov in Cicerone Chat (RUS)
Я говорю про executeCommands в CommandBuffer, такая ситуация, может возникнуть только когда первая команда ещё не выполнена, и сразу же за ней запускается вторая, ожидание в 1 миллисекунду, и попытка заново выполнить функцию, должны решить проблему
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
А для чего тут fragmentManager.executePendingTransactions() ? Без него все отрабатывает без крашей
источник

KT

Konstantin Tskhovrebov in Cicerone Chat (RUS)
Это для возможности делать сложные переходы с учётом асинхронного стека.
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Разве транзакции не в одну очередь встают?
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Они же по-идее выполняются в главном потоке
источник

М

Михаил in Cicerone Chat (RUS)
Vitalii Nikonorov
Разве транзакции не в одну очередь встают?
Если не юзать commitNow то нет
источник

AO

Aleksey Orekhov in Cicerone Chat (RUS)
Vitalii Nikonorov
Они же по-идее выполняются в главном потоке
commit() можно выполняется в background потоке
источник

VN

Vitalii Nikonorov in Cicerone Chat (RUS)
Коммит не выполняет транзакцию, он ее только на выполнение отправляет
источник

AO

Aleksey Orekhov in Cicerone Chat (RUS)
Vitalii Nikonorov
Коммит не выполняет транзакцию, он ее только на выполнение отправляет
не правильно выразился, commit() ассинхронная, commitNow() синхронная
источник

KT

Konstantin Tskhovrebov in Cicerone Chat (RUS)
Vitalii Nikonorov
Разве транзакции не в одну очередь встают?
Смотрите. Один раз напишу, потом можно ссылаться на это сообщение 😉
вызов executePendingTransactions перед началом применения новых команд вызывается для того, что в этот момент могут быть выполнены не все транзакции, а нам надо выполнить бекТу какой-то экран.
чтобы быть уверенным, что такой есть и уже не участвует в транзакции.
после executePendingTransactions создается локальная копия состояния стека, и дальше любое количество команд преобразуется в транзакции без синхронных запусков (executePendingTransactions и popBackBtackImmediate) тем самым обеспечивая плавный UI. Раньше были проблемы со сменой корневого фрагмента и вообще концептуально теперь лучше (батчинг команд для сложных переходов)
источник

KT

Konstantin Tskhovrebov in Cicerone Chat (RUS)
посмотрите внимательно документацию (и другие проблемы есть).
я напишу все, что увидел беглым просмотром:
1) cicerone.navigatorHolder.setNavigator(navigator) в onCreate() нельзя делать - возможно у вас вообще из-за этого и ошибка (читайте док на гитхабе, там есть про onResumeFragments)
2) fragment.setRouter(cicerone.router) - после восстановления процесса роутер не просетится во фрагмент и все перестанет работать. просто сделайте поле в активити и доставайте внутри фрагмента из активити
3) навигацию во фрагменте запускайте в onResume
источник