当前位置: 首页 > 知识库问答 >
问题:

Jetpack撰写:BottomSheet状态更改回调

岳朝
2023-03-14

如何在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) {  
  }  
});

正如我们过去在Java/静态编程语言中所做的那样。

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

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

但是我想得到一个回调,底部的工作表已经完全折叠,我可以继续我的任务。

我面临的实际问题:我正在通过按钮单击将可组合文件转换为位图。按钮在BottomSheet内部,需要转换的可组合文件在BottomSheet后面。因此,有时底表也会出现在位图中。我想仅在底表完全拼贴时触发该过程。

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

共有1个答案

浦思源
2023-03-14

您可以使用 snapshotFlow,请参阅此处。它从可观察的快照状态创建流。下面是一个示例代码

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

您也可以将此snapshotFlow用于其他事情,例如Pager页面更改回调

    // Page change callback
    LaunchedEffect(pagerState) {
        snapshotFlow { pagerState.currentPage }.collect { page ->
            when (page) {
                0 -> // First page
                1 -> // Second page
                else -> // Other pages
            }
        }
    }
 类似资料:
  • 今天早上在AndroidView遇到了一个奇怪的情况。 我有一个像这样的ProductCard界面 这个接口可以通过多个视图来实现。 呈现 列表的可组合体使用 获取视图,并在重新组合发生时传递状态更新。 在本示例中,与ProductCard视图的任何交互(调用)都不会更新屏幕。日志显示状态得到更新,但关键是每个按钮只更新一次。例如,我有一个收藏夹按钮。单击一次只会推送一次状态更新,任何后续的单击都

  • 我在一个应用程序上使用jetpack comuse实现了登录、注册。我将登录用户重定向到主屏幕,并让新用户保持在登录屏幕上。但问题是当我将用户从登录屏幕重定向到主屏幕,用户按下返回按钮时,登录屏幕就会出现。现在我知道这是导航组件的正常行为,但我需要更改它。我如何做到这一点? 使用此行从登录屏幕导航到主屏幕

  • 很可能是一个新手的问题,因为我对Android开发相当陌生——我在配置更改/导航时在我的@Composable中保存AndroidView的状态时遇到了麻烦,因为factory block被调用(如预期的那样)并且我的图表被重新实例化。 是一个具有复杂图表的第三方组件,我想保留缩放/滚动状态。我知道我可以使用ViewModel跨配置更改保存UI状态,但考虑到保存缩放/滚动状态的复杂性,我想问一下是

  • 正如你所看到的,这就是我用MaterialBottomNavigation实现NavHost的方式,我在消息和提要屏幕上都有很多项目,当我在它们两个屏幕之间导航时,它们会自动重构,但我不想这样做,因为那里有很多数据,它在导航时闪烁和fps下降到10以下,我试图在NavHost之前初始化数据viewModels,但结果仍然相同, 有没有办法一次组成屏幕,并在viewModels数据更新时更新它们?

  • 这是我的导航主机 我从主屏幕到“开始”屏幕很幼稚,但没有从“开始”导航到“计时器”屏幕,我已经传递了与从主屏幕获得的相同的ID。 这个主要可组合的 开始屏幕 当我点击按钮时,应用程序崩溃,错误如下

  • 我需要使用jetpack compose来实现这三种状态的底部表单布局,如何通过最佳实践来实现? https://i.stack.imgur.com/86FXs.png