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 和使用方式。

相关推荐
Android出海2 小时前
Google Play账户与App突遭封禁?紧急应对与快速重构上架策略
android·网络·重构·新媒体运营·产品运营·内容运营
恋猫de小郭2 小时前
Flutter 官方 LLM 动态 UI 库 flutter_genui 发布,让 App UI 自己生成 UI
android·前端·flutter
锅拌饭3 小时前
saveEnabled导致的Fragment大量泄露
android
叽哥3 小时前
Kotlin学习第 3 课:Kotlin 流程控制:掌握逻辑分支与循环的艺术
android·java·kotlin
CYRUS_STUDIO3 小时前
别让 so 裸奔!移植 OLLVM 到 NDK 并集成到 Android Studio
android·android studio·llvm
尚久龙3 小时前
安卓学习 之 图片控件和图片按钮
android·java·学习·手机·android studio·安卓
东风西巷3 小时前
Don‘t Sleep:保持电脑唤醒,确保任务不间断
android·电脑·软件需求
tangweiguo030519873 小时前
FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践
android·flutter
葱段4 小时前
【Flutter】TextField 监听长按菜单粘贴点击事件
android·flutter·dart
用户094 小时前
Gradle 现代化任务依赖方案
android·kotlin