【问题标题】:How to display a message only when no items are returned in Jetpack Compose?如何仅在 Jetpack Compose 中未返回任何项目时显示消息?
【发布时间】:2022-09-23 17:30:35
【问题描述】:

我正在尝试使用分页实现搜索功能。这是我尝试过的:

fun SearchScreen(
    viewModel: SearchViewModel = hiltViewModel()
) {
    var search by rememberSaveable(
        stateSaver = TextFieldValue.Saver
    ) {
        mutableStateOf(TextFieldValue(\"\"))
    }
    val searchText = search.text
    val searchItems = viewModel.getSearchItems(searchText).collectAsLazyPagingItems()

    Scaffold(
        topBar = {
            SearchTopBar(
                search = search
            )
        },
        content = {
            LazyVerticalGrid(
                columns = GridCells.Adaptive(minSize = 128.dp)
                content = {
                    items(searchItems.itemCount) { index ->
                        val item = searchItems[index]
                        ItemCard(item)
                    }
                }
            )
            if (searchItems.itemCount == 0 && searchText.isNotEmpty()) {
                Text(\"No items found.\")
            }
        }
    )
}

现在,当我执行没有结果的搜索时,我想显示一个文本。哪个有效,但是在加载结果时也会显示此文本。例如,我想搜索“培根”。我输入b 它加载以b 开头的项目,我输入a,它显示“未找到项目。”然后显示以ba 开头的项目。我只想在没有结果时显示。我怎样才能做到这一点?


编辑:

fun getSearchItems(searchText: String) = repo.getSearchItems(searchText)

在回购中:

override fun getSearchItems(searchText: String) = Pager(
    config = config
) {
    AppPagingSource(
        query = db.collection(\"items\")
            .startAt(searchText)
            .endAt(\"$searchText\\uf8ff\")
            .limit(PAGE_SIZE)
    )
}.flow

    标签: android kotlin android-jetpack-compose kotlin-coroutines kotlin-flow


    【解决方案1】:

    在您的lazygrid 内容中添加 if 条件并将Text("No items found.") 添加到item{} 块中。

    你的榜样;

    @Composable
    fun SearchScreen(
        viewModel: SearchViewModel = hiltViewModel()
    ) {
        var search by rememberSaveable(
            stateSaver = TextFieldValue.Saver
        ) {
            mutableStateOf(TextFieldValue(""))
        }
        val searchText = search.text
        val searchItems = viewModel.getSearchItems(searchText).collectAsLazyPagingItems()
    
        Scaffold(
            topBar = {
                SearchTopBar(
                    search = search
                )
            },
            content = {
                LazyVerticalGrid(
                    columns = GridCells.Adaptive(minSize = 128.dp)
                    content = {
                        if(searchItems.isNotEmpty()){
                            items(searchItems.itemCount) { index ->
                               val item = searchItems[index]
                               ItemCard(item)
                            }
                        }else{
                            item {
                                Text("No items found.")
                            }
                        }
                    }
                )
            }
        )
    }
    

    【讨论】:

    • 嘿。谢谢,但我得到了完全相同的行为。加载时会显示文本消息。你还有别的想法吗?
    • 你能分享 getSearchItems() 函数吗,你可以用我在this问题中解释的 Response 类返回你的值。喜欢;搜索项目<响应<列表<项目>>>
    • 我已经做了。请检查。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2021-08-04
    • 2022-11-04
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多