Jetpack 撰写:BottomSheet 状态更改回调

Jetpack compose : BottomSheet state change callback

如何在 JetPack Compose BottomSheet 状态更改上实现 callback/listener 机制?

类似于:

   @Override  
   public void onStateChanged(@NonNull View bottomSheet, int newState) {  
     if (newState == BottomSheetBehavior.STATE_COLLAPSED && mIsCollapsedFromBackPress){
        
     }
   }  

  @Override  
  public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
  }  
});

就像我们在 Java/Kotlin 中所做的那样。

现在,我将其作为 lambda 传递给另一个需要关闭 bottomsheet 的可组合项。

    val closeSheet: () -> Unit = {
        scope.launch {
            modalState.hide()
        }
    }

但是我想得到bottomsheet已经完全折叠的回调,我可以继续我的任务。

我面临的实际问题: 我在单击按钮时将可组合项转换为位图。按钮位于 BottomSheet 内部,需要转换的可组合项位于 BottomSheet 后面。因此,有时 bottomsheet 也会出现在位图中。我只想在底页完全折叠时触发该过程。

我在 SO 上找到了 答案,但问题仍然与回调有关。不知道怎么用。

可以使用snapshotFlow,参考。它从可观察的快照状态创建流。这是一个示例代码

    // State change callback
    LaunchedEffect(sheetState) {
        snapshotFlow { sheetState.isVisible }.collect { isVisible ->
            if (isVisible) {
                // Sheet is visible
            } else {
                // Not visible
            }
        }
    }

您也可以将此 snapshotFlow 用于其他用途,例如寻呼机页面更改回调

    // Page change callback
    LaunchedEffect(pagerState) {
        snapshotFlow { pagerState.currentPage }.collect { page ->
            when (page) {
                0 -> // First page
                1 -> // Second page
                else -> // Other pages
            }
        }
    }