[英]Is there a better way to expose private MutableLiveData as LiveData for an ViewModel. [Android, Kotlin]
[英]android viewmodel mutablelivedata not updating, 2 way data binding
我有這樣的片段:
class LoginFragment : Fragment() {
private lateinit var viewModel: AuthViewModel
private lateinit var mBinding: FragmentLoginBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mBinding = DataBindingUtil.inflate<ViewDataBinding>(
inflater, R.layout.fragment_login, container, false
) as FragmentLoginBinding
val view: View = mBinding.root
viewModel = ViewModelProvider(requireActivity()).get(AuthViewModel::class.java)
mBinding.login?.invoke(viewModel)
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initLoginButton()
}
fun initLoginButton() {
mBinding.btLogin.setOnClickListener {
Log.d("d--login", "login clicked")
Log.d("d--login", viewModel.username.value)
Log.d("d--login", viewModel.password.value)
}
}
}
我的 AuthViewModel 看起來像這樣:
class AuthViewModel : ViewModel() {
operator fun invoke(viewModel: AuthViewModel) {}
val username = MutableLiveData<String>("")
val password = MutableLiveData<String>("")
val passwordRe = MutableLiveData<String>("")
}
在 XML 我有兩個編輯文本:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusedByDefault="true"
android:inputType="text"
android:text="@={login.username}"
android:textColor="@color/colorWhite" />
但是用戶名不會在視圖模型上更新,我也嘗試過 ObservableField。 同樣的問題。
在家長活動中,我有:
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_authentication)
viewModel = ViewModelProvider(this).get(AuthViewModel::class.java)
mBinding.auth?.invoke(viewModel)
mBinding.lifecycleOwner = this
您的ViewModel
和Fragment
沒有任何連接
像這樣做:
分段:
private lateinit var vm: AuthViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
vm = activity?.run {
ViewModelProviders.of(this)[AuthViewModel::class.java]
} ?: throw Exception("Invalid Activity")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val binding: FragmentLoginBinding = DataBindingUtil.inflate(inflater,
R.layout.fragment_login, container, false)
binding.viewmodel = vm//attach your viewModel to xml
return binding.root
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.