Я уже немного экспериментировал с KMP и хотел создать небольшую библиотеку, которая позволит пользователю легко сохранять/извлекать тему (светлая/темная/системная).
Я реализовал это в приложении, которое делаю, и подумал, что будет легко создать из него библиотеку... но ничего более далекого от реальности
Основа библиотеки будет:
// commonMain
interface ThemePreferences {
suspend fun saveTheme(appThemeScheme: AppThemeScheme)
fun observeTheme(): Flow
}
// androidMain
class ThemePreferenceImpl(private val context: Context) : ThemePreferences {
private val Context.dataStore by preferencesDataStore(name = THEME_PREFERENCES_NAME)
override suspend fun saveTheme(appThemeScheme: AppThemeScheme) {
context.dataStore.edit {
it[THEME_MODE_KEY] = appThemeScheme.name
}
}
override fun observeTheme() = context.dataStore.data.map { preferences ->
when (preferences[THEME_MODE_KEY]) {
AppThemeScheme.LIGHT.name -> AppThemeScheme.LIGHT
AppThemeScheme.DARK.name -> AppThemeScheme.DARK
else -> AppThemeScheme.SYSTEM
}
}
companion object {
private const val STRING_PREFERENCES_KEY = "app_theme_scheme"
private val THEME_MODE_KEY = stringPreferencesKey(STRING_PREFERENCES_KEY)
private const val THEME_PREFERENCES_NAME = "theme_preferences"
}
}
// iosMain
class ThemePreferencesImpl private constructor() : ThemePreferences {
private val userDefaults = NSUserDefaults.standardUserDefaults
actual override fun getTheme(): AppThemeScheme {
val themeValue = userDefaults.stringForKey("theme") ?: AppThemeScheme.SYSTEM.name
return AppThemeScheme.valueOf(themeValue)
}
actual override fun saveTheme(theme: AppThemeScheme) {
userDefaults.setObject(theme.name, "theme")
}
}
Как мне сделать это библиотекой KMP? Мне сложно играть с ожидаемым/актуальным, так как я не думаю, что смогу сделать что-то вроде:
// commonMain
expect fun createThemePreferences(): ThemePreferences
// androidMain
actual class ThemePreferencesImpl(context: Context)
// iosMain
actual class ThemePreferencesImpl()
How do you normally deal with these type of situations?
Подробнее здесь: https://stackoverflow.com/questions/792 ... ual-expect
Создание библиотеки KMP с фактическим/ожидаемым ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1732560213
Anonymous
Я уже немного экспериментировал с KMP и хотел создать небольшую библиотеку, которая позволит пользователю легко сохранять/извлекать тему (светлая/темная/системная).
Я реализовал это в приложении, которое делаю, и подумал, что будет легко создать из него библиотеку... но ничего более далекого от реальности
Основа библиотеки будет:
// commonMain
interface ThemePreferences {
suspend fun saveTheme(appThemeScheme: AppThemeScheme)
fun observeTheme(): Flow
}
// androidMain
class ThemePreferenceImpl(private val context: Context) : ThemePreferences {
private val Context.dataStore by preferencesDataStore(name = THEME_PREFERENCES_NAME)
override suspend fun saveTheme(appThemeScheme: AppThemeScheme) {
context.dataStore.edit {
it[THEME_MODE_KEY] = appThemeScheme.name
}
}
override fun observeTheme() = context.dataStore.data.map { preferences ->
when (preferences[THEME_MODE_KEY]) {
AppThemeScheme.LIGHT.name -> AppThemeScheme.LIGHT
AppThemeScheme.DARK.name -> AppThemeScheme.DARK
else -> AppThemeScheme.SYSTEM
}
}
companion object {
private const val STRING_PREFERENCES_KEY = "app_theme_scheme"
private val THEME_MODE_KEY = stringPreferencesKey(STRING_PREFERENCES_KEY)
private const val THEME_PREFERENCES_NAME = "theme_preferences"
}
}
// iosMain
class ThemePreferencesImpl private constructor() : ThemePreferences {
private val userDefaults = NSUserDefaults.standardUserDefaults
actual override fun getTheme(): AppThemeScheme {
val themeValue = userDefaults.stringForKey("theme") ?: AppThemeScheme.SYSTEM.name
return AppThemeScheme.valueOf(themeValue)
}
actual override fun saveTheme(theme: AppThemeScheme) {
userDefaults.setObject(theme.name, "theme")
}
}
Как мне сделать это библиотекой KMP? Мне сложно играть с ожидаемым/актуальным, так как я не думаю, что смогу сделать что-то вроде:
// commonMain
expect fun createThemePreferences(): ThemePreferences
// androidMain
actual class ThemePreferencesImpl(context: Context)
// iosMain
actual class ThemePreferencesImpl()
How do you normally deal with these type of situations?
Подробнее здесь: [url]https://stackoverflow.com/questions/79224258/creating-a-kmp-library-with-actual-expect[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия