jetpack compose を使用してムービー アプリを構築しました。その中でユーザーが選んだお気に入りの映画を紹介しています。お気に入りは UI に完全に存在するはずですが、UI から項目を削除しても、変更を反映するように UI がすぐに再編成されません。何をするか?
これは私のユーザーインターフェイスです
リーリーこれは私のビューモデルです
@composable fun favscreen( movieviewmodel: movieviewmodel ) { remember { mutablestateof(movieviewmodel.getfavmovies()) } val shouldshowdialog = remember { mutablestateof(false) } val uistates = movieviewmodel.favs.collectasstate() column { row { text( text = "fav movies", fontsize = 25.sp, fontfamily = fontfamily(font(r.font.nsb)), modifier = modifier.padding(20.dp).weight(1f) ) iconbutton(onclick = { shouldshowdialog.value = true }) { icon(icons.filled.delete, contentdescription = "") } } when(val currentstate = uistates.value){ is movieviewmodel.uistates.loading -> { box(modifier = modifier.fillmaxsize(), contentalignment = alignment.center) { circularprogressindicator() } } is movieviewmodel.uistates.favs -> { val data = currentstate.data if(data.isempty()){ box(modifier = modifier.fillmaxsize(), contentalignment = alignment.center) { text( text = "no fav movies", fontsize = 25.sp, fontfamily = fontfamily(font(r.font.nsb)), modifier = modifier.padding(20.dp)) } } else { lazycolumn(){ items(data){ fav -> row(modifier = modifier .padding(20.dp) .fillmaxwidth() .clip(roundedcornershape(16.dp)) .background(color = color.darkgray)) { asyncimage( model = utils.image_url + fav.imageurl, contentdescription = "", contentscale = contentscale.crop, filterquality = filterquality.high, modifier = modifier .width(150.dp) .height(150.dp)) column(modifier = modifier.padding(20.dp)) { text( text = fav.title!!, fontsize = 20.sp, fontfamily = fontfamily(font(r.font.nsb))) text( text = fav.rating.tostring() + "/10 imdb", fontsize = 15.sp, fontfamily = fontfamily(font(r.font.nsb))) text( text = "movie id : #" + fav.movieid, fontsize = 15.sp, fontfamily = fontfamily(font(r.font.nsb))) } } } } } } is movieviewmodel.uistates.error -> { box(modifier = modifier.fillmaxsize(), contentalignment = alignment.center){ text( text = "no fav movies", fontsize = 25.sp, fontfamily = fontfamily(font(r.font.nsb)), modifier = modifier.padding(20.dp)) } } else -> {} } } if (shouldshowdialog.value){ alertdialog( ondismissrequest = { shouldshowdialog.value = false }, confirmbutton = { textbutton(onclick = { movieviewmodel.deletemovies() shouldshowdialog.value = false }) { text(text = "proceed", fontfamily = fontfamily(font(r.font.nsm))) } }, dismissbutton = { textbutton(onclick = { shouldshowdialog.value = false }) { text(text = "cancel", fontfamily = fontfamily(font(r.font.nsm))) } }, shape = roundedcornershape(16.dp), text = { text(text = "favs deletion",fontfamily = fontfamily(font(r.font.nsb)))}, title = { text(text = "do you want to delete all fav movies ?", fontfamily = fontfamily(font(r.font.nsb)))} ) } }
_favs
の記述された使用法を見ると、問題は非常に明白になります。
getfavmovies
のみが更新します。
これは「削除関数で UI 状態を更新する必要がある」ように聞こえますが、別の解決策を提案したいと思います。
room
flows
の力を活用してください!
最初にビューモデルで loadingstate
を定義します。これはストリームとして保存されます:
次に、このメカニズムを使用するように getfavmovies()
関数を変更します。
最後に、ステータスとデータを組み合わせて魔法を起こします。いずれかが変更されると、これは自動的に更新されます :)
リーリー免責事項:これにはスペルミスがある可能性があります。便利なアイデアはありません
コードを改善してこの回答を終了しましょう:
何も返さない関数 (getfavmovies
、insertmovie
、deletemovies
) では =
を使用しないでください。それ以外の場合は、たとえば getfavmovies
が映画のリストを返すことを期待するでしょう
remember { mutablestateof(movieviewmodel.getfavmovies()) }
は実際には 何も覚えていませんね。これはとても迷惑です。これをビューモデルに移動することをお勧めします:
init { movieviewmodel.getfavmovies() }
val uistates = movieviewmodel.favs.collectasstate(): 名前付けは、これが複数の ui 状態であることを意味します。単数形を使用してください。
uistates 同じことがクラスにも当てはまります。自体。さらに、「.value」がここで直接使用されている場合は、ここでの再宣言をスキップできます:
when(val currentstate = uistates.value)
mutablelist が含まれています。 ui 状態に可変値を使用するのは悪い考えです。たとえば、
stateflow が台無しになる可能性があります。このような状況は必ず避けてください。単純な古いリストを使用してください:)
https://www.php.cn/link/ff685590317f1330efc73f396ac92cd7
の代わりに collectasstatewithlifecycle()
を使用します。 Jetpack-compose-cde014d0d5a3 の https://medium.com/androiddevelopers/consuming-flows -safely を参照してください。
: リポジトリをインターフェースと実装に分割するという全体的な考え方は、実装を隠すことです
以上がルームデータベースを使用してjetpack内のすべてのアイテムを削除した後、UIが再構築されないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。