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

相关推荐
雨白5 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹7 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空8 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭9 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日10 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安10 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑10 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟14 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡15 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0015 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体