Компонент архитектуры навигации - невозможно перейти к фрагменту из onResume - PullRequest
0 голосов
/ 12 мая 2018

Я тестирую эту новую библиотеку и хочу перейти к фрагменту входа, если пользователь не вошел в систему. Эта проверка выполняется в базовом фрагменте, например:

abstract class SignedInFragment : Fragment() {

override fun onResume() {
    super.onResume()
    if (FirebaseAuth.getInstance().currentUser == null) {
        NavHostFragment.findNavController(this /* Fragment */)
                .navigate(R.id.action_login)
    }
}

}

Но это просто заканчивается в RuntimeException, говоря, что FragmentManager уже выполняет транзакции:

    java.lang.RuntimeException: Unable to resume activity {me.hammarstrom.loco/me.hammarstrom.loco.MainActivity}: java.lang.IllegalStateException: FragmentManager is already executing transactions
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3645)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3685)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2898)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

График навигации выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/mainFragment">

<fragment
    android:id="@+id/loginFragment"
    android:name="me.hammarstrom.loco.ui.login.LoginFragment"
    android:label="LoginFragment" >
    <action
        android:id="@+id/action_loginFragment_to_signedInFragment"
        app:destination="@id/signedInFragment"  />
</fragment>
<fragment
    android:id="@+id/signedInFragment"
    android:name="me.hammarstrom.loco.ui.common.SignedInFragment"
    android:label="SignedInFragment" />
<fragment
    android:id="@+id/mainFragment"
    android:name="me.hammarstrom.loco.ui.main.MainFragment"
    android:label="MainFragment" />
<action
    android:id="@+id/action_login"
    app:destination="@id/loginFragment" />

Должен ли этот вид навигации быть выполнен каким-либо другим способом?Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Эта проблема была исправлена ​​в Navigation 1.0.0-alpha02.На основе заметок о выпуске :

Исправлена ​​исключительная ситуация IllegalStateException при вызове навигации из методов жизненного цикла фрагмента

0 голосов
/ 13 мая 2018

Похоже, ошибка в компонентах архитектуры Android.Я создал сообщение об ошибке по этой проблеме здесь .Я обнаружил, что временным обходным путем для этого является задержка вызова метода навигации, чтобы менеджер фрагментов мог выполнять ожидающие транзакции.

val executor = Executors.newSingleThreadScheduledExecutor()
executor.schedule({
        activity?.runOnUiThread { NavHostFragment.findNavController(this)
            .navigate(R.id.action_login) }
}, 1, TimeUnit.MILLISECONDS)

или если вы используете сопрограммы

launch(UI) {
    delay(1L)
    NavHostFragment.findNavController(this).navigate(R.id.action_login)
}

ОБНОВЛЕНИЕ:

Эта проблема была исправлена ​​в версии 1.0.0-alpha02.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...