Я реализовал функцию, которую я использовал для перехода к 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) } } }