Как объединить компоненты архитектуры с привязкой данных к андроиду?

Я разработал базу приложений в библиотеке привязки данных 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.

Вы можете найти более подробную информацию и образец в этом Средний пост.