Я новичок в разработке Android и не могу полностью понять этот шаблон для ViewBinding с использованием абстрактного класса. Точнее, я не понимаю, почему мы передаем аргумент inflater в лямбда-функцию bindingInflater. Мы не используем этот параметр явно, и из-за этого мне сложно понять, как на самом деле работает этот шаблон.
Шаблон
Использование этого во фрагменте
Я задал этот вопрос нескольким разработчикам, и они не смогли четко ответить на него. Некоторые из них сказали мне следующее:
Я разобрался, как работает modefire и :: . Я знаю приведение, обобщения и как работают геттеры и сеттеры в Koltin.
Но этот code все еще непонятен для меня.
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
}
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 {...}
}
}
Артемий
Вопрос задан27 мая 2024 г.