代码A来自LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case)。
navigateToDetails
是val变量,所以我认为代码B可以完成相同的工作,对吗?
代码A
class ListViewModel : ViewModel {
private val _navigateToDetails = MutableLiveData<Event<String>>()
val navigateToDetails : LiveData<Event<String>> get() = _navigateToDetails
fun userClicksOnButton(itemId: String) {
_navigateToDetails.value = Event(itemId) // Trigger the event by setting a new Event as a new value
}
}
代码B
class ListViewModel : ViewModel {
private val _navigateToDetails = MutableLiveData<Event<String>>()
val navigateToDetails : LiveData<Event<String>> = _navigateToDetails
fun userClicksOnButton(itemId: String) {
_navigateToDetails.value = Event(itemId) // Trigger the event by setting a new Event as a new value
}
}
答案 0 :(得分:2)
是的,这里不需要get()
。
添加get()
会使每次访问属性时重新评估=
之后的表达式。在这种情况下,它只是指向一个只读属性,因此无论如何每次都会以相同的方式求值。如果该表达式指向一个可变属性,或者也许是基于某个可变属性的when
语句,则您可能需要使用显式getter,以便在对象状态更改时基础值也会更改。相反,如果只希望在初始化期间对表达式求值一次,然后无论如何总是返回相同的值,则您将不需要定义getter。
请注意,get() =
是get() { /* ... */ }
的简写,类似于编写单表达式函数时可以使用的简写。 get()
表示您正在为属性定义一个getter函数。裸露的=
表示您正在初始化期间为后备字段分配一个值。
答案 1 :(得分:1)
get()
的点很小,但是存在;代码B在两个字段中存储相同的引用,因此为此类的每个实例使用更多的内存。当然,在这种情况下,ListViewModel
的实例可能很少,因此在实践中不太重要。