🔗 Платная подписка на Boosty abdev.by/oroS и в Telegram abdev.by/lrpW 🔗 Код из видео на GitHub github.com/androidbroadcast/KotlinPropertyDelegate (доступ для плтаных подписчиков. По вопросам пишите t.me/ab_manager) 🔗 Telegram Android Broadcast t.me/+mBXLNRgEwNcwNjli ✉ Написать Кириллу kirill@androidbroadcast.dev
Смысл понятен, но пример так себе, так как уходя от копипасты, написали по итогу тонну копипасты внутри, НО, как +, это 1 раз и где-то скрыто, а дальше упрощение
"Копи-паста" - это копирование одного и того текста/кода и вставка его в файлы с минимальными правками. В итоге если тебе что-то нужно подправить в этом коде, ты будешь это искать по всему проекту и исправлять. То что показал я - уход от копи пасты и однообразного кода, через инкапсуляцию за делегатом свойства. Учите базу!
🔗 Платная подписка на Boosty abdev.by/oroS и в Telegram abdev.by/lrpW
🔗 Код из видео на GitHub github.com/androidbroadcast/KotlinPropertyDelegate (доступ для плтаных подписчиков. По вопросам пишите t.me/ab_manager)
🔗 Telegram Android Broadcast t.me/+mBXLNRgEwNcwNjli
✉ Написать Кириллу kirill@androidbroadcast.dev
Смысл понятен, но пример так себе, так как уходя от копипасты, написали по итогу тонну копипасты внутри, НО, как +, это 1 раз и где-то скрыто, а дальше упрощение
"Копи-паста" - это копирование одного и того текста/кода и вставка его в файлы с минимальными правками. В итоге если тебе что-то нужно подправить в этом коде, ты будешь это искать по всему проекту и исправлять.
То что показал я - уход от копи пасты и однообразного кода, через инкапсуляцию за делегатом свойства. Учите базу!
Собеседования наше всё. Рынок собеседований выше рынка разработки в России.
а разве там не будет креш в каст не String из за того что default value задан как null?
В исходниках поправил уже после монтажа
Хочется отметить крутое окружение для ролика 🤙
Я больше любитель флоу. Но тема интересная и я немного модифицировал код.
Написал себе FlowUtils
operator fun MutableStateFlow.getValue(thisRef: Any?, property: KProperty): T =
this.value
operator fun MutableStateFlow.setValue(thisRef: Any?, property: KProperty, value: T) {
this.value = value
}
class IntPref(
sharedPreferences: SharedPreferences,
key: String,
scope: CoroutineScope,
defValue: Int = 0
) {
private val flow = MutableStateFlow(defValue)
init {
flow.value = sharedPreferences.getInt(key, defValue)
flow.drop(1)
.onEach { sharedPreferences.edit { putInt(key, it) } }
.launchIn(scope)
}
operator fun getValue(thisRef: Any?, property: KProperty): MutableStateFlow = flow
}
....
class StringSetPref(
sharedPreferences: SharedPreferences,
key: String,
scope: CoroutineScope,
defValue: Set = HashSet()
) {
private val flow = MutableStateFlow(defValue)
init {
flow.value = sharedPreferences.getStringSet(key, defValue) ?: defValue
flow.drop(1)
.onEach { sharedPreferences.edit { putStringSet(key, it) } }
.launchIn(scope)
}
operator fun getValue(thisRef: Any?, property: KProperty): MutableStateFlow =
flow
}
И дальше это можно не только использовать делегаты, но и подписываться на изменения.
class ReactiveSharedPrefs(
sharedPreferences: SharedPreferences,
scope: CoroutineScope = CoroutineScope(Dispatchers.IO)
) {
companion object {
private const val PREF = "PREF"
}
val pref by IntPref(sharedPreferences, PREF, scope)
}
.....
var pref by prefs.pref
bind.view.setOnClickListener{ pref++ }
prefs.pref.onEach {
// observe
}.launchIn(scope)