86412


`Room`に保存した`isValid`フラグ(`Boolean`)の値を見て  
`true`だったら青の`Text`を表示して  
`false`だったら赤の`Text`を表示するような場合を考えます。

`Room`に`isValid`フラグを`true`で保存して再度アプリを立ち上げると  
`observeAsState`の`initial値`である`false`を`isValidState`は  
取得してその後から`Flow`で流れてきた`true`を取得します。  
そのため、一瞬`false`のときの赤の`Text`が出てきてから消えて青の`Text`が  
表示されます。  
このような場合に、最初から`DB`の値に対応した青の`Text`だけを表示させる方法は  
皆さまどのようにされておりますでしょうか？ご存じもしくはアイデアのある方が  
いらっしゃられましたら、何卒お知恵を頂けますでしょうか。  
よろしくお願い致します。

[code]

    // Composable
    val isValidState by viewModel.isValid.observeAsState(initial = false)
    
    if (isValidState) {
        Text(text = "青", color = Color.Blue)
    } else {
        Text(text = "赤", color = Color.Red)
    }
    
    // Viewmodel
    val isValid: LiveData<Boolean> = repository.isValid.asLiveData()
    
    // Repository
    val isValid: Flow<Boolean> = dao.isValid()
    
    // Dao
    @Query("SELECT isValid FROM hoge WHERE id = 0")
    fun isValid(): Flow<Boolean>
    
[/code]


CC BY-SA 4.0
2022-02-13T12:16:48.127
86318
2022-02-17T07:06:05.830
51408
question
android kotlin
RoomのデータをFlow経由でLiveDataに渡して初期値の表示を挟まずにComposeに値を反映させたい


`observeAsState`の初期値を無くすと`nullable`型になりました。  
初回コンポーズ時は、`DB`からまだ値が取れていませんので`null`が入り  
その後に値が流れてきます。  
よって、以下のコードで最初から`DB`の保存値である`true`の場合だけ表示できました。

[code]

    val isValidState: Boolean? by viewModel.isValid.observeAsState()
    
    isValidState?.let {
        if (it) {
            Text(text = "青", color = Color.Blue)
        } else {
            Text(text = "赤", color = Color.Red)
        }
    }
    
[/code]


CC BY-SA 4.0
2022-02-17T07:06:05.830
86412
2022-02-17T07:06:05.830
51408
86318
answer