switchbutton icon indicating copy to clipboard operation
switchbutton copied to clipboard

点击后通过网络请求更新状态异常

Open aigc-in-all opened this issue 1 year ago • 1 comments

switcher.setOnStateChangedListener(object : SwitchView.OnStateChangedListener {
    override fun toggleToOn(view: SwitchView?) {
        viewModel.doSomethingAsync(1)
    }

    override fun toggleToOff(view: SwitchView?) {
        viewModel.doSomethingAsync(0)
    }
})

viewModel.state.observe(this) {
    switcher.setOpen(it)
}

如上场景,doSomethingAsync里会异步执行网络请求,如果请求成功会更新state (这是一个LiveData),更新成功后再通过observe 更新 open 状态。这是一个很正常的流程。

但是,如果网络请求失败,我希望什么都不做,即继续保持之前的状态。也即不会调用 switcher.setOpen 方法,但是我发现一个问题,再次点击无反应

查看源码,发现这里有问题:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if ((state == STATE_SWITCH_ON || state == STATE_SWITCH_OFF) && (sAnim * bAnim == 0)) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;
                case MotionEvent.ACTION_UP:
                    lastState = state;

                    bAnim = 1;
                    if (state == STATE_SWITCH_OFF) {
                        refreshState(STATE_SWITCH_OFF2);
                        listener.toggleToOn(this);
                    } else if (state == STATE_SWITCH_ON) {
                        refreshState(STATE_SWITCH_ON2);
                        listener.toggleToOff(this);
                    }

                    if (mOnClickListener != null) {
                        mOnClickListener.onClick(this);
                    }
                    break;
            }
        }
        return super.onTouchEvent(event);
    }

这个 if 进不去了,因为此时 state 状态为 STATE_SWITCH_OFF2STATE_SWITCH_ON2 ,那么这两个状态有什么用?

或者我的用法有什么问题吗?

aigc-in-all avatar Mar 21 '24 06:03 aigc-in-all

用这个toggleSwitch方法收尾延时变化

iielse avatar Mar 21 '24 07:03 iielse