Kotlin Android中SharedFlow的get()写法差异及asSharedFlow使用疑问
1. 两种定义方式的差异
先看两种写法的代码:
写法一:
private val _userReviewData = MutableSharedFlow<Resource<ReviewResponse>>() val userReviewData get() = _userReviewData.asSharedFlow()
写法二:
private val _userReviewData = MutableSharedFlow<Resource<ReviewResponse>>() val userReviewData = _userReviewData.asSharedFlow()
二者核心区别在于userReviewData的初始化逻辑:
- 写法一用了自定义getter,每次外部访问
userReviewData时,都会调用一次_userReviewData.asSharedFlow(),生成一个新的SharedFlow包装实例(这个实例仅代理原MutableSharedFlow的事件,功能上和其他包装实例一致,但每次都会创建新对象)。 - 写法二是在类初始化时调用一次
asSharedFlow(),把返回的SharedFlow实例直接赋值给userReviewData,之后这个变量就固定指向同一个实例,不会重复创建对象。
实际使用中,两种写法的订阅功能效果一致,但写法二更高效,避免了重复创建包装对象的不必要开销。
2. 是否需要显式调用.asSharedFlow()?
必须显式调用。原因如下:
MutableSharedFlow是可变流,允许调用emit()、tryEmit()等方法发送事件;而SharedFlow是只读流,只能被订阅,不能主动发送事件。- 遵循封装原则,对外暴露只读的
SharedFlow可以避免外部代码直接操作可变流发送事件,保证数据流的单向性和可控性,防止意外的状态修改。
内容的提问来源于stack exchange,提问作者Ishika Singh
相关产品推荐
相关产品推荐

