
Pavel
29.08.2017
17:49:49
А кто-нибудь юзал javalin? У меня корутины не стартуют совместно с ним, грешу на то что javalin перехватывает весь контроль

? animufag ?
29.08.2017
18:38:17
крч доки анко говорят: ставь андроид студио 2.4+
ставишь 3.0, она её не поддерживает и просто нигде не отображается

Pavel
29.08.2017
19:21:33
Какие DI вы юзаете на Котлине?

Google

Mi
29.08.2017
19:25:23
spring)))

Михаил
29.08.2017
19:49:15

Pavel
29.08.2017
19:50:03
Интересно, а давайте нет. DI на котлине и не для Андройда.

Михаил
29.08.2017
19:50:56
тогда скорее всего в большинстве случаев это будет spring di или guice)))

Pavel
29.08.2017
19:51:35
Ок :) А если для Андройда?)

Quantum Harmonizer
29.08.2017
19:51:58

Михаил
29.08.2017
19:52:20
Dagger 2, щас понравился очень Toothpick (удобнее дагера)

Pavel
29.08.2017
19:53:13
Dagger 2 стал классикой.
К сожалению, да. Претензия к даггеру2, когда он ломается, нужна команда экстрасенсов, чтобы его оживить.

jacoder
29.08.2017
19:53:40
А если еще котлин + датабиндинг...

Pavel
29.08.2017
19:53:42
Слышал про toothpick и kodein. Давайте поподробнее, почему туспик а не даггер2?

Quantum Harmonizer
29.08.2017
19:53:50
Да, собственно, любой автоматический DI вносит неочевидность, а кода меньше не делает.

Михаил
29.08.2017
19:54:07

Dmitry
29.08.2017
19:54:13
https://github.com/SalomonBrys/Kodein есть еще такое (сам пока не использовал)

Google

Anton
29.08.2017
19:54:48
слышал про три альтернативы причем говорили что они намного легче даггера: кодеин туспик и еще какой то. один из них на патчинге байткода, другой вообще на рефлекшене тоесть у тебя может упасть в рантайме. а третий я забыл.

jacoder
29.08.2017
19:55:00
И прикрутить Room alpha с annotqtionProcessor. Отличный вечер обеспечен :)

Pavel
29.08.2017
19:55:20
Про Кодеин поподробнее нам может рассказать @tuule

jacoder
29.08.2017
19:57:00

Va
29.08.2017
19:57:05
могу, да. вещь потрясная, но только не для смежных с джавой проектов, потому что в джаве он выглядит ужасно

Anton
29.08.2017
19:57:11
нене какой то другой

Va
29.08.2017
19:57:56
если проект только котлин — очень советую попробовать кодеин
очень удобные scope
и система описания биндингов

Михаил
29.08.2017
19:59:06
Слышал про toothpick и kodein. Давайте поподробнее, почему туспик а не даггер2?
toothpick
+:
-не надо никакой менеджер скоупами писать он втроенный и очень удобный.
-также как и дагер поддерживает jsr-330
-компоненты как дагере там в принципе не надо описывать, немного другая концепция
-валидация графа в рантайме, всегда упадет с адекватной ошибкой или почти всегда)
-:
-нельзя ограничить доступ к зависимостям родительского скоупа (может ошибаюсь или делаю что-то не так)
-валидация графа в рантайме, но не думаю что можно не заметить при ручном тестировании краш)

Anton
29.08.2017
19:59:40
почему плюсами считается то что уже есть в даггере)
это же не плюс )
если рассматривать как альтернативу даггеру

Михаил
29.08.2017
20:00:44
ну вот кодеин не поддерживает jsr 330 если не ошибаюсь. можно отнести относительно него плюс)

Anton
29.08.2017
20:01:07
вот я лично считаю что валидация графа в рантайме это просто супер огромный минус по сравнению с даггером
остальные плюсы просто меркнут
тоесть без тестов вообще опасно будет

Михаил
29.08.2017
20:01:29

Anton
29.08.2017
20:01:37
ну потому что фейлфаст типа
это же хорошо когда у тебя все всплывает при билде

Google

Михаил
29.08.2017
20:02:18
но как всплывает. как г в проруби :D

Anton
29.08.2017
20:02:31
почему) вроде норм логи пишутся

Михаил
29.08.2017
20:04:03
да. но все же время уходит на то чтобы их разобрать и найти ошибку, а если учитывать что нынче капт не хочет проекты повторно собирать без clean build, то ужас. а тузпик сразу напишет тебе какую зависимость и где не может удовлетворить

Михаил
29.08.2017
20:08:30

Михаил
29.08.2017
20:10:03
ну когда пытаешь заинжектить то что не может заинжектить

Михаил
29.08.2017
20:12:44
Просто у меня сейчас к экрану, который нужно протестить, не так просто добраться (надо время потратить, чтобы посерфить приложение). И если я, дойдя до этого экрана, вдруг увижу падение из-за ошибки в графе, то мне придется ее фиксить и потом заново серфить к экрану... Такой себе выигрыш во времени

Михаил
29.08.2017
20:14:18

Михаил
29.08.2017
20:16:46
ну я с даггером очень редко косячу (а если и косячу, то сразу вижу ошибку), так что хз

Михаил
29.08.2017
20:17:16
ну вот. с тузпиком еще сложнее накосяить, ибо он проще

Quantum Harmonizer
29.08.2017
20:19:24

Va
29.08.2017
20:28:55

Anton
29.08.2017
20:29:56
ну для меня все равно логи не перевешивают этот минус)

Va
29.08.2017
20:53:26
хоть убейте, это плюс )
да и сложно накосячить на верхних уровнях графа. а если накосячить на нижних — это всплывет сразу )

Anton
29.08.2017
20:53:47
я не юзал но теоретически это может оказаться где то глубоко
и без тестов не поймается
а потом приложение упадет)

Va
29.08.2017
20:55:05
ну окей, в любом случае, что есть тесты для такой штуки, попробовать взять все зависимости ?
это пару строк кода )

Anton
29.08.2017
20:55:50
тоже верно)

Va
29.08.2017
20:59:10
у меня в основном проекте сейчас вообще солянка библиотечная. там анко, мокси, кондуктор и кодеин)

Google

Va
29.08.2017
20:59:36
и все отлично тестится )

Назаров
30.08.2017
05:17:54
Всем привет. Есть ли возможность написать геттер, чтобы после получения ссылка сама обнулялась?
первое что пришло в голову, но это булщит
var tasks: List<Task>? = null
get() {
return tasks
tasks = null
}

Sergey
30.08.2017
05:37:30
lazy только наоборот?)

Vladimir
30.08.2017
05:42:04
Не самое очевидное поведение. Может, лучше не делать такие побочные эффекты в свойстве, а назвать соответствующий метод takeTasks()?

Boris
30.08.2017
05:42:54
Но вцелом соглашусь с Владимиром, лучше в гетах такого не делать

Mi
30.08.2017
05:49:04

Sergey
30.08.2017
06:02:16
tasks?.also { tasks = null }

Ozz
30.08.2017
06:04:40
А какая разница между also & let
Только в аргументах и контексте?

Badya
30.08.2017
06:12:25
Не лучше ли написать Once<E> который будет иметь флажок visited? Как Option по сути

Quantum Harmonizer
30.08.2017
06:50:47

Mi
30.08.2017
06:51:40
хотя нет, затупил

Dibro
30.08.2017
07:03:06

Va
30.08.2017
07:17:27
точно так же и apply и run, только вместо себя аргументом в лямбде, он передаст себя как ресивер
(то есть будет this в скоупе лямбды)

Ozz
30.08.2017
09:10:00
Спасибо за помощь ?

Maxim
30.08.2017
09:55:12
lateinit var offerId: Long - 'lateinit' modifier is not allowed on primitive type properties
var offerId: Long - Property must be initialized or be abstract
От же ж, и так не так, и так не этак

Михаил
30.08.2017
09:56:30
видимо надо ставить var offerId = 0L

Tipok
30.08.2017
10:00:18
ReactNative + Kotlin кто-нибудь пробовал? Вообще это заработает?

Google

Igor
30.08.2017
10:12:17

Алексей
30.08.2017
10:14:23
Ребят, а в котлине можно такое выражение
if (this.sessionId == 0L) {
this.sessionId = time
}
cократить? Т.е как с нуллом ?: например

Михаил
30.08.2017
10:16:52

Алексей
30.08.2017
10:17:28
ну, ок)

Ozz
30.08.2017
10:19:37
Писал с телефона
Вроде так можно

Михаил
30.08.2017
10:21:19
Ну такое се. Имхо исходный вариант больше суть отражает

Алексей
30.08.2017
10:21:27
можно, но так не особо красивее)

Михаил
30.08.2017
10:22:00
Правда тут бы 0 на константу по хорошему заменить

Алексей
30.08.2017
10:22:31
ZERO_LONG ?)

Михаил
30.08.2017
10:23:17
Ну она же что то значит) NOT_ASSIGNED_SESSION_ID
Как вариант
Не знаю что именно этот 0 значит)

Алексей
30.08.2017
10:23:59
ну просто полностью код выглядит так
init {
val time = System.currentTimeMillis()
if (sessionId == 0L) {
sessionId = time
}
if (registerDate == 0L) {
registerDate = time
}
if (lastForegroundTime == 0L) {
lastForegroundTime = time
}
}
если под каждый 0 константу заводить - как-то не тру)

Михаил
30.08.2017
10:24:25
А

Алексей
30.08.2017
10:24:43
вот кстати интересный вопрос, в дата классах вообзще нормально так писать?
т.е у меня изначально в яве был билдер
я его заменил на это
data class User(
val id: Long,
val name: String?,
var previousName: String? = null,
var registerDate: Long = 0L,
var sessionId: Long = 0L,
var lastForegroundTime: Long = 0L,
var lastBackgroundTime: Long = 0L,
var properties: UserProperties = UserProperties()
) {
init {
val time = System.currentTimeMillis()
if (sessionId == 0L) {
sessionId = time
}
if (registerDate == 0L) {
registerDate = time
}
if (lastForegroundTime == 0L) {
lastForegroundTime = time
}
}
}
но суть в том что мне надо эти 3 значения заполнять всегда