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/

10-10 16:29