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.
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
- Fragment lifecyclerəsmideveloper.android.com
- Fragment-lər arası kommunikasiyarəsmideveloper.android.com