代码
下面是我写的代码,使用 stateflow 来发送数据,主要看注释 1 和 2 处代码即可。
class MyViewModel : ViewModel() {
var list = mutableListOf<ImageUrl>()
val stateflow= MutableStateFlow<List<ImageUrl>?>(list)//1
var state=1
val retrofit:MyInterface= Retrofit.Builder()
.baseUrl("https://api.uomg.com/")
.client(OkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build().create(MyInterface::class.java)
fun getImage(){
viewModelScope.launch {
( 0 until 10).forEach {
val image= retrofit.getImage("胖次猫","json")
list.add(image)
state=-state
Log.d("test1234","${image.imgurl}")
}
stateflow.emit(list.toMutableList())//2
}
}
}
解析
很明显发送的一直是同一个 list,即使这个 list 改变了,但是 StateFlow 内部在比较新旧值时会得到相等的结果。
源码解释
看蓝色部分代码,会比较 old 和 new 是否相等 list.toMutable 和 list 是完全相等的。
解决办法
每次 emit 时,创建一个新的 ArrayList ,内容上与当前的 list 相同。
解决代码
class MyViewModel : ViewModel() {
var list = mutableListOf<ImageUrl>()
val stateflow= MutableStateFlow<List<ImageUrl>?>(ArrayList(list))
var state=1
val retrofit:MyInterface= Retrofit.Builder()
.baseUrl("https://api.uomg.com/")
.client(OkHttpClient())
.addConverterFactory(GsonConverterFactory.create())
.build().create(MyInterface::class.java)
fun getImage(){
viewModelScope.launch {
( 0 until 10).forEach {
val image= retrofit.getImage("胖次猫","json")
list.add(image)
state=-state
Log.d("test1234","${image.imgurl}")
}
stateflow.emit(ArrayList(list))
}
}
}