Почему мы предоставляем аргумент инфляции в лямбда-выражение BindingInflater?

1
7

Я новичок в разработке 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 г.

1 Ответ

Ваш ответ

Загрузить файл.