Передача значений между фрагментом и ViewModel Kotlin - PullRequest
0 голосов
/ 04 мая 2020

Я кодирую приложение android, используя kotlin. Сейчас я делаю страницу входа и смотрю здесь Я решил использовать SavedStateHandle для передачи данных различным компонентам. В моем фрагменте я изменил SavedStateVMFactory на SavedStateViewModelFactory , чтобы инициализировать мою виртуальную машину (правильно ли это инициализация?), И создал метод stati c, который обновляет saveState.

LoginFramgment

private const val ARG_COD = "cod"
private const val ARG_PASSWORD = "password"

class LoginFragment : Fragment() {

    private var cod: String? = null
    private var password: String? = null

    private val viewModel: LoginViewModel by viewModels(
        factoryProducer = {
            SavedStateViewModelFactory(activity?.applicationContext as Application, this)
        }
    )

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

        arguments?.let {
            cod = it.getString(ARG_COD)
            password = it.getString(ARG_PASSWORD)
        }
    }

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

        // Inflate the layout for this fragment
        val root = inflater.inflate(R.layout.fragment_login, container, false)
        val btn_login: Button = root.findViewById(R.id.login_btn)
        btn_login.setOnClickListener{
            newInstance("franco", "passas")
            viewModel.printCod()
        }

        return root
    }


    companion object {

        @JvmStatic
        fun newInstance(cod: String, password: String) =
            LoginFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_COD, cod)
                    putString(ARG_PASSWORD, password)
                }
            }
    }
}

На виртуальной машине я просто извлекаю данные из saveState.

LoginViewModel

class LoginViewModel(private val state: SavedStateHandle) : ViewModel(){

    private val savedStateHandle = state

    fun getCurrentCod(): String {
        println("COD: "+ savedStateHandle.get(ARG_COD))
        return savedStateHandle.get(ARG_COD)?: ""
    }

    fun printCod() {
        println("CODICE: " + getCurrentCod())
    }

    companion object {
        private val ARG_COD = "cod"
        private val ARG_PASSWORD = "password"
    }
}

То Конфигурация не работает должным образом, когда я пытаюсь напечатать параметры из сохраненного состояния в VM, они нулевые. Может быть newInstance метод не реализован правильно? Вы знаете, что не так, пожалуйста?

...