アプリでナビゲーションコンポーネントを使用していますが、最近は正常に機能していましたが、プロジェクトをAndroidX
に更新した後、エラー_navigation destination DESTINATION_NAME is unknown to this NavController
_ その宛先の場合のみ(開く予定の場合) )は以前、navController.popBackStack()
を使用してそれ自体から閉じられています。また、MainActivity
からDESTINATIONフラグメントを閉じてもエラーは発生しませんが、popBackStack
を使用して、エラーのみが発生します。以下のように
DestinationFragment
_viewModelOfActivity.handleBackButton.observe(this, Observer {
Navigation.findNavController(requireActivity(), R.id.main_nav_Host).popBackStack()
//CALLING popBackStack() HERE CAUSING PROBLEM WHEN REOPNING THIS DESTINATION(or frg ) AGIAN
})
_
MainActivity
_override fun onBackPressed() {
if (myViewModel.isDefaultBehaviour.value == true) {
super.onBackPressed()
} else{
myViewModel.handleBackButton.value=true
//NO ERROR IF HANDLE BACK BUTTON HERE ie->findNavController(R.id.main_nav_Host).popBackStack()
//INSTEAD OF myViewModel.handleBackButton
}
}
_
関連する質問もチェックしましたが、ヘルプはありません 同様の質問 。
注:私は最新バージョンのナビゲーションライブラリ(alpha05)を使用しています
DestinationFragmentで SingleLiveEvent を使用して、MainActivity私が私の質問でこれをすでに述べたので。だから問題はSingleLiveEvent
にありましたfun observe(owner: LifecycleOwner, observer: Observer<in T>)
のコードを誤ってに変更したことに気付きました
_override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
super.observe(owner, observer)//Here is problem I was calling super twice in function
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
_
ここで、私はsuper
関数を2回呼び出しており、オブザーバーのonChanged
をFragment
で2回呼び出しています。以下のコードは2回呼び出されますNavigation.findNavController(requireActivity(), R.id.main_nav_Host).popBackStack()
which popBackStack()
2回。
次に、observe
関数を以下のように変更しました
_@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<in T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
super.observe(owner, Observer { t ->/** other code*//})
}
_
今私のコードは正常に動作します
以前の値はおそらくビューモデルにまだ存在しており、すぐにトリガーされます。オブザーバーではなく、インターフェイスを使用して戻るボタンの委任を処理することをお勧めします。これで使用法が修正されます。
何が起こっているのかというと、アクティブなグラフがなくなってしまうほど、バックスタックが上がりすぎています。これは、オブザーバーが必要以上に頻繁にトリガーされているために発生しています。これを確認するには、その行をデバッグして、クラッシュの直前にグラフを調べることをお勧めします。 nullの可能性があります。
私はこのように使用しています
@Override
public void onBackPressed() {
if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
/** do something */
else myNavController.popBackStack();
}
同じ問題がありました。私のアプリには3つのフラグメント_A -> B -> C
_があり、A
からC
に戻る必要がありました。私の場合、popBackStack()
を使用して現在のフラグメントを閉じ、前のフラグメントに戻りました。その後、A
から移動しようとすると、_Navigation xxx is unknown to this NavController
_例外がスローされました。
バックスタックからのpopフラグメントの代わりにnavigate()
からA
を使用することになりました。 popUpTo
およびpopUpToInclusive
設定を使用すると、問題が適切に修正されました(ドキュメント https://developer.Android.com/guide/navigation/navigation-getting-started#popupto_example_circular_logic を参照) )
_<fragment
Android:id="@+id/FragmentC"
Android:name="xxx.FragmentC"
Android:label="C" >
<action
Android:id="@+id/action_to_A"
app:destination="@id/FragmentA"
app:popUpTo="@+id/FragmentA"
app:popUpToInclusive="true" />
</fragment>
_