Jetpack compose:BottomSheet 状态更改回调

ank*_*ag2 6 android bottom-sheet android-jetpack android-jetpack-compose

如何实现 JetPack Compose BottomSheet 状态更改的回调/侦听器机制?

类似于:

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

  @Override  
  public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
  }  
});
Run Code Online (Sandbox Code Playgroud)

正如我们过去在 Java/Kotlin 中所做的那样。

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

    val closeSheet: () -> Unit = {
        scope.launch {
            modalState.hide()
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

我在 SO 上找到了这个答案,但问题仍然是关于回调。不知道如何使用它。

小智 19

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

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

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

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