【问题标题】:How can I implement Bottom sheet with BottomBar in jetpack compose如何在jetpack compose中使用BottomBar实现底部表
【发布时间】:2021-09-08 10:03:34
【问题描述】:

所以我想要实现的是:

  • 一个家庭可组合,承载一个底部导航栏(这里使用脚手架)
  • 底部导航栏附加了 3 个其他可组合项
  • 3 个可组合项中的每一个都有自己的惰性列
  • 3 个惰性列中的每个项目都有一个菜单图标,单击该图标会打开底部工作表

借助此处的答案,我可以通过将脚手架封闭在 ModalBottonSheetLayout 中来实现上述目的:Jetpack Compose Scaffold + Modal Bottom Sheet

问题:

  • 底部工作表的目的是显示一个菜单项,单击该菜单项应从lazyColumn 中删除该项目
  • 所以底部工作表需要知道被点击删除它的项目的详细信息

我怎样才能做到这一点? 主可组合项没有任何有关其托管的可组合项中存在的惰性列中的项目的信息。

有没有其他方法可以解决这个问题?

这是我的代码:

HomeComposable.kt

fun HomeComposable(homeViewModel: HomeViewModel, 
     navController: NavHostController) {
        ModalBottomSheetLayout(
           sheetContent = {
           //get the id of the message here so it can be     
           //deleted
               Button(
                   text = "delete Message")
                   onClick = deleteMessage(message.id
               )
           }
) {
    Scaffold(
    content = {
    NavHost(navController = navController, startDestination = 
    WHATS_NEW_COMPOSABLE) {

          composable(MESSAGES_COMPOSABLE) {
            MessageItemsComposable(
                homeViewModel,
                navController,
                bottomSheetState
            )
          }
 
    }
  }  
)

MessageItemsComposable.kt

val messages : List<Messages> = getMessagesFromNetwork()

LazyColumn {
    items(messages) { message ->
    Row{
        Text(message.title)
        Icon(
            onClick = {
             bottomState.show()
             //show a bottom sheet with an option to delete                 
            }
        ) {

           //Draw the icon
           }
        }            
    }
}

【问题讨论】:

  • 可以附上代码吗?
  • 嗨@StefanoSansone,我已经用我的代码更新了问题
  • 你能解决这个问题吗?
  • @vn1gam 是的,我能够解决它,但解决方案相当复杂......所以这就是我所做的: - 在 NavGraph 中创建一个可变变量,它保存当前值在惰性列中单击的项目之一中单击的菜单项(初始化时它将是一个虚拟值) - 将此变量作为参数传递给相应的可组合项 - 在 LC 中单击菜单项时填充此值 - 现在NavGraph 在变量中填充了正确的值 - 底部工作表现在可以显示菜单并为此特定项目执行逻辑希望这有助于...

标签: android android-jetpack-compose android-jetpack-compose-list jetpack-compose-navigation android-jetpack-compose-scaffold


【解决方案1】:

对于这种情况,我会使用带有 StateFlow 的存储库。这个存储库将是一个单例,它负责维护数据并删除它们。您的可组合列表将监听状态变化,并且您的底部表单将调用 delete() 来删除选定的元素。

class Repository<T> {
    private val _state = MutableStateFlow<T>(initialState)
    val state: StateFlow<T> = _state

    fun delete(data: T) {
        _state.remove(data)
    }
}

可组合列表的父级应提供回调。当用户单击列表项并且该项作为参数传递时,应调用此回调。

@Composable
fun DataList(onItemClick(item: T)) {
    // list implementation with onItemCkick as onClick callback
}

调用时,您可以打开底部表并将项目传递给它。

【讨论】:

  • 嗨,我需要你的帮助,这就是我正在寻找的。我有 8 个按钮和 1 个底部表,当我单击底部表中的文本时,如何更改按钮的文本。问题是 bottomSheet 不知道点击了哪个按钮
  • 嗨,我认为最好打开一个问题以获得更多上下文。但据我了解,您必须将回调传递给底部工作表以通知按钮带有新文本,并最终列出要在底部工作表中显示的文本。根据单击的按钮,您可以使用不同的回调和文本列表调用底部工作表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多