Kotlin smart cast не работает для LinearLayout.LayoutParams

Я реализовал функцию, которую я использовал для перехода к anko`s applyRecursively.

Внутри этой функции я хотел бы добавить marginEnd, это представление находится внутри LinearLayout, поэтому я написал следующий код:

when(view.layoutParams) { is LinearLayout.LayoutParams -> { view.layoutParams.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) } } 

И я получаю сообщение об ошибке, что view.layoutParams является изменчивым свойством, которое могло быть изменено. Поэтому мне пришлось заставить бросить:

 when(view.layoutParams) { is LinearLayout.LayoutParams -> { (view.layoutParams as LinearLayout.LayoutParams).marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) } } 

Глядя сюда на stackoverflow, я увидел, что Kotlin не умеет использовать переменные, которые могут быть нулевыми, но view.layoutParams не имеет значения NULL, поэтому почему смарт-литье не может вывести тип?

Смарт-приведение не будет работать в этом случае, потому что тип переменной, которую вы проверили, может измениться после того, как эта проверка прошла успешно (например, другим потоком), и если бы это произошло, вы получили бы когда вы пытаетесь выполнить его.

Решение состоит в том, чтобы сделать бросок вручную так же, как и вы, или ввести временный val для вашей функции, на который умный актер будет работать, поскольку мы знаем, что его тип не изменится:

 val params = view.layoutParams when(params) { is LinearLayout.LayoutParams -> { params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) } } 

Изменить: в качестве дополнительной заметки вы также можете ввести эту переменную, используя let :

 view.layoutParams.let { params -> when(params) { is LinearLayout.LayoutParams -> { params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing) } } }