Perché non c'è più il Datastore è creato?

0

Domanda

java.lang.IllegalStateException: non Ci sono più i Datastore attivo per lo stesso file: /data/user/0/com.firstgoalkeeper.firstgoalkeeper/files/archivio/player_pref.preferences_pb. Si dovrebbe mantenere il vostro Archivio dati come un singleton o confermare che non c'è due DataStore attiva sullo stesso file (con la conferma che l'ambito di applicazione è annullato).

class Constants {
    companion object{
     const val PLAYER_PREFERENCE = "player_pref"
        val PLAYER_SELECTION_KEY = intPreferencesKey("player_selection")
    }
}
    
abstract class PrefsDataStore(context: Context, fileName: String) {
    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
        fileName
    )

    val mdataStore: DataStore<Preferences> = context.dataStore
}

class PlayerSelectionDataStore(context: Context) : PrefsDataStore(context, 
    PLAYER_PREFERENCE) {


    suspend fun storeIndex(index: Int) {
         mdataStore.edit {
            it[PLAYER_SELECTION_KEY] = index
        }
    }

    val userSelectionFlow: Flow<Int> = mdataStore.data.map {
        it[PLAYER_SELECTION_KEY] ?: 4
    }
}


@Composable
fun PlayerSelection() {
    val context = LocalContext.current
    val playerSelectionDataStore = PlayerSelectionDataStore(context)

    var index by remember {
        mutableStateOf(4)
    }
   


    Log.d("index", "PlayerSelection: we are at index ${index} ")
    Log.d("index", "PlayerSelection: we select ${allTeamsLists[index].name} ")

    Row(
        verticalAlignment = Alignment.CenterVertically, modifier = Modifier
            .fillMaxSize()
            .background(color = goalkeeperBackground)
    ) {
    // ...
        Box(
            modifier = Modifier
                .clickable {
                    GlobalScope.launch {
                        playerSelectionDataStore.storeIndex(index)

                    }
                    Toast
                        .makeText(
                            context,
                            "${allTeamsLists[index].name} player is Selected ",
                            Toast.LENGTH_SHORT
                        )
                        .show()
                }
                ...
        ) {...}

Che cosa ho fatto di sbagliato e suggerire le migliori prassi.

1

Migliore risposta

1

A destra non si sta creando un nuovo PlayerSelectionDataStore oggetto su ogni ricomposizione.

Il minimo che si può fare è avvolgere con remember:

val playerSelectionDataStore = remember(context) { PlayerSelectionDataStore(context) }

Una soluzione più generale:

@Composable
fun <T> rememberPreference(
    key: Preferences.Key<T>,
    defaultValue: T,
): MutableState<T> {
    val coroutineScope = rememberCoroutineScope()
    val context = LocalContext.current
    val state = remember {
        context.dataStore.data
            .map {
                it[key] ?: defaultValue
            }
    }.collectAsState(initial = defaultValue)

    return remember {
        object : MutableState<T> {
            override var value: T
                get() = state.value
                set(value) {
                    coroutineScope.launch {
                        context.dataStore.edit {
                            it[key] = value
                        }
                    }
                }

            override fun component1() = value
            override fun component2(): (T) -> Unit = { value = it }
        }
    }
}

private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "preferences")

Utilizzo:

var text by rememberPreference(stringPreferencesKey("key_text"), defaultValue = "World")
TextField(value = text, onValueChange = { text = it })
2021-11-24 06:46:00

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................