2016-06-14 2 views
0

Почему вы не можете скопировать объект класса данных с изменением значения var?Котировка класса данных Kotlin с измененным значением var

data class AppState(var list: List<Image> = ArrayList<Image>(), 
       val uiState: UIState = UIState.LIST, 
       val isFetching: Boolean = false) 

... 

val list = state!!.list.sublist(0,1); 
state.copy(list = list)  // No change 
state.copy(isFetching = true) // Works like a charm 
+2

Вы знаете, что 'copy' возвращает новый экземпляр и не изменяет приемник? – nhaarman

ответ

6

Метод copy не изменяет первоначальный объект. Он возвращает новый объект с измененными значениями. Я попробовал ваш пример, и оба ваших копии работать, как и ожидался, когда я захвачу возвращенный объект в новом val:

val list = state!!.list.subList(0,1) 

// Creates a new object with the new list. 
val withNewList = state.copy(list = list) 

// Creates a new object with the new isFetching. 
val withNewIsFetching = withNewList.copy(isFetching = true) 

Если вы хотите, чтобы мутировать список-ценность вашего state -объекта, вы можете просто сделать это:

val list = state!!.list.subList(0,1) 
state.list = list 
+2

Кроме того, вы должны сделать 'val list = state? .list? .subList (0,1)?: EmptyList()' вместо использования '!!' -оператора, чтобы избежать NullPointerExceptions. – marstran

Смежные вопросы