
Denko
19.09.2018
20:48:14
Да, постоянно ?
Если вьюха деатачится, то ничего не произойдёт и норм будет, если сделаешь !!, то упадёт

Unknown
19.09.2018
20:50:13

Quantum Harmonizer
19.09.2018
20:51:20
Использовать MVVM :)

Google

Igor
19.09.2018
20:53:47
Еще лучше, когда VM это иммутабельный data-class без логики.
Тогда все будет очень просто и ? с !! вообще не понадобятся.

Жабра
19.09.2018
20:59:01

Konstantin
19.09.2018
21:26:50

Unknown
19.09.2018
21:30:30

OlegKrikun
19.09.2018
21:32:48

Konstantin
19.09.2018
21:33:13
interface IView{ fun execute(command:UiCommand) }
NullView():IView{ override fun execute(command:UiCommand){} }
Presenter{
private var view:IView = NullView()
fun onAttach( iView:IView) = this.view = iView
fun onDetach( this.view = NullView() )
}

Unknown
19.09.2018
21:35:38


Konstantin
19.09.2018
21:36:11
можно пойти другим путем - реактивным. тогда будет типа того:
interface IView : Consumer<UiCommand> {
val eventRelay: PublishSubject<UiEvent>
}
abstract class APresenter(
private val pool: SchedulersPool,
private val errorHandler: ErrorHandler
) {
val disposable = CompositeDisposable()
private val commandRelay: PublishSubject<UiCommand> =
PublishSubject
.create<UiCommand>()
.apply {
observeOn(pool.io())
subscribeOn(pool.ui())
}
fun ui(command: UiCommand) = commandRelay.onNext(command)
fun ui(vararg command: UiCommand) = command.forEach { commandRelay.onNext(it) }
abstract fun on(event: UiEvent)
open fun onViewAttached(iView: IView) {
disposable.addAll(
commandRelay.subscribe(iView::accept, errorHandler::handle),
iView
.eventRelay
.observeOn(pool.ui())
.subscribeOn(pool.compute())
.subscribe(this::on, errorHandler::handle)
)
}
fun onViewDetached() {
disposable.clear()
}
}


OlegKrikun
19.09.2018
21:36:21
а лет её захватывает
так же можешь записать в методе вью в вал и проверить на нулл, тогда смарт каст будет работать

Жабра
19.09.2018
21:37:22

Google

Unknown
19.09.2018
21:39:52
если по логике компилятора значение может стать null после проверки в if то оно точно также может стать null после проверки перед передачей в let

Жабра
19.09.2018
21:40:04

Unknown
19.09.2018
21:40:20

Жабра
19.09.2018
21:40:20
var может измениться в любой момент
А let - это захват

OlegKrikun
19.09.2018
21:40:36

Unknown
19.09.2018
21:41:26

OlegKrikun
19.09.2018
21:42:21

Unknown
19.09.2018
21:42:59

Boris
19.09.2018
22:17:43
Здесь описано почему: https://github.com/Kotlin/KEEP/blob/result-rename/proposals/stdlib/result.md
Для тех кто не пошёл по ссылке, но хотел бы знать что там написано:
The rationale behind these limitations is that future versions of Kotlin may expand and/or change semantics of functions that return Result type and null-safety operators may change their semantics when used on values of Result type. In order to avoid breaking existing code in the future releases of Kotin and leave door open for those changes, the corresponding uses produce an error now. Exceptions to this rule are made for carefully-reviewed declarations in the standard library that are part of the Result type API itself.
Но написано, что если очень хочется, то можно воспользоваться runCatching

Mikhail
20.09.2018
06:02:35

Fox:
20.09.2018
06:10:13
Privet
Java ili kotlin dlya android development

Alexey
20.09.2018
06:13:32

Quantum Harmonizer
20.09.2018
06:17:13
Privet
neprivet.ru
Без русской раскладки в русскоязычный чат лучше не ходить

Alexandr
20.09.2018
06:17:16

Brian
20.09.2018
06:18:20
Никогда не понимал, почему у людей так горит на транслит?

You
20.09.2018
06:19:17
Потому что его читать неудобно

Brian
20.09.2018
06:24:11

Google

Brian
20.09.2018
06:24:41
Не проще ли сократить мучения сразу ответить человеку на его вопрос?

You
20.09.2018
06:24:46

Brian
20.09.2018
06:25:27
?

Alexander
20.09.2018
07:01:33
Вообще, этот конкретный вопрос надо выделить в FAQ и не отвечать на него. Каждые два дня кто-то спрашивает. Причем именно в такой форме, без уточнений.

Алексей
20.09.2018
07:08:47
Всем привет
Есть код:
val channel = BroadcastChannel<Something>(256)
...
fun doSomething() {
val something by lazy {
//init Something
}
channel.send(something)
}
Вопрос - когда инициализируется переменная something? В момент передачи в send, в момент передачи в какого-либо подписчика или в момент попытки использования собственно значения?

Quantum Harmonizer
20.09.2018
07:10:24


Алексей
20.09.2018
07:12:17
по-крайней мере, практика говорит об обратном
runBlocking {
val channel = BroadcastChannel<Int>(3)
val first: Int by lazy {
val value = random.nextInt()
println("Initiated first: $value")
value
}
channel.sendBlocking(first)
channel.subscribe {
println("received $it")
}
val second: Int by lazy {
val value = random.nextInt()
println("Initiated second: $value")
value
}
channel.send(second)
delay(2000)
}
Вывод:
Initiated first: 215035476
Initiated second: 566737082
received 566737082
так что теперь остаётся вопрос - в момент передачи в send или где-то уже внутри?

Quantum Harmonizer
20.09.2018
07:17:36

Алексей
20.09.2018
07:18:23

Quantum Harmonizer
20.09.2018
07:18:56
а канал, наоборот, не знает ничего про делегат

Алексей
20.09.2018
07:19:20
ну то есть при передаче в send

OlegKrikun
20.09.2018
07:56:41
Хм... А не было инфы Kotlin Plugin для версии 1.3.0-rc-51 завозить будут?

Maxim
20.09.2018
08:26:49

akniyet
20.09.2018
08:28:16

Google

Alexandr
20.09.2018
08:30:03
на что ругается то? какой текст ошибки?
getWeather() что возвращает?

akniyet
20.09.2018
08:30:56

Alexey
20.09.2018
08:31:26
ну дак suspend

Alexandr
20.09.2018
08:32:01
текст ошибки то какой?

Alexey
20.09.2018
08:32:31
Он пытается вызвать suspend внутри обычной функции

Quantum Harmonizer
20.09.2018
08:32:51
getWeather же не suspend

Alexey
20.09.2018
08:33:55
тут скорее всего надо сделать так: data: suspend () => Either<Failure, T>

akniyet
20.09.2018
08:33:57

Admin
ERROR: S client not available

Quantum Harmonizer
20.09.2018
08:34:38
тут оно в жирненьких фигурных скобочках
...а они обозначают тело уже другой функции

akniyet
20.09.2018
08:37:06
спасибо большое, пойду разбираться

Alexey
20.09.2018
08:38:37

akniyet
20.09.2018
08:52:14

Andrew
20.09.2018
12:27:40
Товарищи, а я верно понимаю, что из reified- функции никто к компаньону дженерик-параметра не пустит?

Quantum Harmonizer
20.09.2018
12:28:06

Andrew
20.09.2018
12:28:36
И второй вопрос вдогонку:
inline fun <reified T: Base> info(value: T) = ...
inline fun <reified T: Any> action(value: T) {
when(value) {
is Base -> info<T>(value)
}
}
Ловлю: error: type argument is not within its bounds: should be subtype of 'Base'.
Это я чего-то не понимаю или компилятор?

Google

Alexandr
20.09.2018
12:35:04
ну так у тебя в info дженерик ограничен Base, а в action он Any
Any не подтип Base

Andrey
20.09.2018
12:35:27

Alexandr
20.09.2018
12:35:28
ибо Base: Any

Andrew
20.09.2018
12:35:56
А value is Base даункастом в данном случае не считается?

Andrey
20.09.2018
12:36:19

Alexandr
20.09.2018
12:37:01

Andrew
20.09.2018
12:37:30
Ну хотя да, value — это просто переменная типа T, то, что конкретно она подходящего типа, про сам тип ничего не говорит, ибо в теории рядом может быть value2: T.
Я, наверное, слишком много от компилятора хочу просто :)

Alexandr
20.09.2018
12:37:46
info<T>(value) - не надо так, T уберите

Quantum Harmonizer
20.09.2018
12:38:00

Andrew
20.09.2018
12:38:24
Что логичным образом окончательно всё ломает, собственно.

Alexandr
20.09.2018
12:39:03

dimiii
20.09.2018
12:39:42

Andrew
20.09.2018
12:40:08

Andrey
20.09.2018
12:40:31
Ой, прошу пардона, там его и нету в моём коде.
У меня всё компилится вот так:
fun main(args: Array<String>) {
action(object : Base{})
}
interface Base
inline fun <reified T : Base> info(value: T) {}
inline fun <reified T: Any> action(value: T) {
when(value) {
is Base -> info(value)
}
}

Andrew
20.09.2018
12:41:38

Andrey
20.09.2018
12:43:12

Andrew
20.09.2018
12:43:56
И when(T::class), как назло, не помощник, потому что нету isSubtypeOf. :/