如何编写扩展函数简化Flow<BaseResourceEvent<T>>的类型转换逻辑?
解决方案
你可以通过为Flow<BaseResourceEvent<T>>编写通用扩展函数,统一处理Success类型的数据转换,同时自动透传Error和Loading事件,彻底消除冗余代码。
1. 确认BaseResourceEvent的密封类结构(若未定义)
这类资源事件通常设计为密封类:
sealed class BaseResourceEvent<out T> { data class Success<out T>(val data: T?) : BaseResourceEvent<T>() data class Error(val message: String?) : BaseResourceEvent<Nothing>() object Loading : BaseResourceEvent<Nothing>() }
2. 编写通用扩展函数
添加mapSuccessData扩展函数,专门处理Success事件中的数据转换:
fun <T, R> Flow<BaseResourceEvent<T>>.mapSuccessData(transform: (T) -> R): Flow<BaseResourceEvent<R>> { return map { event -> when (event) { is BaseResourceEvent.Success -> { event.data?.let { transformedData -> BaseResourceEvent.Success(transform(transformedData)) } ?: BaseResourceEvent.Success(null) // 保留原有的null数据行为 } is BaseResourceEvent.Error -> BaseResourceEvent.Error(event.message) BaseResourceEvent.Loading -> BaseResourceEvent.Loading } } }
如果你的Success类中data是非可空类型(即val data: T),可简化Success分支处理:
is BaseResourceEvent.Success -> BaseResourceEvent.Success(transform(event.data))
3. 使用扩展函数简化代码
现在只需一行代码即可替代原来的冗余逻辑:
return serviceCall { kullaniciRepository.getKullaniciBilgiByAPI() }.mapSuccessData { it.toDashBoardKullaniciBilgi() } .flowOn(ioDispatcher)
优势说明
- 复用性:该扩展函数可在所有需要转换
BaseResourceEvent数据类型的场景复用,无需重复编写判断逻辑 - 可读性:代码意图清晰,直接表明对Success事件的数据做转换
- 性能:用
map替代flatMapConcat+flowOf,减少不必要的流创建与合并操作,更高效
内容的提问来源于stack exchange,提问作者emreturka
相关产品推荐
相关产品推荐

