1

我有一个订阅表格:姓名、地址、本地等等……我希望能够使用Data Binding、处理和保存数据LiveDataSavedStateHandle

让我们假设: 1 wayData BindingLiveDataSavedStateHandle

private val _name: MutableLiveData<Boolean> = stateHandle.getLiveData("_name", "")
val name: LiveData<String> = _name

fun onNameChanged(editable: Editable) {
    _name.value = editable.toString()
}

<EditText
    android:text="@{viewModel.name}"
    android:afterTextChanged="@{viewModel::onNameChanged}"
    ...
/>

这行得通,但我认为我们可以做得更好:

  • @Parcelize class Form封装所有字段
  • 2-way Data Binding减少.xml代码

现在问题开始出现。
如何通知我内部的变化Form class以便能够坚持objectwith SavedState?尝试改进上面的代码或者2-way Data Binding我们正在失去控制实际上有优势吗?我还使用一些逻辑来启用提交按钮,如下所示:

private val _name: MutableLiveData<String> = stateHandle.getLiveData("_name", "")   
val name = _name.map { value -> {
    updateUi()
    return value}
}

private val _formValidLiveData = MutableLiveData<Unit>()
val submitEnable = _formValidLiveData.map { _ -> isFormValid() }
val submitAlpha = _formValidLiveData.map { _ -> if (isFormValid()) 1f else 0.5f }
...
private fun updateUi() {
    _formValidLiveData.value = Unit
}

同样,随着2-way Data Binding我失去控制,updateUi()EditText字段发生变化时我怎么能打电话?
谢谢你的时间。

4

1 回答 1

0

好的,遇到了类似的问题 - 并对此进行了测试,这似乎工作正常:

public class LoginViewModel extends AndroidViewModel {

  public final MutableLiveData<String> mUsername;
  private SavedStateHandle handle;

  public LoginViewModel(Application application, SavedStateHandle handle) {
    // If this is the first time entering the activity, mUsername will be created, populated by value 'BLAH' and stored in the handler.
    // else, this will will be the last set value
    mUsername = handle.getLiveData("mUsername", "BLAH");
  }
}

现在,我在 2-way 绑定用户名字段中输入了一些值,在 xml 中定义如下:

<com.google.android.material.textfield.TextInputLayout
     android:id="@+id/username_wrapper"
     android:layout_below="@id/header_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginBottom="@dimen/general_padding"
     android:theme="@style/TextInputLayoutAppearance"
     android:hint="@string/username">
       <com.google.android.material.textfield.TextInputEditText
          android:id="@+id/username_field"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="textEmailAddress"
           android:text="@={ viewModel.mUsername }"/>
      </com.google.android.material.textfield.TextInputLayout>

为了进行测试,我在该字段中输入了一些数据,然后按照下面链接的答案进行操作。该字段每次都设置为最新输入的值。为了确保这一点,我还在视图模型的构造函数中放置了一个断点 - 您可以看到该值已正确填充!因此,似乎有两种数据绑定方式可以正常工作。

导航离开时触发活动/视图模型销毁的链接:Android viewModel savedStateHandle

于 2020-10-21T12:29:13.837 回答