android viewmodel mutablelivedata не обновляется, двусторонняя привязка данных - PullRequest
0 голосов
/ 04 августа 2020

У меня есть такой фрагмент:


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

1 Ответ

0 голосов
/ 04 августа 2020

Ваши 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
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...