【问题标题】:Using @IntDef in a LiveData Observable在 LiveData Observable 中使用 @IntDef
【发布时间】:2021-12-12 15:52:05
【问题描述】:

我正在研究如何更新一些现有代码以使用新的 Android LiveData 架构模式。希望代码示例是不言自明的,我正在努力让 @IntDef / @Interface 与实时数据一起工作。我很高兴在 ViewModel 上为 SetAnsweredCorrectly、SetCheated 等创建方法,或者创建一个 MutableLiveData 属性并在代码中设置它,只是我正在努力了解如何使用除普通 Integer 之外的任何东西,它会丢失类型安全。

public class QuestionViewModel extends ViewModel {

    public static final int UNANSWERED = 0;
    public static final int ANSWERED_CORRECTLY = 1;
    public static final int ANSWERED_INCORRECTLY = 2;
    public static final int CHEATED = 3;

    @IntDef({UNANSWERED, ANSWERED_CORRECTLY, ANSWERED_INCORRECTLY, CHEATED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AnswerState{}

    private @AnswerState int answeredState;

    public Question()
    {
        this.setAnsweredState(UNANSWERED);
    }

    public @AnswerState int getAnsweredState() {
        return answeredState;
    }

    public void setAnsweredState(@AnswerState int answeredState) {
        this.answeredState = answeredState;
    }

【问题讨论】:

    标签: android android-livedata


    【解决方案1】:

    试试这个:

    ObservableField<AnswerState> observableAnswer = new ObservableField<>;
    

    【讨论】:

      【解决方案2】:

      你可以这样做:
      首先,您需要创建一个模型类,它的属性只能是您的状态。 e.g.

      class State(@AnswerState val state: Int)
      

      之后,您可以创建您刚刚创建的这种新类型的新 LiveData 对象。 e.g.

      private val _answerState = MutableLiveData(State(UNANSWERED))
      val answerState: LiveData<State>
          get() = _answerState
      

      当您需要将您的价值发布到LiveData 时,您将执行以下操作

      _answerState.postValue(State(ANSWERED_CORRECTLY))
      

      要观察这些值,在您的 Activity 类中,您将像这样注册观察者

      viewModel.answerState.observe(this) {
          when (it.state) {
              // The compiler will suggest the remaining branches        
          }
      }
      

      之后,点击when并点击alt + enter,编译器会建议添加剩余的分支,即UNANSWERED, ANSWERED_CORRECTLY, ANSWERED_INCORRECTLY, CHEATED

      就是这样 :) 编译器将为每个状态生成一个新分支,您可以相应地进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多