Skip to content

重命名 BaseVBActivity ,移除 BaseDbActivity 、 BaseDbFragment - #55

Open
wkbin wants to merge 2 commits into
hegaojian:modularfrom
wkbin:wkbin
Open

重命名 BaseVBActivity ,移除 BaseDbActivity 、 BaseDbFragment#55
wkbin wants to merge 2 commits into
hegaojian:modularfrom
wkbin:wkbin

Conversation

@wkbin

@wkbin wkbin commented Sep 23, 2025

Copy link
Copy Markdown

重命名 BaseVBActivity 为 BaseVbActivity

  • 统一命名规范

删除 BaseDbActivity / BaseDbFragment

  • 直接使用 BaseVbActivity / BaseVbFragment (DataBinding 实现了 ViewBinding 接口)

- 直接使用 BaseVbActivity / BaseVbFragment (DataBinding 实现了 ViewBinding 接口)

Closes hegaojian#32
@hegaojian

Copy link
Copy Markdown
Owner

感谢兄弟提来的PR,但是目前还不能移除 BaseDbActivity 和 BaseDbFragment。
因为项目里还有其他兄弟在使用 DataBinding,他们需要在 XML 中直接绑定 ViewModel 的数据(@{} 表达式),如果去掉 DataBinding 就会失去这个能力。
虽然 DataBinding 底层确实实现了 ViewBinding 的功能,如果只是做控件绑定(不写表达式),它的行为和 ViewBinding 是一致的。但为了兼容不同的使用习惯,还是需要同时保留的

@wkbin

wkbin commented Sep 24, 2025

Copy link
Copy Markdown
Author

感谢兄弟提来的PR,但是目前还不能移除 BaseDbActivity 和 BaseDbFragment。因为项目里还有其他兄弟在使用 DataBinding,他们需要在 XML 中直接绑定 ViewModel 的数据(@{} 表达式),如果去掉 DataBinding 就会失去这个能力。虽然 DataBinding 底层确实实现了 ViewBinding 的功能,如果只是做控件绑定(不写表达式),它的行为和 ViewBinding 是一致的。 但为了兼容不同的使用习惯,还是需要同时保留的

我并没有移除databinding,我的意思是即使使用了databinding,也可以去继承BaseVbActivity和BaseVbFragment,因为Databinding同意实现了Viewbinding接口,所以直接用BaseVbActivity和BaseVbFragmen就可以了,BaseDb是多余的,他们完全可以用同一个

@hegaojian

Copy link
Copy Markdown
Owner

我明白你的意思了,你的说法是对的,是可以优化一下,比如这样:

abstract class BaseVBActivity<VM : BaseViewModel,VB: ViewBinding> : BaseVmActivity<VM>(),BaseIView {

    //使用了 ViewBinding 就不需要 layoutId了,因为 会从 VB 泛型 找到相关的view
    override val layoutId: Int = 0
    lateinit var mBind: VB

    override fun initViewDataBind(): View? {
        //利用反射 根据泛型得到 ViewDataBinding
        mBind = inflateBinding()
        if (mBind is ViewDataBinding) {
            (mBind as ViewDataBinding).lifecycleOwner = this
        }
        BackgroundLibrary.inject(this)
        return mBind.root
    }
}

而大家自己的BaseActivity 如果想用DataBinding 可以这样子 直接泛型继承ViewDataBinding就行:

abstract class BaseActivity<VM : BaseViewModel, VB : ViewDataBinding> : BaseVBActivity<VM, VB>() {
}

@wkbin

wkbin commented Sep 24, 2025

Copy link
Copy Markdown
Author

inflateBinding

我觉得你什么都不用做,因为你的inflateBinding扩展函数已经进行了Databinding的判断

@JvmName("inflateBinding")
fun <VB : ViewBinding> AppCompatActivity.inflateBinding(): VB =
    bindingClass<VB>(this) { clazz ->
        clazz.getMethod("inflate", LayoutInflater::class.java).invoke(null, layoutInflater) as VB
    }.also { binding ->
        if (binding is ViewDataBinding) {
            binding.lifecycleOwner = this
        }
    }

@hegaojian

Copy link
Copy Markdown
Owner

.. 我都忘记这里家里这个判断了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants