Question: [I found the question but does not have solution in code](https://stackoverflow.com/q/53298615/1136023)

I want to have data when backpress/manual back happens. I am using `navigateUp()` to go back. How can I pass data to previous fragment? `navigateUp()` does not have any facility to pass data to previous fragment. Even I did not find solution using [Safe Args](https://developer.android.com/topic/libraries/architecture/navigation/navigation-pass-data#Safe-args). It's passing data forward. I want to have in backward Frad B -> Frag A.

My code to go back to previous fragment

```
Navigation.findNavController(view).navigateUp()

```

[![enter image description here](https://i.stack.imgur.com/b27YH.png)](https://i.stack.imgur.com/b27YH.png)

My question is, How can i get data in previous fragment. I can navigate to Frag A from Frag B using

Answer: 
According to [developer.android.com](https://developer.android.com/topic/libraries/architecture/viewmodel#sharing), you can use common for fragments where you want to share data [ViewModel](https://developer.android.com/reference/android/arch/lifecycle/ViewModel.html) using their activity scope.

Here are steps:

1. Create view model which will keep the data:

```
class SharedViewModel : ViewModel() {
    val dataToShare = MutableLiveData<String>()

    fun updateData(data: String) {
        dataToShare.value = data
    }
}

```

2. Observe data changes in Fragment1:

```
class Fragment1 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
        viewModel.dataToShare.observe(this, Observer<String> { dataFromFragment2 ->
            // do something with data
        })
    }
}

```

3. Update data in `Fragment2` and if you're handling navigation properly, now, you should be able to receive data changes on `Fragment1`:

```
class Fragment2 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)

        updateDataButton.setOnClickListener { v ->
            viewModel.updateData("New data for fragment1")
        }
    }
}

```

I hope answer helps.
You should use static variables/companion objects, because it is better than shared viewmodel as it is not simple/nice architecture. As it it not straightforward, I think it is the best way.

To navigateUp From FragmentB to FragmentA

FragmentB:

```
isBackpressed = true
findNavController().navigateUp() 

```

FragmentA:

```
onViewCreated() {
    // todo
    if(isBackpressed) {
         isBackpressed = false
         // do whatever you want
    }
}

```