implementation ("androidx.datastore:datastore-preferences:1.0.0")
package com.example.mydatastoreimport android.content.Context import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.TextField import androidx.compose.runtime.* import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.KeyboardType import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.preferencesDataStore import com.example.mydatastore.ui.theme.MyDataStoreTheme import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch// MainActivity 是应用的入口 Activity,继承自 ComponentActivity class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 启用边缘到边缘的显示模式enableEdgeToEdge()// 设置 Compose 内容setContent {MyDataStoreTheme {// 显示 NumberInputScreen 组件NumberInputScreen()}}} }// 定义 DataStore 的扩展属性,用于访问应用的设置数据存储 val Context.settingsDataStore: DataStore<Preferences> by preferencesDataStore(name = "my_settings")// NumberInputScreen 是一个可组合函数,用于显示数字输入界面 @Composable fun NumberInputScreen() {// 获取当前上下文val context = LocalContext.current// 使用 remember 和 mutableStateOf 来保存输入的数字var number by remember { mutableStateOf(0) }// 使用 LaunchedEffect 在组合时执行一次,从 DataStore 读取初始值LaunchedEffect(Unit) {context.settingsDataStore.data.collect { preferences ->number = preferences[PreferencesKeys.NUMBER] ?: 0}}// 显示一个 TextField,用于输入数字TextField(value = number.toString(),onValueChange = { newValue ->// 将输入的值转换为整数,如果转换成功则更新状态并保存到 DataStorenewValue.toIntOrNull()?.let { num ->number = num// 在 IO 线程中异步保存到 DataStoreCoroutineScope(Dispatchers.IO).launch {context.settingsDataStore.edit { settings ->settings[PreferencesKeys.NUMBER] = num}}}},// 设置键盘类型为数字键盘keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)) }// PreferencesKeys 是一个单例对象,用于定义 DataStore 的键 private object PreferencesKeys {val NUMBER = intPreferencesKey("saved_number") }