Sparround

Fragment lifecycle və idarəetməsi

Fragment — activity daxilində yenidənistifadə olunan UI hissəsidir. Kritik özəllik: fragmentin iki lifecycle-ı var:

  • Fragment-in özü: onAttach → onCreate → ... → onDestroy → onDetach
  • View-u: onCreateView → onViewCreated → ... → onDestroyView

Fragment back stack-də qalanda view məhv olur (onDestroyView), fragment obyekti qalır. Buna görə view-a istinadlar (binding) onDestroyView-da təmizlənməlidir — əks halda memory leak.

View-a bağlı müşahidələr üçün viewLifecycleOwner istifadə olunur, fragmentin özünün lifecycle-ı yox. LiveData/Flow-u fragmentin lifecycleOwner-i ilə müşahidə etmək köhnə view-lara istinad saxlayan bug-ların klassik səbəbidir.

kotlin
class AccountsFragment : Fragment(R.layout.fragment_accounts) {

    private var _binding: FragmentAccountsBinding? = null
    private val binding get() = _binding!!

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        _binding = FragmentAccountsBinding.bind(view)

        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.accounts.collect { binding.list.adapter?.let { a -> (a as AccountAdapter).submitList(it) } }
            }
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null   // leak-in qarşısını alır
    }
}

ViewBinding-in düzgün idarəsi və viewLifecycleOwner

Fragment-lər arası kommunikasiya müsahibə klassikasıdır. Müasir cavablar: (1) paylaşılan ViewModel (activityViewModels()), (2) Fragment Result API (setFragmentResultListener), (3) Navigation arqumentləri. Köhnə üsullar — interface callback-lər, birbaşa fragment istinadı — legacy sayılır; birbaşa istinad antipatterndir.

🛠 Tapşırıq

İki fragmentli kiçik axın qur (siyahı → detal, back stack ilə).

  • Fragment-in və viewLifecycleOwner-in lifecycle-larını ayrıca logla; detala keçib geri qayıt — fərqi gör.
  • Binding-i onDestroyView-da null-lama və LeakCanary-nin nə dediyinə bax, sonra düzəlt.
  • Nəticəni Fragment Result API ilə geri ötür.

Bitdi sayılır: "fragmentin niyə iki lifecycle-ı var" sualını öz log-larına istinadla izah edirsənsə.

📚 Mənbələr və sənədlər