Aleksandr
04.06.2018
13:36:01
тут можно вопрос по котлину + dagger?
OlegKrikun
04.06.2018
13:37:18
Вроде да =) по теме =)
Petr
04.06.2018
13:37:44
Aleksandr
04.06.2018
13:37:56
Google
Petr
04.06.2018
13:38:00
просто это самый частый вопрос)
Aleksandr
04.06.2018
13:38:12
есть у меня котлин класс например Helper.kt
в нем прям в корне (т.е. без слова class)
есть функция например updateToken
как мне сделать сюда инжект правильно?
а вот свое я не могу понять
я так подозреваю что неправильный вообще подход к архитектуре?
OlegKrikun
04.06.2018
13:40:45
эээ... я как человек сильно далёкий от DI вообще и дагера в частности, хочу тебя спросить: ты уверен что это вообще нормально что то инжектить в метод???
Petr
04.06.2018
13:41:07
Aleksandr
04.06.2018
13:41:07
нет конечно
не уверен
OlegKrikun
04.06.2018
13:41:38
яб на твоём месте инжектил в сущьности что использую хелпер и передавал зависимость в метод обычным путём
Google
Жабра
04.06.2018
13:41:42
dimiii
04.06.2018
13:42:02
Aleksandr
04.06.2018
13:42:15
т.е. если мне нужна зависимость которую я хочу инжектить, мне в лубом случае нужен класс, где будет жить эта перменная как глобальная?
OlegKrikun
04.06.2018
13:42:25
Что такое "инжектить в метод"?
»Aleksandr Osipov, [04.06.18 16:38]
есть функция например updateToken
»Aleksandr Osipov, [04.06.18 16:39]
как мне сделать сюда инжект правильно?
Жабра
04.06.2018
13:43:04
Aleksandr
04.06.2018
13:43:32
я могу и неправильно написать
Quantum Harmonizer
04.06.2018
13:43:37
вообще, есть понятие setter injection, и это о другом
Aleksandr
04.06.2018
13:44:09
раньше у меня было такое DataManager.getInstance().apiManager который мне возвращал мой ретрофит
теперь я его переписал как @Provides для даггера и везде делаю примерно так
@Inject
lateinit var networkApi: NetworkApi
но это в классах, и это идет как переменная
Quantum Harmonizer
04.06.2018
13:46:03
Petr
04.06.2018
13:46:03
можно за пределами класса объявлять не только методы, но и поля
может, их можно также инжектить?
всё равно сгенерится класс в итоге
Aleksandr
04.06.2018
13:47:25
хм
Andrew
04.06.2018
13:47:29
В Kotlin/JVM fun myFun(), определённая в myfile.kt с package org.mypackage, будет для джавки представлена как метод org.mypackage.MyfileKt.myFun(). Можно рядом с ней объявить обычную проперти и использовать вышеупомянутый setter injection.
Aleksandr
04.06.2018
13:47:31
я не знал что там можно проперти
Andrew
04.06.2018
13:47:38
Но это, ИМО, извращение.
Aleksandr
04.06.2018
13:47:44
вот
а как правильно сделать?
Google
Andrew
04.06.2018
13:48:14
Добавить ещё один параметр функции и передавать туда значение явно?
Bogdan
04.06.2018
13:48:56
Aleksandr
04.06.2018
13:48:59
ладно updateToken такое, например еще есть функция logOut, лона может быть вызвана из 3 разных мест
Andrew
04.06.2018
13:49:16
Функции, которые объявлены вне классов, по-хорошему должн бть свободными от сайд-эффектов и не зависеть от чего-то внешнего, по крайней мере насколько это возможно. (Эту мысль можно развивать и на методы классов, но то уже другая тема).
Aleksandr
04.06.2018
13:49:44
везде инжектить этот network и просто переадть как параметр?
Andrew
04.06.2018
13:50:19
logOut — это уже метод штуки, которая отвечает за текущего пользователя. Самый простой вариант — положить её и соседей по смыслу в object SessionManager. Если он глобально зависит от этого network, то это уже не object, а класс с параметром network, да.
Petr
04.06.2018
13:50:30
если я правильно понял
Aleksandr
04.06.2018
13:50:48
я понял
спасибо всем
Andrew
04.06.2018
13:50:53
И инжектить SessionManager там, где он нужен, и network в SessionManager через конструктор.
Quantum Harmonizer
04.06.2018
13:50:59
Andrew
04.06.2018
13:51:38
Но это всё о правилах хорошего тона при проектировании. Котлин их не навязывает, если кому-то хочется костылей — котлин любезно позволит их вставить :) Так что ответ выше о маппинге глобальных функций в методы классов *Kt актуален, само собой.
OlegKrikun
04.06.2018
14:48:51
яж правильно понимаю что пакадж локал не замутить нормально? =)
dimiii
04.06.2018
14:52:22
В идее можно настроить авто-форматирование так, чтобы импорт методов отделялся отдельным блоком от импорта классов?
Alexander
04.06.2018
14:57:53
OlegKrikun
04.06.2018
14:58:22
=))
Bogdan
04.06.2018
14:59:04
Google
Bogdan
04.06.2018
14:59:18
но в жабе это все равно будет паблик
OlegKrikun
04.06.2018
14:59:52
Мдя, т.е. пакедж локал никак? тока пихать всё в один файл и делать приват?
Anton
04.06.2018
15:01:24
ну сделай протектед и не открывай
OlegKrikun
04.06.2018
15:01:24
Andrew
04.06.2018
15:01:44
OlegKrikun
04.06.2018
15:02:24
dimiii
04.06.2018
15:03:52
Alexander
04.06.2018
15:06:53
OlegKrikun
04.06.2018
15:10:36
вроде в кодестайлах написано что импорты должны быть единым блоком (возможно в гугл-андроед стайлах)
Dumitru
04.06.2018
18:52:11
всем привет, тут такой вопрос
есть extension function
fun<T> ArrayList<T>.map(f : (value : Any) -> Unit ) {
f(this)
}
я его трогать не могу
и есть такой код
val list = arrayListOf(1,2,3).map {
it
}
println(list)
выводит kotlin.Unit (ожидаемо)
как я могу явно сказать какой map() использовать?
OlegKrikun
04.06.2018
19:00:08
Если проблема в том что у тебя не та екстеншен функция вызывается, то посмотри в импорты
Dumitru
04.06.2018
19:00:39
Надо явно сказать какую функцию вызывать
OlegKrikun
04.06.2018
19:01:45
Я хз, беги от туда, с такими то условиями ?
А если после точки до map вставить нужный пакет (аля джава) не воркает?
Dumitru
04.06.2018
19:03:05
Не, пробовал
Bogdan
04.06.2018
19:03:28
должно помочь
а нет
Dumitru
04.06.2018
19:04:02
Основная фишка в том что у нас есть свой мап, мы его юзали
И в одном тесте мне нужен был родной мап, а Котлин брал наш
Google
OlegKrikun
04.06.2018
19:04:28
Сделай экстеншен фукнцию kotlinMap
Dumitru
04.06.2018
19:04:38
OlegKrikun
04.06.2018
19:04:44
И вызывай в ней котлиновский мап
Dumitru
04.06.2018
19:04:50
Ну пока это лучшее решение
Dmitry
04.06.2018
19:04:54
import not.so.good.code.map as evilMap скроет твой map в скоупе текущего файла
Dumitru
04.06.2018
19:05:06
Класс
Спасибо!
OlegKrikun
04.06.2018
19:05:54
Artiom
04.06.2018
19:06:29
Лол
Bogdan
05.06.2018
04:03:24
Ужас, имхо
Андрей
05.06.2018
04:11:39
Сам-то как думаешь?
Mikhail
05.06.2018
04:14:03
Андрей
05.06.2018
04:15:13
=)
Bogdan
05.06.2018
04:25:36
Eugene
05.06.2018
05:59:09
val newData = data.toList()
newData[0].isPlaying = !data[0].isPlaying
Bogdan
05.06.2018
06:00:44
Eugene
05.06.2018
06:00:53
Как сделать копию data, чтобы при изменении поля в одном из элементов newData, в data оставались старые значения