왜 거기에 여러 데이터 저장소이 만들어질까요?

0

질문

java.랭.IllegalStateException:여러 개 있는 데이터 저장에 대해 활성화 같은 파일://데이터의 사용자/0/com.firstgoalkeeper.firstgoalkeeper/파일/데이터스토어/player_pref.preferences_pb. 당신이해야 하거나 유지하는 데이터 저장소로 단일이나 확인하는 없다는 것을 두 데이터 저장소의 활동에서 같은 파일(에 의해 확인하는 범위 취소).

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

무엇을 했는지 잘못된 것이 좋습니다.

1

최고의 응답

1

지 않을 권리를 만드는 새로운 PlayerSelectionDataStore 체에서 각 재구성.

적어도 당신이 할 수있는 그것을 감싸기 remember:

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

좀 더 일반적인 솔루션:

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

사용법:

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

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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