KunMinX / Jetpack-MVVM-Best-Practice

难得一见 Jetpack MVVM 最佳实践!在 "以简驭繁" 代码中,对 "视图控制器" 乃至 "标准化开发模式" 形成正确、深入理解!
8.87k stars 1.63k forks source link

请教在使用Databinding时Activity不获取 view 实例的原则下, Activity如何调用自定义View的方法, #229

Closed brady2037 closed 1 year ago

brady2037 commented 1 year ago

场景如下: 登陆页面实现发送验证码倒计时按钮时,自定义View:

public class EditTextVerificationCode extends LinearLayout {
   public void sendCodeSuccess() {
       //开始倒计时逻辑
   }
}

使用了strict_databinding库,看到

(警惕使用。非必要情况下,尽可能不在子类中拿到 binding 实例乃至获取 view 实例。使用即埋下隐患)

在不获取view实例的原则下, Activity如何优雅的在调用发送验证码接口成功后调用sendSuccess(), 还是说这种场景下还是获取view实例比较合适

目前是通过@BindingAdapter方式,在Activity定义State,接口成功后setState(true)

@BindingAdapter(value = {"sendCodeStatus"}, requireAll = false)
public static void sendCodeStatusChange(EditTextVerificationCode verificationCode, boolean isSend) {
    if (isSend) {
        verificationCode.sendSuccess();
    }
}
 public static class LoginStates extends StateHolder {
        public final State<Boolean> sendCodeStatus = new State<>(false);
}
<com.example.ble.ui.view.EditTextVerificationCode
  android:layout_width="0dp"
  android:layout_height="45dp"
  sendCodeStatus="@{vm.sendCodeStatus}">
KunMinX commented 1 year ago

目前来说,确实没有更优雅办法。 通过 State 类配合 boolean 或任意类型变量的推送,变相完成一次刷新通知。