@kotlin_lang

Страница 880 из 982
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
да я вкурсе, просто мб как то можно по красивее сделать
Ну я впилил абстрактный класс Presenter<T> с attach(view: T) и detach(), а ещё val view: T get() = _view!!

Unknown
19.09.2018
21:30:30
null object можно заюзать если интерфейс view позволяет
я уже с ? смирился, я бы предпочел использовать if (view != null) но тут вылезает smart cast ... is impossible)

OlegKrikun
19.09.2018
21:32:48
я уже с ? смирился, я бы предпочел использовать if (view != null) но тут вылезает smart cast ... is impossible)
если надо несколько раз обратится используй let, apply и пр (view?.let { .... })

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
почему с let работает а с if (view != null) нет?
потому что вью у тебя вар и с момента проверки в ифе оно могло изменится

а лет её захватывает

так же можешь записать в методе вью в вал и проверить на нулл, тогда смарт каст будет работать

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

Unknown
19.09.2018
21:40:20
Нет.
почему?

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

А let - это захват

Unknown
19.09.2018
21:41:26
OlegKrikun
19.09.2018
21:42:21
те ссылка продублируется?
вообще надо использовать it прилетающий в лет, а то что работать по имени, то это смарт каст

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

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
Java ili kotlin dlya android development
>Java ili kotlin translit soidet, toje kodit' mona

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
Не проще ли сократить мучения сразу ответить человеку на его вопрос?

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, в момент передачи в какого-либо подписчика или в момент попытки использования собственно значения?

Алексей
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
сообщение выше - инициализация происходит несмотря на отсутствие подписчиков
lazy ничего не знает про подписчиков, он разворачивается по первому требованию

а канал, наоборот, не знает ничего про делегат

Алексей
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() что возвращает?

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
...а они обозначают тело уже другой функции
видимо, у меня непонимание, в чем отличие, когда как параметр передаешь и когда оборачиваешь в жирную скобку

спасибо большое, пойду разбираться

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

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
И второй вопрос вдогонку: 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'. Это я чего-то не понимаю или компилятор?
Вы. У вас сказано, что T, передаваемый в info, должен быть подтипом Base Соответственно, без даункаста T в теле action нельзя его использовать в info

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

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

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

Я, наверное, слишком много от компилятора хочу просто :)

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

Andrew
20.09.2018
12:38:24
info<T>(value) - не надо так, T уберите
Ой, прошу пардона, там его и нету в моём коде.

Что логичным образом окончательно всё ломает, собственно.

Alexandr
20.09.2018
12:39:03
Ой, прошу пардона, там его и нету в моём коде.
странно, тогда должно работать. не у компа, так бы проверил

dimiii
20.09.2018
12:39:42
Ой, прошу пардона, там его и нету в моём коде.
А какую задачу решает код, кстати? Просто выглядит как таблица виртуальных функций

Andrew
20.09.2018
12:40:08
странно, тогда должно работать. не у компа, так бы проверил
Да нет, не должно. У меня есть T: Any, есть какая-то переменная value: T, которая может быть не единственной, зависящей от T. Потому то, что конкретно value оказалась Base, о самом T ничего не говорит.

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
У меня всё компилится вот так: 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) } }
Правильно, я написал глупость, у меня inline fun <reified T: Base> info(), а не так, как я накидал для наколеночного примера.

Andrew
20.09.2018
12:43:56
А какую задачу решает код, кстати? Просто выглядит как таблица виртуальных функций
Не-а. Это я значения из одной системы типов пытаюсь перегнать в другую, И у некоторого дерева входных подтипов у всех есть компаньон с указанием размера, который я и пытался выдрать (CVariable.Type). Потом я увидел, что есть typeOf<T: CVariable>(), который этот компаньон мне выдаёт, теперь до него достучаться пытаюсь.

Ну тогда не будет работать. Как он реифицирует T?
Никак, я и отписался уже, что понял проблему — уточнённое значение типа никак не связано с уточнением самого типа.

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

Страница 880 из 982