kotlin flow的写法

以下是 Android 开发中 Kotlin Flow 的常见使用模式和操作符的完整中文总结:


1. 基本 Flow 创建方式

kotlin 复制代码
// 从多个值创建
val flow1 = flowOf(1, 2, 3)

// 使用 flow 构建器
val flow2 = flow {
    emit(1)
    delay(100)
    emit(2)
}

// 从集合创建
val flow3 = listOf(1, 2, 3).asFlow()

2. 转换操作符

kotlin 复制代码
someFlow
    .map { it * 2 }                    // 转换每个值
    .filter { it > 0 }                 // 过滤值
    .take(3)                           // 取前3个值
    .drop(1)                           // 跳过前1个值
    .distinctUntilChanged()            // 只有值变化时才发射

3. Flow 组合

kotlin 复制代码
// 合并最新值
val combined = combine(flow1, flow2) { a, b -> 
    "$a-$b" 
}

// 按对应顺序压缩
val zipped = flow1.zip(flow2) { a, b -> 
    "$a-$b" 
}

// 合并多个 Flow(谁先来发谁)
val merged = merge(flow1, flow2)

4. 创建 StateFlow

kotlin 复制代码
// 从 MutableStateFlow 创建
private val _state = MutableStateFlow(0)
val state: StateFlow<Int> = _state.asStateFlow()

// 从 Flow 转换为 StateFlow
val stateFlow = someFlow.stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5000),
    initialValue = defaultValue
)

5. Flow 控制操作

kotlin 复制代码
someFlow
    .debounce(300)                     // 防抖处理
    .buffer(Channel.BUFFERED)          // 缓存处理
    .retry(3)                          // 出错重试3次
    .catch { e -> handle(e) }          // 错误捕获处理
    .onStart { showLoading() }         // 开始前回调
    .onCompletion { hideLoading() }    // 完成后回调

6. 调度与线程切换

kotlin 复制代码
someFlow
    .flowOn(Dispatchers.IO)            // 指定上游线程
    .conflate()                        // 合并中间值(只保留最新)
    .buffer()                          // 用独立协程缓冲

7. SharedFlow 使用

kotlin 复制代码
private val _events = MutableSharedFlow<Event>(
    replay = 0,
    extraBufferCapacity = 1
)
val events = _events.asSharedFlow()

8. Flow 收集方式

kotlin 复制代码
// 在 ViewModel 中
someFlow
    .onEach { /* 处理数据 */ }
    .launchIn(viewModelScope)

// 在 UI 中
lifecycleScope.launch {
    repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.state.collect { /* 更新 UI */ }
    }
}

9. Flow 单元测试

kotlin 复制代码
@Test
fun testFlow() = runTest {
    val flow = flowOf(1, 2, 3)
        .map { it * 2 }
        .toList()
    
    assertEquals(listOf(2, 4, 6), flow)
}

10. Flow 错误处理

kotlin 复制代码
someFlow
    .catch { e -> emit(fallback) }     // 捕获错误并恢复
    .retryWhen { cause, attempt ->     // 高级重试机制
        attempt < 3 && cause is NetworkError
    }

这些模式涵盖了 Android 开发中 Kotlin Flow 的大多数使用场景,如状态管理、UI 响应、组合流、错误处理和性能优化等。

二 关于 Flow 的关键知识:

  1. Flow 的基本写法和操作符:
  • stateIn: 将普通 Flow 转为 StateFlow,提供初始值和生命周期控制
  • combine: 合并多个 Flow,任一 Flow 更新都会触发重新计算
  • map: 对 Flow 中的每个元素进行转换
  • onEach: 用于执行副作用
  1. Flow 相比 LiveData 的优势:
  • 更好的数据流组合能力(combine)
  • 原生支持异步操作
  • 支持流控(如 debounce)
  • 更友好的测试支持
  • 与 Jetpack Compose 完全兼容
  1. Flow 的常见使用场景:
  • ViewModel 向 UI 层暴露状态
  • 实现防抖和节流
  • 处理一次性事件(SharedFlow)
  • 数据库和网络请求响应式处理
  1. Flow 的最佳实践:
  • 在 ViewModel 中使用 StateFlow/SharedFlow
  • 使用 repeatOnLifecycle 进行生命周期感知的收集
  • 合理使用操作符组合流
  • 处理错误和异常情况
  • 在测试中使用 runTest
  1. Flow 在企业级应用中的应用:
  • 可用于实现 MVI 架构
  • 处理复杂的状态管理
  • 实现多模块通信
  • 处理用户交互事件

这些知识点是理解和使用 Flow 的基础。在实际开发中,需要根据具体场景选择合适的 Flow API 和使用方式。

相关推荐
ai2work5 分钟前
ch21 签名、校验与发版
kotlin
AFinalStone1 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 小时前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui
2501_916007471 小时前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
Android打工仔1 小时前
Kotlin 协程源码解析:协程是如何切换线程的?
android·kotlin
mmsx1 小时前
Android GIS系列 内存加锁、SQLite 开事务:矢量数据集双层并发设计
android·性能优化·app
Godikov1 小时前
没有 adb 怎么排查接口问题?给 OkHttp 加一个"永不炸"的文件日志拦截器
android
邪修king2 小时前
Re:Linux 系统篇(三十四):进程间通信开篇Chapter1 —— 匿名管道 pipe 深度拆解与代码实战
android·linux·运维·开发语言
AFinalStone2 小时前
Android7 SystemUI 源码解析(一)全景概览与架构设计
android·systemui