Привязка данных Android к CustomView, неспособная установить viewmodel из Activity в компонент

Я создал пользовательский вид для повторного использования. Я следую за MVVM-архитектурой, и мне требуется передать ViewModel в представление, которое я создал.

У меня есть CustomView, как это (все в kotlin)

class KeyValueMutlipleEntryField @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(context, attrs, defStyleAttr) { lateinit var keyValMutlipleEntryField: KeyValueMutlipleEntryFieldBinding fun setKeyValueViewModel(keyValueViewModel: KeyValueMutlipleEntryFieldViewModel?) { keyValueViewModel?.let { keyValMutlipleEntryField.keyValueViewModel = keyValueViewModel } } fun setKeyValFieldAdapter(keyValFieldadapter: KeyValueFieldAdapter?) { keyValFieldadapter?.let { keyValMutlipleEntryField.keyValFieldAdapter = keyValFieldadapter } } init { initView() } override fun onFinishInflate() { super.onFinishInflate() keyValMutlipleEntryField?.executePendingBindings() } private fun initView() { keyValMutlipleEntryField = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.key_value_mutliple_entry_field, null, false) addView(keyValMutlipleEntryField.root) } } 

Файл макета для того же вида выглядит ниже

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="keyValueViewModel" type="com.app.viewmodel.widget.KeyValueMutlipleEntryFieldViewModel"></variable> <variable name="keyValFieldAdapter" type="com.app.view.widgets.KeyValueFieldAdapter"></variable> </data> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/field_container" android:layout_width="match_parent" android:layout_height="wrap_content" app:adapter="@{keyValFieldAdapter}" app:items="@{keyValueViewModel.getKeyValueFields}"> </android.support.v7.widget.RecyclerView> <android.support.v7.widget.AppCompatImageView android:id="@+id/action_add" android:layout_width="@dimen/baseline_grid_1.5x" android:layout_height="@dimen/baseline_grid_1.5x" android:layout_marginLeft="@dimen/baseline_grid_2.5x" android:layout_marginTop="@dimen/baseline_grid_4x" android:onClick="@{()->keyValueViewModel.addNewField()}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/field_container" app:srcCompat="@drawable/ic_add" tools:layout_editor_absoluteY="219dp" /> <android.support.v7.widget.AppCompatTextView android:id="@+id/add_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/baseline_grid_3.5x" android:onClick="@{()->keyValueViewModel.addNewField()}" android:text="@{keyValueViewModel.getAddItemLabel}" android:textColor="@color/colorTurquoiseBlue" android:textSize="@dimen/app_text_size_small" app:layout_constraintBottom_toBottomOf="@+id/action_add" app:layout_constraintStart_toEndOf="@+id/action_add" app:layout_constraintTop_toTopOf="@+id/action_add" /> </android.support.constraint.ConstraintLayout> </layout> 

Я поместил это пользовательское представление в фрагмент и установил его в макете, как это

 <com.app.view.widgets.KeyValueMutlipleEntryField android:id="@+id/email_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:keyValFieldAdapter="@{emailAdapter}" app:keyValueViewModel="@{createProfileViewModel.emailFieldViewModel}" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/divider_three"> </com.app.view.widgets.CSKeyValueMutlipleEntryField> 

Свойства определяются в блоке данных фрагмента xml

 <variable name="createProfileViewModel" type="com.app.viewmodel.onboarding.importcontact.CreateProfileViewModel"></variable> <variable name="emailAdapter" type="com.app.view.widgets.KeyValueFieldAdapter"></variable> 

в фрагменте у меня есть следующий код, чтобы назначить viewmodel для просмотра

 fragmentCreateProfilebinding = DataBindingUtil.inflate(inflater, R.layout.fragment_create_profile, container, false) fragmentCreateProfilebinding.emailAdapter = KeyValueFieldAdapter(R.layout.cs_key_value_mutliple_entry_field) fragmentCreateProfilebinding.createProfileViewModel = CreateProfileViewModel(context) 

Когда код выполняется, я получаю исключение kotlin, подобное этому

  Parameter specified as non-null is null: 

Это понимается, если мы получим значение NULL для объекта, не подлежащего обнулению, в Котлине. Это происходит с BindingAdapter, что у меня есть для просмотра recycler

 @BindingAdapter("app:adapter") fun setAdapterToList(view: RecyclerView?, adapter: BaseAppAdapter?) { view?.addItemDecoration(DividerItemDecoration(view?.context, DividerItemDecoration.HORIZONTAL)) view?.layoutManager = LinearLayoutManager(view?.context) view?.adapter = adapter } 

Я сделал их полями с нулевым значением, даже я получаю сообщение об ошибке. Я не могу понять, как работает поток привязки данных. Кто-нибудь, пожалуйста, совет, как я могу решить это или сделать его более надежным.

благодаря