pref: 输入法高度持久化
This commit is contained in:
parent
6e3c43b498
commit
e8a83b1ac1
|
|
@ -3,8 +3,13 @@ package com.huanchengfly.tieba.post
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
import androidx.compose.runtime.State
|
import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.datastore.core.DataMigration
|
import androidx.datastore.core.DataMigration
|
||||||
import androidx.datastore.core.DataStore
|
import androidx.datastore.core.DataStore
|
||||||
import androidx.datastore.preferences.SharedPreferencesMigration
|
import androidx.datastore.preferences.SharedPreferencesMigration
|
||||||
|
|
@ -48,6 +53,25 @@ private val dataStoreInstance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED)
|
||||||
|
|
||||||
val Context.dataStore: DataStore<Preferences> by dataStoreInstance
|
val Context.dataStore: DataStore<Preferences> by dataStoreInstance
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun <T> rememberPreferenceAsMutableState(
|
||||||
|
key: Preferences.Key<T>,
|
||||||
|
defaultValue: T
|
||||||
|
): MutableState<T> {
|
||||||
|
val dataStore = LocalContext.current.dataStore
|
||||||
|
val state = remember { mutableStateOf(defaultValue) }
|
||||||
|
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
dataStore.data.map { it[key] ?: defaultValue }.collect { state.value = it }
|
||||||
|
}
|
||||||
|
|
||||||
|
LaunchedEffect(state.value) {
|
||||||
|
dataStore.edit { it[key] = state.value }
|
||||||
|
}
|
||||||
|
|
||||||
|
return state
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("FlowOperatorInvokedInComposition")
|
@SuppressLint("FlowOperatorInvokedInComposition")
|
||||||
@Composable
|
@Composable
|
||||||
fun <T> DataStore<Preferences>.collectPreferenceAsState(
|
fun <T> DataStore<Preferences>.collectPreferenceAsState(
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ import com.huanchengfly.tieba.post.utils.Emoticon
|
||||||
import com.huanchengfly.tieba.post.utils.EmoticonManager
|
import com.huanchengfly.tieba.post.utils.EmoticonManager
|
||||||
import com.huanchengfly.tieba.post.utils.PickMediasRequest
|
import com.huanchengfly.tieba.post.utils.PickMediasRequest
|
||||||
import com.huanchengfly.tieba.post.utils.StringUtil
|
import com.huanchengfly.tieba.post.utils.StringUtil
|
||||||
|
import com.huanchengfly.tieba.post.utils.appPreferences
|
||||||
import com.ramcosta.composedestinations.annotation.Destination
|
import com.ramcosta.composedestinations.annotation.Destination
|
||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
import com.ramcosta.composedestinations.spec.DestinationStyle
|
import com.ramcosta.composedestinations.spec.DestinationStyle
|
||||||
|
|
@ -308,11 +309,19 @@ fun ReplyPage(
|
||||||
.collect { value = it }
|
.collect { value = it }
|
||||||
}
|
}
|
||||||
val imeAnimationEnd by remember { derivedStateOf { imeCurrentHeight == imeAnimationTargetHeight } }
|
val imeAnimationEnd by remember { derivedStateOf { imeCurrentHeight == imeAnimationTargetHeight } }
|
||||||
val imeVisibleHeight by produceState(initialValue = 0, imeAnimationTargetInset, density) {
|
val imeVisibleHeight by produceState(
|
||||||
|
initialValue = remember { context.appPreferences.imeHeight },
|
||||||
|
imeAnimationTargetInset,
|
||||||
|
density
|
||||||
|
) {
|
||||||
snapshotFlow { imeAnimationTargetInset.getBottom(density) }
|
snapshotFlow { imeAnimationTargetInset.getBottom(density) }
|
||||||
.filter { it > 0 }
|
.filter { it > 0 }
|
||||||
.distinctUntilChanged()
|
.distinctUntilChanged()
|
||||||
.collect { value = it }
|
.collect {
|
||||||
|
Log.i("ReplyPage", "imeVisibleHeight: $it")
|
||||||
|
context.appPreferences.imeHeight = it
|
||||||
|
value = it
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val textMeasurer = rememberTextMeasurer()
|
val textMeasurer = rememberTextMeasurer()
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,8 @@ open class AppPreferencesUtils private constructor(ctx: Context) {
|
||||||
defaultValue = "0"
|
defaultValue = "0"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var imeHeight by DataStoreDelegates.int(defaultValue = 800)
|
||||||
|
|
||||||
var listItemsBackgroundIntermixed by DataStoreDelegates.boolean(defaultValue = true)
|
var listItemsBackgroundIntermixed by DataStoreDelegates.boolean(defaultValue = true)
|
||||||
|
|
||||||
var listSingle by DataStoreDelegates.boolean(defaultValue = false)
|
var listSingle by DataStoreDelegates.boolean(defaultValue = false)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue