Pourquoi il y a plusieurs Magasin de données est créé?

0

La question

java.lang.IllegalStateException: Il y a plusieurs Banques de données active pour le même fichier: /data/utilisateur/0/com.firstgoalkeeper.firstgoalkeeper/fichiers/magasin/player_pref.preferences_pb. Vous devez maintenir votre Magasin de données comme un singleton ou de confirmer qu'il n'existe pas de deux de la banque de données active sur le même fichier (en confirmant que la portée est annulé).

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()
                }
                ...
        ) {...}

Ce que j'ai fait de mal et de proposer les meilleures pratiques.

1

La meilleure réponse

1

Droit de ne pas vous êtes en train de créer un nouveau PlayerSelectionDataStore objet sur chaque recomposition.

Le moins que l'on puisse faire est de l'enveloppant avec remember:

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

Plus de solution générale:

@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")

Utilisation:

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

Dans d'autres langues

Cette page est dans d'autres langues

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