Как передать параметры из фрагмента в хранилище через ViewModelFactory и Kodein DI? - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу передать строку в ApiService с ViewModelFactory и инъекцией зависимостей Kodein, я привязал репозиторий к DI и передал экземпляр в ViewModelFactory, и моя проблема в том, что я не знаю, как передать строку, которая не связана До я с Кодейном раньше. Я создаю строковую переменную и передаю mobileNumber в ViewModel, изменяя его значение, и я хочу знать, как лучше всего это сделать. Вот упрощенный код:

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        orderViewModel = ViewModelProvider(this, orderViewModelFactory)
            .get(orderViewModel::class.java)

        buttonSubmitOrder.apply {
            setOnClickListener {
                val mobileNumber = textFieldMobileNumber.text.toString().trim()

                registerOrder(mobileNumber)
            }
        }
    }

    private fun registerOrder(mobileNumber: String) = launch {

        orderViewModel.mobileNumber = mobileNumber

        val orderResponse = orderViewModel.orderResponse.await()
        orderResponse.observe(viewLifecycleOwner, Observer { data ->
            if (data == null) return@Observer

            data.data?.let {
                Log.i("***", it.toString())
            }
        })
    }

В ViewModel:

    class OrderViewModel(private val ordersRepository: OrdersRepository) : ViewModel() {
            var mobileNumber = ""
            val OrderResponse by lazyDeferred {
                ordersRepository.registerOrder(getOrderRequest())
            }
            private fun getOrderRequest(): OrderRequest {
                return OrderRequest(mobileNumber)
            }
        }

В моем классе приложения:

        bind<OrderRepository>() with singleton {
            OrderRepositoryImpl(
                instance(),
                instance(),
                instance(),
                instance()
            )
        }
        //ViewModelFactory
        bind() from provider { OrderViewModelFactory(instance()) }

ViewModelFactory:

   class OrderViewModelFactory(private val orderRepository: OrderRepository) :      
         ViewModelProvider.NewInstanceFactory() {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return OrderViewModel(
            orderRepository
        ) as T
    }
}     
...