web-dev-qa-db-ja.com

ナビゲーションDESTINATION_NAMEはこのNavControllerにとって不明です。以前にnavController.popBackStack()を使用して閉じたReOpeningフラグメントですか?

アプリでナビゲーションコンポーネントを使用していますが、最近は正常に機能していましたが、プロジェクトを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)を使用しています

DestinationFragmentSingleLiveEvent を使用して、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回呼び出しており、オブザーバーのonChangedFragmentで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の可能性があります。

0
Agent 404

私はこのように使用しています

@Override
public void onBackPressed() {

 if(myNavController.getCurrentDestination().getId()==R.id.startDestinationId)
 /** do something */
 else myNavController.popBackStack();

}
0
Murad Hamidov

同じ問題がありました。私のアプリには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>
_
0
Vasily Kabunov