はじめ
こちらのアプリをつく際に毎秒時刻を取得するのに手間取ったのでメモがてら書き綴っていこうかなと思います。
結論
ViewModel
private val _data = MutableStateFlow(System.currentTimeMillis())
val data:StateFlow<Long> = _data.asStateFlow()
val formatter = SimpleDateFormat("MM/dd:HH:mm")
val formattedTimer:StateFlow<String> = data.map {data ->
formatter.format(data)
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(),"")
init {
viewModelScope.launch {
while (true){
_data.value = System.currentTimeMillis()
delay(1000)
}
}
}
Activity
viewModel.formattedTimer.collectAsState().value.let { formattedTimer ->
....
}
かなり強引だし、init{}でviewModelが生成されてから終了されるまで1秒ごとに時刻を取得するわけですからメモリを食うし、画面が重い動きになるしでよくないのはわかっているのですが、このくらいしか思いつきませんでした。(´;ω;`)
失敗
viewModel
val data = MutableState(System.currentTimeMillis())
val formatter = SimpleDateFormat("MM/dd:HH:mm")
var Time = fomatter.format(data)
これは関数で囲んでいないのでviewModelが生成された一度きりだけ時刻を取得するので、失敗しました。
varにはしてみましたが、そもそも更新されないので変数にする意味が.....
今考えれば関数内でフィールド値を設定して、戻り値をTimeにすればよかったのでは?
改善
コードは上記の結論のコードと同じです。
以前に、学んだFlowをつかってAcitivityでcollectAsState()で変更されたときにviewModelから取得すればいいのではと思い実装してみました。
これのメリットとしては毎秒取得しているので、画面に現在の時刻を一秒刻みで出力したい方などはいいと思います。それ以外は重くなるのでお勧めしないかも....
終わり
以上になります。
質問や改善案など、参考になるものなどあれば是非教えてください!