Use view binding property delegate (#22)

This commit is contained in:
Kirill Kamakin
2021-12-27 11:37:10 +03:00
committed by GitHub
parent 7bd9d20e9d
commit a36fec226d
6 changed files with 21 additions and 89 deletions

View File

@@ -159,4 +159,7 @@ dependencies {
def stetho_version = "1.6.0" def stetho_version = "1.6.0"
implementation "com.facebook.stetho:stetho:$stetho_version" implementation "com.facebook.stetho:stetho:$stetho_version"
implementation "com.facebook.stetho:stetho-okhttp3:$stetho_version" implementation "com.facebook.stetho:stetho-okhttp3:$stetho_version"
// https://github.com/androidbroadcast/ViewBindingPropertyDelegate/releases
implementation "com.github.kirich1409:viewbindingpropertydelegate-noreflection:1.5.3"
} }

View File

@@ -1,9 +1,7 @@
package gq.kirmanak.mealient.ui.auth package gq.kirmanak.mealient.ui.auth
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@@ -11,6 +9,7 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R import gq.kirmanak.mealient.R
@@ -24,10 +23,8 @@ import timber.log.Timber
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
@AndroidEntryPoint @AndroidEntryPoint
class AuthenticationFragment : Fragment() { class AuthenticationFragment : Fragment(R.layout.fragment_authentication) {
private var _binding: FragmentAuthenticationBinding? = null private val binding by viewBinding(FragmentAuthenticationBinding::bind)
private val binding: FragmentAuthenticationBinding
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
private val viewModel by viewModels<AuthenticationViewModel>() private val viewModel by viewModels<AuthenticationViewModel>()
private val authStatuses by lazy { viewModel.authenticationStatuses() } private val authStatuses by lazy { viewModel.authenticationStatuses() }
@@ -46,16 +43,6 @@ class AuthenticationFragment : Fragment() {
authStatuses.observe(this, authStatusObserver) authStatuses.observe(this, authStatusObserver)
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState")
_binding = FragmentAuthenticationBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
@@ -129,10 +116,4 @@ class AuthenticationFragment : Fragment() {
input.textChangesFlow().filterNotNull().first { it.isNotEmpty() } input.textChangesFlow().filterNotNull().first { it.isNotEmpty() }
Timber.v("waitUntilNotEmpty() returned") Timber.v("waitUntilNotEmpty() returned")
} }
override fun onDestroyView() {
super.onDestroyView()
Timber.v("onDestroyView() called")
_binding = null
}
} }

View File

@@ -1,23 +1,20 @@
package gq.kirmanak.mealient.ui.disclaimer package gq.kirmanak.mealient.ui.disclaimer
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import by.kirich1409.viewbindingdelegate.viewBinding
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.databinding.FragmentDisclaimerBinding import gq.kirmanak.mealient.databinding.FragmentDisclaimerBinding
import timber.log.Timber import timber.log.Timber
@AndroidEntryPoint @AndroidEntryPoint
class DisclaimerFragment : Fragment() { class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer) {
private var _binding: FragmentDisclaimerBinding? = null private val binding by viewBinding(FragmentDisclaimerBinding::bind)
private val binding: FragmentDisclaimerBinding
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
private val viewModel by viewModels<DisclaimerViewModel>() private val viewModel by viewModels<DisclaimerViewModel>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -40,16 +37,6 @@ class DisclaimerFragment : Fragment() {
findNavController().navigate(DisclaimerFragmentDirections.actionDisclaimerFragmentToAuthenticationFragment()) findNavController().navigate(DisclaimerFragmentDirections.actionDisclaimerFragmentToAuthenticationFragment())
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState")
_binding = FragmentDisclaimerBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
@@ -68,10 +55,4 @@ class DisclaimerFragment : Fragment() {
(requireActivity() as? AppCompatActivity)?.supportActionBar?.title = (requireActivity() as? AppCompatActivity)?.supportActionBar?.title =
getString(R.string.app_name) getString(R.string.app_name)
} }
override fun onDestroyView() {
super.onDestroyView()
Timber.v("onDestroyView() called")
_binding = null
}
} }

View File

@@ -1,16 +1,16 @@
package gq.kirmanak.mealient.ui.recipes package gq.kirmanak.mealient.ui.recipes
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import by.kirich1409.viewbindingdelegate.viewBinding
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.recipes.db.entity.RecipeSummaryEntity import gq.kirmanak.mealient.data.recipes.db.entity.RecipeSummaryEntity
import gq.kirmanak.mealient.databinding.FragmentRecipesBinding import gq.kirmanak.mealient.databinding.FragmentRecipesBinding
import gq.kirmanak.mealient.ui.auth.AuthenticationViewModel import gq.kirmanak.mealient.ui.auth.AuthenticationViewModel
@@ -21,10 +21,8 @@ import timber.log.Timber
@ExperimentalCoroutinesApi @ExperimentalCoroutinesApi
@AndroidEntryPoint @AndroidEntryPoint
class RecipesFragment : Fragment() { class RecipesFragment : Fragment(R.layout.fragment_recipes) {
private var _binding: FragmentRecipesBinding? = null private val binding by viewBinding(FragmentRecipesBinding::bind)
private val binding: FragmentRecipesBinding
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
private val viewModel by viewModels<RecipeViewModel>() private val viewModel by viewModels<RecipeViewModel>()
private val authViewModel by viewModels<AuthenticationViewModel>() private val authViewModel by viewModels<AuthenticationViewModel>()
@@ -38,16 +36,6 @@ class RecipesFragment : Fragment() {
} }
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState")
_binding = FragmentRecipesBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState") Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
@@ -89,10 +77,4 @@ class RecipesFragment : Fragment() {
} }
} }
} }
override fun onDestroyView() {
super.onDestroyView()
Timber.v("onDestroyView() called")
_binding = null
}
} }

View File

@@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import by.kirich1409.viewbindingdelegate.viewBinding
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@@ -17,9 +18,7 @@ import timber.log.Timber
@AndroidEntryPoint @AndroidEntryPoint
class RecipeInfoFragment : BottomSheetDialogFragment() { class RecipeInfoFragment : BottomSheetDialogFragment() {
private var _binding: FragmentRecipeInfoBinding? = null private val binding by viewBinding(FragmentRecipeInfoBinding::bind)
private val binding: FragmentRecipeInfoBinding
get() = checkNotNull(_binding) { "Binding requested when fragment is off screen" }
private val arguments by navArgs<RecipeInfoFragmentArgs>() private val arguments by navArgs<RecipeInfoFragmentArgs>()
private val viewModel by viewModels<RecipeInfoViewModel>() private val viewModel by viewModels<RecipeInfoViewModel>()
@@ -29,8 +28,7 @@ class RecipeInfoFragment : BottomSheetDialogFragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState") Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState")
_binding = FragmentRecipeInfoBinding.inflate(inflater, container, false) return FragmentRecipeInfoBinding.inflate(inflater, container, false).root
return binding.root
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -53,10 +51,4 @@ class RecipeInfoFragment : BottomSheetDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
BottomSheetDialog(requireContext(), R.style.NoShapeBottomSheetDialog) BottomSheetDialog(requireContext(), R.style.NoShapeBottomSheetDialog)
override fun onDestroyView() {
super.onDestroyView()
Timber.v("onDestroyView() called")
_binding = null
}
} }

View File

@@ -1,21 +1,19 @@
package gq.kirmanak.mealient.ui.splash package gq.kirmanak.mealient.ui.splash
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import gq.kirmanak.mealient.databinding.FragmentSplashBinding import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.setActionBarVisibility import gq.kirmanak.mealient.ui.setActionBarVisibility
import gq.kirmanak.mealient.ui.setSystemUiVisibility import gq.kirmanak.mealient.ui.setSystemUiVisibility
import timber.log.Timber import timber.log.Timber
@AndroidEntryPoint @AndroidEntryPoint
class SplashFragment : Fragment() { class SplashFragment : Fragment(R.layout.fragment_splash) {
private val viewModel by viewModels<SplashViewModel>() private val viewModel by viewModels<SplashViewModel>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -27,15 +25,10 @@ class SplashFragment : Fragment() {
} }
} }
override fun onCreateView( override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
inflater: LayoutInflater, super.onViewCreated(view, savedInstanceState)
container: ViewGroup?, Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
savedInstanceState: Bundle?
): View {
Timber.v("onCreateView() called with: inflater = $inflater, container = $container, savedInstanceState = $savedInstanceState")
val binding = FragmentSplashBinding.inflate(inflater, container, false)
changeFullscreenState(true) changeFullscreenState(true)
return binding.root
} }
override fun onDestroyView() { override fun onDestroyView() {