grandstaish
05/20/2020, 3:45 PMVinay Gaba
05/20/2020, 4:50 PMload is taking longer than X milliseconds to complete
grandstaish
05/20/2020, 4:57 PMLeland Richardson [G]
05/20/2020, 5:17 PMlaunchInComposition
🙂Adam Powell
05/20/2020, 5:56 PMgrandstaish
05/20/2020, 6:56 PMAdam Powell
05/20/2020, 9:20 PMTimo Drick
05/21/2020, 1:13 AMsealed class LoadingState<out T: Any> {
object Start: LoadingState<Nothing>()
object Loading : LoadingState<Nothing>()
class Error(val error: Throwable): LoadingState<Nothing>()
class Success<T: Any>(val data: T): LoadingState<T>()
}
@Composable
fun <T: Any> loadingStateFor(vararg inputs: Any?, initBlock: () -> LoadingState<T>, disposeBlock: () -> Unit = {}, loadingBlock: suspend CoroutineScope.() -> T): LoadingState<T> {
var state by stateFor(*inputs, init = initBlock)
onCommit(*inputs) {
val job = if (state !is LoadingState.Success) {
CoroutineScope(Dispatchers.Main.immediate).launch {
val loadingSpinnerDelay = async {
delay(500)
state = LoadingState.Loading
}
state = try {
LoadingState.Success(loadingBlock())
} catch (err: Throwable) {
LoadingState.Error(err)
} finally {
loadingSpinnerDelay.cancelAndJoin()
}
}
} else null
onDispose {
job?.cancel()
disposeBlock()
}
}
return state
}