Как объединить компоненты архитектуры с привязкой данных к андроиду?
Я разработал базу приложений в библиотеке привязки данных Android: https://developer.android.com/topic/libraries/data-binding/index.html
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
и теперь я хочу использовать ViewModelProviders из новой библиотеки:
https://developer.android.com/topic/libraries/architecture/guide.html
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
Как это сочетается? Есть идеи? или должны быть объединены эти две библиотеки?
Edit
Я изменяю на:
class SignInViewModel extends ViewModel {
public ObservableField<String> login = new ObservableField<>("");
public ObservableField<String> password = new ObservableField<>("");
}
и теперь компилируется, но вопрос: правильно ли это?
Ответы
Ответ 1
Это известная несовместимость. Вы не можете расширять BaseObservable
и AndroidViewModel
одновременно, поэтому вы не можете использовать @Bindable
, чтобы сделать двустороннюю привязку данных невозможной *.
Это будет исправлено после финальных компонентов версии 1.0 (со стороны привязки данных).
* Изменить: вы можете создать собственный ObservableViewModel: https://gist.github.com/JoseAlcerreca/4b66f9953d50b483d80e6b9ad7172685
Ответ 2
Возможно, этого не было, когда задавался вопрос, но в этой статье объясняется еще один вариант: https://medium.com/google-developers/android-data-binding-observability-9de4ff3fe038
В основном вместо расширения от BaseObservable вы можете внедрить android.databinding. Наблюдаемый.
Он немного больше работает, так как вам также нужно сделать следующее:
-
Создайте эту переменную в классе модели
private PropertyChangeRegistry registry = new PropertyChangeRegistry();
-
Внедрите описанные выше методы
@Override
public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
registry.add(callback);
}
@Override
public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) {
registry.remove(callback);
}
-
Замените все вызовы "BR" следующими:
registry.notifyChange(this, BR.bar);
Все остальное работает так же, как и от BaseObservable. Поэтому я думаю, что, возможно, это решение, которое Хосе, возможно, намекал на то, что, вероятно, тогда было недоступно. Кажется, что это работает.
Ответ 3
Это можно также решить с помощью обертки:
class SignInViewModelWrapper extends ViewModel {
public final SignInViewModel model = new SignInViewModel();
}
class SignInViewModel extends BaseObservable {
@Bindable
public String getLogin() {
return login;
}
@Bindable
public String getPassword() {
return password;
}
}
Затем вы можете получить модель представления следующим образом:
SignInViewModel signInViewModel = ViewModelProviders.of(this).get(SignInViewModelWrapper.class).model;
Ответ 4
Это возможно с Android Studio 3.1 Canary 6 (https://androidstudio.googleblog.com/2017/12/android-studio-31-canary-6-is-now.html):
Теперь вы можете использовать объект LiveData в качестве наблюдаемого поля в выражениях привязки данных. Класс ViewDataBinding теперь включает новый метод setLifecycle, который вам нужно использовать для наблюдения за объектами LiveData.
Вы можете найти более подробную информацию и образец в этом Средний пост.