Могу ли я использовать view.getContext () внутри ViewModel в качестве моего класса привязки данных - PullRequest
0 голосов
/ 14 мая 2018

Я использую привязку данных и структуру MVVM.

<layout >
  <data>
    <variable
      name="loginVM"
      type="drish.com.dsfaallstars.login.viewmodel.LoginViewModel"/>
  </data>
...
<Button
        android:id="@+id/loginButton"
        android:textStyle="bold"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="@drawable/button"
        android:text="@{loginVM.buttonText}"
        android:textColor="@android:color/white"
        android:onClick="@{(view)->loginVM.loginProcess(view,username.getText().toString(),password.getText().toString())}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guideline"
        app:layout_constraintStart_toStartOf="@+id/guideline2"
        app:layout_constraintTop_toBottomOf="@+id/textInputLayout3"
        app:layout_constraintVertical_bias="0.19"/>
...
</layout>

В моей ViewModel я обрабатываю onClick, и в этом методе мне нужно показать окно оповещения в случае некоторых требований, для окна оповещения нужен контекст представления, а не контекст приложения.

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

public void loginProcess(View v, String user, String pass) {
    Log.e(LogConst.TAG, "loginProcess: ");
    Log.e(LogConst.TAG, " username " + user + "======= password " + pass);
    if (user.length() < 1 || pass.length() < 1) {
      new CustomLoginDialog(user, pass, v.getContext());
    } else if (checkCredentialsOffline(user, pass)) {
      Log.e(LogConst.TAG, "loginProcess: Async ");
      new LoginTaskAsync(v, user, pass).execute();
    }
  }

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Одна из основных целей использования MVVM - сделать ваше приложение тестируемым. В идеале ViewModel должен абстрагироваться от всех зависимых от Android зависимостей, чтобы вы могли писать неинструментальные тесты для его бизнес-логики. Я создал интерфейс «Activity», за которым я помещаю большинство вызовов, зависящих от контекста (например, «showDialog»), чтобы я мог при необходимости высмеивать их.

0 голосов
/ 14 мая 2018

Короткий ответ: «Да».Однако вы можете разделить модель представления на два разных класса: один для данных и один для обработки событий.

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

...