Перейти к содержимому
Источник

Кулстори про обновление coil

У нас не так давно дошли руки до того, чтобы пообновлять часть зависимостей в проекте из соображений гигиены. И вот очередь coil. Версия 3.0 вышла в прошлом ноябре. Выждали паузу, так сказать, обновляемся.

В проекте есть вьюшное легаси, пусть и немного. Так вот, там тоже coil используется, и много где был такой синтаксис примерно:

imageView.load(url) { // Тут мы заходим в лямбду, где this - это ImageLoader.Builder
  placeholder(drawable1) // Задаёт плейсхолдер пока картинка грузится
  error(drawable2) // Задаёт плейсхлодер, если вдруг загрузить не получилось
}

И на регрессе в рантайме увидели краши. Начали копать. Оказалось ребята из койла там в рамках поддержки KMP (вроде бы) вытащили функцию error(drawableRes) из самого класса ImageLoader.Builder в экстеншн функцию. Угадайте что могло пойти не так?

-- тут пауза на подумать --

Когда вы вызываете функцию у билдера, то импорт её в файле писать не надо. Когда вы используете экстеншн функцию – её импорт писать надо. Т.к. импорта там не было, то функция error должна бы после этого не компилироваться, да ведь?) Ага, если бы не было функции kotlin.error(Any), которая кидает исключение и которую явно импортировать не надо.

Короче, простыми словами, для компилятора это выглядело так, как будто мы сами написали throw IllegalStateException(). И удивляемся почему оно крашится.

Этот урок нас учит, что меняя функции классов на экстеншн функции нужно лишний раз перепроверить, что её название не клэшится с какой-нибудь функцией из стандартной библиотеки. Ну и принимать Any в функциях стандартной библиотеки – тоже подход, который оставляет вопросики. Это с точки зрения разработчика функции/класса. Что делать с точки зрения пользователя библиотеки не представляю даже)

Настолько тупая ситуация, но такая логичная и от этого забавная.