Вопрос:

Привязка данных - жилые данные с пользовательским объектом не были запущены

android android-databinding android-livedata

34 просмотра

2 ответа

341 Репутация автора

Я сталкиваюсь с некоторыми проблемами, связанными с данными и liveata, когда у меня есть пользовательский объект.

Например:

у меня есть MutableLiveData val user = MutableLiveData<User>()

и я использую двустороннюю привязку данных с @={viewModel.user.name}

Но мой наблюдатель его не обстрелял viewModel.user.observer.

Когда я помещаю FragmentBindingточку останова в сгенерированный класс, я вижу вызов setValue и пользовательские значения userLiveData с данными.

Проблема в том, что наблюдатель не был уволен внутри Фрагмента.

Кто-нибудь знает, что я там делаю не так?

РЕДАКТИРОВАТЬ 1

Ниже мой фрагмент кода:

val infoPessoalViewModel: InfoPessoalViewModel by viewModel()
lateinit var bindingView: FragmentInfoPessoalBinding

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

    bindingView = DataBindingUtil.inflate(inflater, R.layout.fragment_info_pessoal, container, false)

    return bindingView.root
}

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

    bindingView.apply {
        lifecycleOwner = this@InfoPessoalFragment
        viewModel = infoPessoalViewModel
    }

    infoPessoalViewModel.user.observe(this, Observer { user ->
        user.confirmEmail?.let {
            //NOT FIRED HERE
            Log.d("LiveData","Fired!")
        }
    })
}

РЕДАКТИРОВАТЬ 2

Извините, я приводил пример переменных с именами различий.

Автор: LMaker Источник Размещён: 11.06.2019 10:24

Ответы (2)


0 плюса

1 Репутация автора

Вот:

infoPessoalViewModel.user.observe()

Выше вы упомянули, что имя переменной есть userLiveData, и вы использовали это в XML:@={viewModel.userLiveData.name}

Так что, возможно, код о наблюдении должен быть таким:

infoPessoalViewModel.userLiveData.observe()
Автор: Chenhe Размещён: 12.06.2019 03:00

0 плюса

1095 Репутация автора

Ваша логика BindingAdapter должна иметь возможность преобразовывать EditTextвходные данные в Userэкземпляр и наоборот. Допустим, Userэкземпляр выглядит так:

User.kt

class User(val username: String)

Тогда пример адаптера должен быть:

MyBindingAdapters.kt

/**
 *  Convert EditText input into a User instance.
 */
@InverseBindingAdapter(attribute = "android:text")
fun getUser(view: EditText): User {
    return User(view.text.toString())
}

/**
 *  Convert a User instance into EditText text
 */
@BindingAdapter("android:text")
fun setUser(view: EditText, newUser: User?) {
    if (newUser?.username != view.text.toString()) {
        view.setText(newUser?.username)
    }
}

В вашем файле компоновки привязать userLiveData

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@={viewModel.userLiveData}"/>


Обратите внимание, что адаптеры являются биективными, то есть один Userсоединяется точно с одним Stringи наоборот. Если Userкласс более сложный, то двусторонняя привязка к нему MutableLiveData<User>не имеет смысла. В этом случае вам следует MutableLiveData<String>вместо этого связать его и вручную обновить Userэкземпляр в модели представления.

Автор: Sanlok Lee Размещён: 12.06.2019 05:24
Вопросы из категории :
32x32