Daniele B
03/21/2021, 5:35 PMinline fun <reified T:Any> getResponse(endpoint : String): T? {
val newObj = T()
....
}
Youssef Shoaib [MOD]
03/21/2021, 5:43 PMinline fun <reified T:Any> getResponse(endpoint : String, creator: () -> T): T? {
val newObj = creator()
....
}
// Call site
getResponse(endpoint, ::Test) //uses Test's no argument constructor
getResponse(endpoint) { new MyClass(arg1, arg2, arg3) }
Daniele B
03/21/2021, 5:53 PMDaniele B
03/21/2021, 5:53 PMclass ScreenState<T>(
val isLoading: Boolean = false,
val screenData: T? = null,
)
inline fun <reified T:Any> getScreenState(screenState: ScreenState<T>) : ScreenState<T> {
var screenData = screenState.screenData
if (screenData == null) {
val screenData = T()
}
return ScreenState<T>(screenState.isLoading, screenData)
}
Youssef Shoaib [MOD]
03/21/2021, 5:57 PMclass ScreenState<T>(
val isLoading: Boolean = false,
val screenData: T? = null,
)
inline fun <reified T:Any> newScreenState(screenState: ScreenState<T>, dataCreator: () -> T) : ScreenState<T> {
var screenData = screenState.screenData
if (screenData == null) {
val screenData = dataCreator()
}
return ScreenState<T>(screenState.isLoading, screenData)
}
// Call site
newScreenState(myDetailState) { new DetailData(CountryInfo(), ...) }
Daniele B
03/21/2021, 5:59 PMDaniele B
03/21/2021, 5:59 PMDaniele B
03/21/2021, 5:59 PMYoussef Shoaib [MOD]
03/21/2021, 6:00 PMDaniele B
03/21/2021, 6:01 PMDaniele B
03/21/2021, 6:03 PMYoussef Shoaib [MOD]
03/21/2021, 6:07 PMinline fun <reified T:Any> newScreenState(screenState: ScreenState<T>) : ScreenState<T> {
var screenData = screenState.screenData
if (screenData == null) {
val screenData = T::class.primaryConstructor!!.callBy()
}
return ScreenState<T>(screenState.isLoading, screenData)
}
Basically any KClass instance has a primary constructor that is either a KFunction
or null, and so you can then attempt to call that KFunction
with no parameters and let it blow up if it doesn't accept zero arguments. That will account for optional parameters in your use case so this should work just fineDaniele B
03/21/2021, 6:10 PMYoussef Shoaib [MOD]
03/21/2021, 6:12 PMinline fun <reified T:Any> newScreenState(screenState: ScreenState<T>) : ScreenState<T> {
var screenData = screenState.screenData
if (screenData == null) {
val screenData = T::class.constructors.first { it.parameters.all { it.isOptional } }.callBy()
}
return ScreenState<T>(screenState.isLoading, screenData)
}
Youssef Shoaib [MOD]
03/21/2021, 6:12 PMDaniele B
03/21/2021, 6:13 PMYoussef Shoaib [MOD]
03/21/2021, 6:14 PM