Skip to content

Instantly share code, notes, and snippets.

View CostaFot's full-sized avatar
🍦

Costa Fotiadis CostaFot

🍦
View GitHub Profile
@Composable
fun GameScreen(
gameViewModel: GameViewModel = viewModel()
) {
// ...
}
@Composable
fun FirstScreen() {
val customRetainedViewModel = retain {
CustomRetainedViewModel()
}
val state by customRetainedViewModel.state.collectAsStateWithLifecycle()
// ....
}
@Composable
fun FirstScreen() {
val customRetainedViewModel = rememberRetainedViewModel<CustomRetainedViewModel>()
val state by customRetainedViewModel.state.collectAsStateWithLifecycle()
// .... rest of the owl
}
@Composable
inline fun <reified T : RetainedViewModel> rememberRetainedViewModel(): T {
val context = LocalContext.current
return retain {
val annotation =
T::class.java.getAnnotation(RetainedEntryPoint::class.java)
?: error("${T::class} must be annotated with @RetainedEntryPoint")
val entryPointClass = annotation.value.java
val entryPoint = EntryPoints.get(context, entryPointClass) as RetainedViewModelEntryPoint<T>
@EntryPoint
@InstallIn(ActivityComponent::class)
interface CustomRetainedViewModelEntryPoint : RetainedViewModelEntryPoint<CustomRetainedViewModel>
@RetainedEntryPoint(CustomRetainedViewModelEntryPoint::class)
class CustomRetainedViewModel @Inject constructor(
// ...
) : RetainedViewModel() {
// ...
}
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class RetainedEntryPoint(
val value: KClass<out Any>,
)
interface RetainedViewModelEntryPoint<T : RetainedViewModel> {
fun create(): T
}
@EntryPoint
@InstallIn(ActivityComponent::class)
interface CustomRetainedViewModelEntryPoint : RetainedViewModelEntryPoint<CustomRetainedViewModel>
@EntryPoint
@InstallIn(ActivityComponent::class)
interface CustomRetainedViewModelEntryPoint {
fun customRetainedViewModel(): CustomRetainedViewModel
}
@Composable
fun rememberCustomRetainedViewModel(): CustomRetainedViewModel {
val context = LocalContext.current
return retain {
val entryPoint = EntryPoints.get(context, CustomRetainedViewModelEntryPoint::class.java)
interface RetainedViewModelEntryPoint<T : RetainedViewModel> {
fun create(): T
}
class CustomRetainedViewModel @Inject constructor(
private val helloRepository: HelloRepository
) : RetainedViewModel() {