kotlin BehaviorSubject是否具有可空类型?

ia2d9nvy  于 2023-03-24  发布在  Kotlin
关注(0)|答案(2)|浏览(169)

我所寻找的是类似BehaviorSubject<Object?>的东西。不幸的是BehaviorSubject抛出NullPointerExceptions,即使类型是可空的。
根据文档,BehaviorSubject不允许null作为onNext的参数。与ReplaySubject一样,我已经看到建议作为BehaviorSubject的替代品。
我在后端的BehaviorSubject中存储了一个值,它需要是可观察的(由我前端的一些LiveData),但它不是一个存在于所有示例的值,因此可以为空。

s4n0splo

s4n0splo1#

不能在BehaviorSubject中使用可空类型,这实际上是一件好事(有些人可能不同意)。
我建议使用一个sealed类,而不是一个“空”和一个有效的子类,比如:

sealed class Profile {
   object Empty:Profile()

   data class Data(val name:String, val age:UInt):Profile()
}

这样就可以区分空(“null”)和可用状态。
因此,只需创建主题如下:

val profileSubject = BehaviorSubject.create<Profile>()

然后根据类型处理数据:

profileSubject.subscribe { profile ->
  when(profile) {
    is Profile.Data -> showProfile(profile)
    Profile.Empty -> showProgressBar()
  }
}
xn1cxnb4

xn1cxnb42#

你的问题不是BehaviorSubject,而是类型。与流行的观点相反,Object?不是一个可空的对象,它是一个 * 可选 * 对象,其中的值可以是对象或未定义。
你想要的是这个:

let mySubject = new BehaviorSubject<object | null>(null);
mySubject.subscribe(x => {
  console.log(x);
});

或者,您可以在原始代码中使用undefined而不是null,这两种方法都可以工作。
你可以在这里读到更多:https://tutorialsforangular.com/2021/02/08/optional-vs-nullable-in-typescript-angular/

相关问题