AndroidX のナビゲーション ライブラリを使用するアプリを持っていますが、奇妙な動作をしています。特に、バックグラウンドに出入りするアプリの周り。以下に 2 つの例を示します。
- 私が持っているフラグメントの単純なオンクリックリスナーでは:
(コトリン)
button.setOnClickListener {
findNavController().popBackStack()
}
IllegalStateException
このことから、 が後に実行されたので、 がスローされたというクラッシュが見られonSaveInstanceState
ます。
- 私は
ViewModel
自分に関連付けられてFragment
おり、オブザーバーをフラグメントビューのライフサイクルに登録しています。これは、 の間に通知を受け取ることを意味しonStart
ます。ログイン状態などの一部の重要なイベントによって、アプリのナビゲーションが決定されます。私の場合、ログイン画面またはメイン画面に移動できるスプラッシュ画面があります。ユーザーがログインを完了すると、ナビゲーションをリセットします (スプラッシュ画面に戻ります)。これで認証状態の準備が整い、メインフラグメントに移動したいのですが、準備ができonResume
ていると見なされる前に呼び出す必要があるため、これは頻繁にエラーをスローしますFragmentManager
。トランザクションの途中で、新しいトランザクションを追加できないというエラーが表示されます。これを仲介するために、私はこの奇妙なコードを書かなければなりませんでした:
(コトリン)
private fun safeNavigateToMain() {
if (fragmentManager == null) {
return
}
if (!isResumed) {
view?.post { safeNavigateToMain() }
return
}
try {
findNavController().navigate(R.id.main)
} catch (tr: Throwable) {
view?.post { safeNavigateToMain() }
}
}
これらの回避策を追加しなくても、ナビゲーションコントローラーをフラグメントのライフサイクルでうまく機能させる方法を知っている人はいますか?