Skip to content

Instantly share code, notes, and snippets.

@vlas-ilya
Last active April 20, 2022 17:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vlas-ilya/cf7bc1bf8b4efa57acde4292b10c746c to your computer and use it in GitHub Desktop.
Save vlas-ilya/cf7bc1bf8b4efa57acde4292b10c746c to your computer and use it in GitHub Desktop.
ObserveLifecycle
package ru.test.app.ui.features.profile
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import ru.test.app.ui.navigation.Screen
import ru.test.app.ui.utils.composable.observe
@Composable
fun HomeScreen(
navController: NavHostController,
viewModel: HomeViewModel = hiltViewModel()
) {
LocalLifecycleOwner.current.lifecycle.observe {
onCreate {
// TODO
}
onStart {
// TODO
}
onResume {
// TODO
}
onPause {
// TODO
}
onStop {
// TODO
}
onDestroy {
// TODO
}
}
HomeScreenView(
toProfile = { navController.navigate(route = Screen.Profile.route) }
)
}
@Composable
fun HomeScreenView(
toProfile: () -> Unit
) {
Button(onClick = toProfile) {
Text(text = "To profile")
}
}
@Preview
@Composable
fun HomeScreenViewPreview() {
HomeScreenView(
toProfile = {}
)
}
package ru.test.app.ui.utils.composable
import androidx.compose.runtime.*
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
@Composable
fun Lifecycle.observe(
handlers: LifecycleScope.() -> Unit
) {
val observer = remember {
val lifecycleScope = LifecycleScopeImpl()
handlers(lifecycleScope)
lifecycleScope
}
DisposableEffect(this) {
this@observe.addObserver(observer)
onDispose { this@observe.removeObserver(observer) }
}
}
interface LifecycleScope {
fun onCreate(handler: (LifecycleOwner) -> Unit)
fun onStart(handler: (LifecycleOwner) -> Unit)
fun onResume(handler: (LifecycleOwner) -> Unit)
fun onPause(handler: (LifecycleOwner) -> Unit)
fun onStop(handler: (LifecycleOwner) -> Unit)
fun onDestroy(handler: (LifecycleOwner) -> Unit)
}
class LifecycleScopeImpl : LifecycleScope, DefaultLifecycleObserver {
private var _onCreate: (LifecycleOwner) -> Unit = {}
private var _onStart: (LifecycleOwner) -> Unit = {}
private var _onResume: (LifecycleOwner) -> Unit = {}
private var _onPause: (LifecycleOwner) -> Unit = {}
private var _onStop: (LifecycleOwner) -> Unit = {}
private var _onDestroy: (LifecycleOwner) -> Unit = {}
/// LifecycleScope
override fun onCreate(handler: (LifecycleOwner) -> Unit) {
this._onCreate = handler
}
override fun onStart(handler: (LifecycleOwner) -> Unit) {
this._onStart = handler
}
override fun onResume(handler: (LifecycleOwner) -> Unit) {
this._onResume = handler
}
override fun onPause(handler: (LifecycleOwner) -> Unit) {
this._onPause = handler
}
override fun onStop(handler: (LifecycleOwner) -> Unit) {
this._onStop = handler
}
override fun onDestroy(handler: (LifecycleOwner) -> Unit) {
this._onDestroy = handler
}
/// DefaultLifecycleObserver
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
this._onCreate(owner)
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
this._onStart(owner)
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
this._onResume(owner)
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
this._onPause(owner)
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
this._onStop(owner)
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
this._onDestroy(owner)
}
}
package ru.test.app.ui.features.profile
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import ru.test.app.ui.navigation.Screen
import ru.test.app.ui.utils.composable.observe
@Composable
fun ProfileScreen(
navController: NavHostController,
viewModel: ProfileViewModel = hiltViewModel()
) {
LocalLifecycleOwner.current.lifecycle.observe {
onResume {
// TODO
}
onPause {
// TODO
}
}
ProfileScreenView(
toHome = { navController.navigate(route = Screen.Home.route) }
)
}
@Composable
fun ProfileScreenView(
toHome: () -> Unit
) {
Button(onClick = toHome) {
Text(text = "To home")
}
}
@Preview
@Composable
fun ProfileScreenViewPreview() {
ProfileScreenView(
toHome = {}
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment