ホームページ  >  記事  >  ルームデータベースを使用してjetpack内のすべてのアイテムを削除した後、UIが再構築されない

ルームデータベースを使用してjetpack内のすべてのアイテムを削除した後、UIが再構築されない

WBOY
WBOY転載
2024-02-06 08:15:04541ブラウズ
質問の内容

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() 関数を変更します。

リーリー

最後に、ステータスとデータを組み合わせて魔法を起こします。いずれかが変更されると、これは自動的に更新されます :)

リーリー

免責事項:これにはスペルミスがある可能性があります。便利なアイデアはありません

コードを改善してこの回答を終了しましょう:

  1. 何も返さない関数 (getfavmoviesinsertmoviedeletemovies) では = を使用しないでください。それ以外の場合は、たとえば getfavmovies が映画のリストを返すことを期待するでしょう

  2. remember { mutablestateof(movieviewmodel.getfavmovies()) } は実際には 何も覚えていませんね。これはとても迷惑です。これをビューモデルに移動することをお勧めします: init { movieviewmodel.getfavmovies() }

  3. val uistates = movieviewmodel.favs.collectasstate(): 名前付けは、これが複数の ui 状態であることを意味します。単数形を使用してください。uistates 同じことがクラスにも当てはまります。自体。さらに、「.value」がここで直接使用されている場合は、ここでの再宣言をスキップできます: when(val currentstate = uistates.value)

  4. あなたの uistate には

    mutablelist9fed9bb6bc0c66d7a13f33ab448de4c5 が含まれています。 ui 状態に可変値を使用するのは悪い考えです。たとえば、stateflow が台無しになる可能性があります。このような状況は必ず避けてください。単純な古いリストを使用してください:) https://www.php.cn/link/ff685590317f1330efc73f396ac92cd7

  5. collectasstate()

    の代わりに collectasstatewithlifecycle() を使用します。 Jetpack-compose-cde014d0d5a3https://medium.com/androiddevelopers/consuming-flows -safely を参照してください。

  6. ビューモデルでは絶対にアクセスしないでください
  7. repoimpl

    : リポジトリをインターフェースと実装に分割するという全体的な考え方は、実装を隠すことです

  8. 画面コンポーザブルを定義することをお勧めします。ビューモデルは必要なく、データのみが必要です。
  9. https://developer.android.com/jetpack/compose/state#state と同様です。 -巻き上げ

  10. .
リーリー

以上がルームデータベースを使用してjetpack内のすべてのアイテムを削除した後、UIが再構築されないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。