Я кодирую приложение 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 метод не реализован правильно? Вы знаете, что не так, пожалуйста?