Kotlin 1.3.72,
RxJava2
我有以下代码,我正尝试避免使用!!运算符,但不确定为什么它认为该值为null,因此我需要使用安全调用运算符。
以后我必须使用!!这是不好的做法。为什么将其设为null,因为我已经声明了任何可为null的类型?
class SharedViewModel : ViewModel() {
private val compositeDisposable = CompositeDisposable()
private val imageSubject = BehaviorSubject.create<MutableList<Photo>>()
private val selectedPhotos = MutableLiveData<List<Photo>>()
init {
imageSubject.subscribeBy {
selectedPhotos.value = it
}.addTo(compositeDisposable)
}
fun getSelectedPhotos(): LiveData<List<Photo>> {
return selectedPhotos
}
fun addPhotos(photo: Photo) {
// Not sure why I need the safe-call operator here
imageSubject.value?.add(photo)
// Using the !! is bad practice and would like to avoid it
imageSubject.onNext(imageSubject.value!!)
// This is how I am currently handling it, but just wondering why the value would be null when it is not a nullable type?
if(imageSubject.value != null) {
imageSubject.onNext(imageSubject.value ?: mutableListOf())
}
}
}
===更新=====我进行了一些更改和更新。我的最后一个使用let。
fun addPhotos(photo: Photo) {
imageSubject.value?.add(photo)
// Original
imageSubject.onNext(imageSubject.value!!)
// First Attempt
if(imageSubject.value != null) {
imageSubject.onNext(imageSubject.value ?: mutableListOf())
}
// Final Attempt
imageSubject.value?.let {
imageSubject.onNext(it)
}
}
只是另一个问题:将某物添加到BehaviourSubject
imageSubject.value?.add(photo)
中,然后立即使用onNext imageSubject.onNext(it)
发出该值,是一种好习惯吗? 最佳答案
value
中的BehaviorSubject
可以为空,您可以检入Java代码,因为它内部具有@Nullable
批注。就像@skywall说的那样。
这就是使您需要在访问?
时定义安全调用(如!!
或bang等BehaviorSubject.value
)的原因。
默认情况下,BehaviorSubject
具有空值。因此,当您未设置任何默认值或未在BehaviorSubject
上发出任何内容时,它将始终为空值。imageSubject.value
返回null,因此不会调用add
方法。请注意,在调用?
方法之前,您先定义了安全调用add
。
因此,总而言之,两行代码不会发出任何东西。
来自您的评论
您可以像这样为BehaviorSubject
定义一个初始值
val imageSubject: BehaviorSubject<MutableList<Photo>> =
BehaviorSubject.createDefault(mutableListOf(photo1, photo2))
Here for more information但是,为
BehaviorSubject
定义默认值不会使value
成为不可为空的,因为它旨在接收可为空的对象。因此,为了让您不必担心安全通话或爆炸,您可以这样做
class SharedViewModel : ViewModel() {
private val compositeDisposable = CompositeDisposable()
private val imageSubject = BehaviorSubject.create<MutableList<Photo>>()
private val selectedPhotos = MutableLiveData<List<Photo>>()
private val photos = mutableListOf<Photo>() // Add this line
...
fun addPhotos(photo: Photo) {
photos.add(photo)
imageSubject.onNext(photos)
}
}
关于kotlin - Kotlin在onNext中传递mutableList或BehaviorSubject,不应为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63338882/