13

2 つのフラグメント呼び出しがCreateRoomFragmentありDisplayPhotoFragment、ナビゲーション グラフは次のようになります。

<navigation>    
<fragment
    android:id="@+id/createRoomFragment"
    android:name="package.room.CreateRoomFragment"
    android:label="Create a room"
    tools:layout="@layout/fragment_create_room">
    <action
        android:id="@+id/action_createRoomFragment_to_roomFragment"
        app:destination="@id/roomFragment" />
    <action
        android:id="@+id/action_createRoomFragment_to_displayPhotoFragment"
        app:destination="@id/displayPhotoFragment" />
</fragment>

<fragment
    android:id="@+id/displayPhotoFragment"
    android:name="package.fragment.DisplayPhotoFragment"
    android:label="fragment_display_photo"
    tools:layout="@layout/fragment_display_photo" >
    <argument android:name="bitmap"
              app:argType="android.graphics.Bitmap"/>
</fragment>

CreateRoomFragmentからに移動したいときはDisplayPhotoFragment、次のように do を使用します。

NavDirections action = CreateRoomFragmentDirections.actionCreateRoomFragmentToDisplayPhotoFragment(selectedPhoto);
Navigation.findNavController(view).navigate(action);

これを行うと、に移動できますDisplayPhotoFragment

しかしback、デバイスのボタンを押してもBack arrow、ツールバーからも戻ることができませんCreateRoomFragment

私はこれを試しましたが、まだ前のフラグメントに戻ることができません:

requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {

                       navController.navigateUp();  //I tried this 
                       navController.popBackStack(R.id.createRoomFragment,false); //and also this
                    }
                });

現在の主な問題:

上記のコードを使用すると、画面は前の Fragment( CreateRoomFragment) に戻りませんでした。まだスタックしてDisplayPhotoFragmentいますが、同時にCreateRoomFragment onViewCreatedセクション内の API メソッドが呼び出されています。

これは何が原因ですか?どうすればこの問題を解決できますか?

4

5 に答える 5

0

イベントを一度だけ観察したい場合は、MutableSharedFlow代わりに onを使用できます。MutableLiveData

あなたのviewModel

 private val _events = MutableSharedFlow<Event>()
    val events = _events.asSharedFlow() // read-only public view

    suspend fun postEvent() {
        _events.emit(event) // suspends until subscribers receive it
    }

あなたのActivity/Fragmentクラスで:

lifecycleScope.launchWhenStarted {
   viewModel.events.collect {
   }
}

viewModel.postEvent()

これにより、フラグメントに戻るときにデータを継続的に観察できなくなります。

于 2022-01-06T18:50:40.550 に答える