为何要向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
相关产品推荐
相关产品推荐

