You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何要向BindingInflater Lambda传入LayoutInflater参数?

关于ViewBinding抽象类模板中LayoutInflater参数的疑问

我是Android开发新手,完全搞不懂这个基于抽象类实现ViewBinding的模板。核心疑问是:为什么要给bindingInflater这个Lambda传入LayoutInflater参数?看起来我们并没有显式使用这个参数,这让我摸不清整个模板的工作逻辑。

模板代码

abstract class BindingFragment<out T : ViewBinding> : Fragment() {

    private var _binding: ViewBinding? = null
    @Suppress("UNCHECKED_CAST")
    protected val binding: T
        get() = _binding as T

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        _binding = bindingInflater(inflater)
        return _binding!!.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    protected abstract val bindingInflater: (LayoutInflater) -> ViewBinding
}

Fragment使用示例

class LoginFragment : BindingFragment<FragmentLoginBinding>() {

    override val bindingInflater: (LayoutInflater) -> ViewBinding
        get() = FragmentLoginBinding::inflate

    private val viewModel: LoginViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.btnConfirm.setOnClickListener {...}
    }
}

我问过一些开发者,但没得到清晰的解释,他们的说法包括:

  • “inflater只是inflate绑定函数的引用。ViewBinding接口没有inflate方法,但每个实现类都有,因此必须手动传递。”
  • “你写的是ViewBinding::inflate方法的引用,该方法接收inflater参数,为了能指向该方法,参数必须匹配。”

我已经理解了out修饰符、::操作符、类型转换、泛型以及Kotlin的Getter/Setter机制,但还是搞不懂这段代码的逻辑。

内容的提问来源于stack exchange,提问作者NikshA36

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:42:42