Skip to content

Instantly share code, notes, and snippets.

View CostaFot's full-sized avatar
🍦

Costa Fotiadis CostaFot

🍦
View GitHub Profile
private class CooldownStateFlow<T>(
initialValue: T,
private val coroutineScope: CoroutineScope,
dispatcher: CoroutineDispatcher,
private val cooldownMillis: Long = 50L,
) {
private val singleThreadDispatcher = dispatcher.limitedParallelism(1)
private val _events =
MutableSharedFlow<T>().also {
coroutineScope.launch(singleThreadDispatcher) {
fun onRefresh() {
viewModelScope.launch {
isRefreshingState.update { true }
delay(2000) // simulate loading
isRefreshingState.update { false }
}
}
@HiltViewModel
class PullToRefreshViewModel @Inject constructor() : ViewModel() {
val isRefreshingState = MutableStateFlow(false)
fun onRefresh() {
viewModelScope.launch {
isRefreshingState.update { true }
isRefreshingState.update { false }
}
}
}
@Composable
private fun MainScreen(
viewModel: PullToRefreshViewModel = hiltViewModel()
) {
Box(
modifier = Modifier
.fillMaxWidth()
.background(Color.Blue)
) {
val isRefreshing: Boolean by viewModel.isRefreshingState.collectAsStateWithLifecycle()
@Composable
fun FirstScreen(
navigate: () -> Unit,
firstContainer: FirstContainer = rememberFirstContainer(),
firstViewModel: FirstViewModel = viewModel(factory = firstContainer.viewModelFactory)
) { // content here.. }
@Composable
fun rememberFirstContainer(): FirstContainer {
return remember {
@Composable
fun FirstScreen(
navigate: () -> Unit,
firstContainer: FirstContainer = FirstContainer().also {
DaggerFirstComponent.builder().build().inject(it)
},
firstViewModel: FirstViewModel = viewModel(factory = firstContainer.viewModelFactory)
) { }
@Component(
modules = [FirstModule::class, VmModule::class] // dagger modules here if needed
)
interface FirstComponent {
fun inject(firstContainer: FirstContainer) // inject the container instead of the activity/fragment
@Component.Builder
interface Builder {
fun build(): FirstComponent
@Stable
class FirstContainer {
@Inject lateinit var firstScreenTracker: FirstScreenTracker
@Inject lateinit var viewModelFactory: ViewModelFactory
}
class MainActivity : AppCompatActivity() {
@Inject lateinit var firstScreenTracker: FirstScreenTracker
@Inject lateinit var viewModelFactory: ViewModelFactory
override fun onCreate(savedInstanceState: Bundle?) {
DaggerFirstComponent.builder().build().inject(this) // build dagger component and inject
super.onCreate(savedInstanceState)
setContent {
@Composable
fun FirstScreen(
navigate: () -> Unit,
firstScreenTracker: FirstScreenTracker,
viewModelFactory: ViewModelFactory,
firstViewModel: FirstViewModel = viewModel(factory = viewModelFactory)
) {
// content...
}