kotlin,jetpack compose,使用DataStore保存数据,让程序下次启动时自动获取

复制代码
implementation ("androidx.datastore:datastore-preferences:1.0.0")
复制代码
package com.example.mydatastore

import 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 ->
            // 将输入的值转换为整数,如果转换成功则更新状态并保存到 DataStore
            newValue.toIntOrNull()?.let { num ->
                number = num
                // 在 IO 线程中异步保存到 DataStore
                CoroutineScope(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")
}
相关推荐
冉冉同学2 小时前
AI Agent 开始操作真实手机:移动端自动化的 3 个新考点
android·ai编程
帅得不敢出门3 小时前
Android Framework关闭软件低电关机功能测试PMIC低电保护
android
熊猫钓鱼>_>3 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 Landscapist 实现图片加载适配
开发语言·kotlin·华为云·ai编程·harmonyos·鸿蒙·openharmony
恋猫de小郭3 小时前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
ZealSinger4 小时前
Kotlin2.4迁移context parameters
kotlin·协程·迁移·kotlin2.4
墨天梦5 小时前
B16_Material主题与可访问交互
android·kotlin·交互
弯_弯5 小时前
企业知识库 RAG 落地:从 Demo 到生产,四条工程链路与参数级自查
android·java·javascript
晚风叙码7 小时前
MySQL 表的约束详解:从空属性到外键
android·数据库·mysql·adb
alexhilton17 小时前
模块化Jetpack Compose架构
android·kotlin·android jetpack
厮年断弦19 小时前
AI 辅助开发实录:一周做完一个 Android 本地音乐播放器,这些坑替你踩了
android