Pull to refresh
51
0
Andreev Dmitry @app-z

User

Send message

rememberSaveable Compose

rememberSaveable ведет себя так же, как и remember, сохраняя состояние при рекомпозиции, но также позволяет пережить поворот экрана

Все типы данных, которые можно добавить в Bundle, сохраняются автоматически. Если требуется сохранить то, что нельзя добавить в Bundle, есть несколько вариантов

MapSaver

ListSaver

Parcelize Пример ниже

@Parcelize
data class City(val name: String, val country: String) : Parcelable

@Composable
fun CityScreen() {
    var selectedCity = rememberSaveable {
        mutableStateOf(City("Madrid", "Spain"))
    }
}

Tags:
Total votes 1: ↑1 and ↓0+1
Comments0

Таймер на LaunchedEffect в Compose

LaunchedEffect(keyN) запустит свою лямбду, в начале композиции. LaunchedEffect будет запускать свою лямбду снова каждый раз, когда изменится один из заданных ключей keyN

Причем в лямбде будет находится coroutine context

@Composable
fun Timer() {
    var seconds by remember { mutableStateOf(0) }

    LaunchedEffect(seconds) {
            delay(1000)
            seconds++
        }

    Text(text = "Seconds: $seconds")
}

mutableStateOf - Создает State при изменении которого compose функция перезапускается

remember - сохраняет этот State при каждом перезапуске функции

remember + mutableStateOf

Tags:
Rating0
Comments0

Можно ли организовать свое собственное расширение в Kotlin? Это можно сделать через Delegate

class MyString {
    fun myPrint(text: String) {
        println(text)
    }
}

Есть класс MyString с методом myPrint(). Допустим нам надо сделать собственное расширение printRealExt() без использование встроенных в Kotlin возможностей

fun MyString.printRealExt(text: String) {
    println(text)
}

Реализуем интерфейс и класс с нашим методом "расширения"

interface ExtensionPrint {
    fun printExt(text: String)
}

class ExtensionPrintImpl : ExtensionPrint {
    override fun printExt(text: String) {
        println(text)
    }
}

А затем воспользовавшись Delegation делегируем этот метод

class MyString : ExtensionPrint by ExtensionPrintImpl() {
    fun myPrint(text: String) {
        println(text)
    }
}

Синтаксис вызова из расширения и из делегата выглядит одинаково

    val myString = MyString()
    myString.printRealExt("Real ext")
    myString.printExt("Text from ext")

Таким же образом можно организовать множественное наследование в  Kotlin

interface OneClassInterface {
    fun someOne()
}

class OneClassImpl : OneClassInterface {
    override fun someOne() {
        println("some One")
    }
}

interface TwoClassInterface {
    fun someTwo()
}

class TwoClassImpl : TwoClassInterface {
    override fun someTwo() {
        println("someTwo")
    }
}

class DerivedClass : OneClassInterface by OneClassImpl(), TwoClassInterface by TwoClassImpl()

Есть другие способы?

Tags:
Total votes 2: ↑2 and ↓0+2
Comments0

Information

Rating
6,311-th
Registered
Activity

Specialization

Mobile Application Developer
Senior
Git
English
Linux