
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 оставались старые значения