Can't Pass Bundle argument from Fragment to Viewmodel

504 Views Asked by At

I am learning mvvm. I want to pass frgment bundle argument in ViewModel savedstatehandle .I am using Hilt-Dagger. Please help me. Everytime savedstatehandle is null.

here is my code. FIRST FRAGMENT:

@AndroidEntryPoint
class CustomerOrderSubmit : Fragment() {

    private lateinit var binding: FragmentCustomerOrderSubmitBinding
    val customerViewModel: CustomerViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        binding = FragmentCustomerOrderSubmitBinding.inflate(inflater, container, false)

        binding.customerModel = customerViewModel
        binding.lifecycleOwner = viewLifecycleOwner

customerViewModel.btnClick.observe(viewLifecycleOwner) {
            when (it) {
                true -> {
                    val args = Bundle()
                    args.putParcelable("customer",customerViewModel.args.value)
                    val orderReview  = OrderReview()
                    orderReview.arguments = args

                    Log.d("PARC",args.toString())

                    val fragmentManager = requireActivity().supportFragmentManager.beginTransaction()
                    fragmentManager.replace(R.id.main_frame_layout,orderReview)
                        .addToBackStack(null).commit()

                }
                else -> {}
            }
        }

SECOND FRAGMENT: HERE I AM GETTING BUNDLE VALUE. BUT I WANT IT IN ViewModel

@AndroidEntryPoint
class OrderReview : Fragment() {

    private lateinit var binding: FragmentOrderReviewBinding
    private val customerViewModel: CustomerViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        binding = FragmentOrderReviewBinding.inflate(inflater, container, false)

        binding.argsModel = customerViewModel
        binding.lifecycleOwner = viewLifecycleOwner

        val args : CustomerModel? = arguments?.getParcelable("customer")
        Log.d("PARCF",args.toString())

        return binding.root
    }    
}

VIEW MODEL: But getArgs.value is always null.

@HiltViewModel
class CustomerViewModel @Inject constructor(

    private val cusomerRepository: CusomerRepository,
    private val savedStateHandle: SavedStateHandle

) : ViewModel() {

    val customerList: LiveData<List<CustomerModel>>

    //get arguments 
    val getArgs = MutableLiveData<CustomerModel>(savedStateHandle["customer"])

I am getting Bundle data from fragments one to two but can't get the same data from Fragment one to ViewmodelSavedstatehandle but null every time. What have I done wrong? I need data in ViewModel.

Please help I am a new learner in MVVM.

1

There are 1 best solutions below

1
monjur On

I don't think you can pass data in this way from fragment to ViewModel.Pass this bundle data by accessing the method where it is needed.

ViewModel method

    fun aMethodName(customr:String){
           //your code here 
          //access customer 
          //Data type String can be changed to customer DataType
    }

Fragment

from onCreateView or onViewCreated you can send the data to viewmodel

customerViewModel.aMethodName(customer)