android-fragments 无法将绑定参数从片段传递到视图模型

wwodge7n  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(177)

我正在学习mvvm。我想在视图模型中传递片段绑定参数。我正在使用Hilt-Dagger。请帮助我。每次保存的状态句柄都是空的。
这是我代码。2第一个片段:

@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 -> {}
            }
        }

第二个片段:我在这里获得了捆绑包值。但我希望它在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:但getArgs.值始终为空。

@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"])

我正在从片段1到片段2获取Bundle数据,但无法从片段1到ViewmodelSavedstatehandle获取相同的数据,但每次都为空。我做错了什么?我需要ViewModel中的数据。
请帮助我是一个新的学习者在MVVM。

hfyxw5xn

hfyxw5xn1#

我不认为你可以通过这种方式从fragment向ViewModel传递数据。通过访问需要的方法来传递这个bundle数据。

视图模型方法

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

片段

您可以从onCreateView或onViewCreated将数据发送到视图模型

customerViewModel.aMethodName(customer)

相关问题