【问题标题】:Show Snackbar in MainActivity (root @Composable) from any child composable (Jetpack Compose)在 MainActivity(根 @Composable)中显示任何子可组合(Jetpack Compose)的 Snackbar
【发布时间】:2021-06-13 13:15:41
【问题描述】:

我想在 MainActivity(根可组合)中显示来自任何孩子 @Composable 的快餐栏。

我的第一个想法是使用CompositionLocalProvider 提供SnackbarHostState,但这似乎不起作用(或者我做错了)。


    val mainSnackBarHostState = remember { SnackbarHostState() }
    val SnackBarHostStateProvider = compositionLocalOf<SnackbarHostState> { mainSnackBarHostState }

    CompositionLocalProvider(SnackBarHostStateProvider provides mainSnackBarHostState) {
        MainScreenNavigationConfigurations(navController)
    }

我的孩子@Composable 似乎无法找到/访问SnackBarHostStateProvider

有什么想法吗?

【问题讨论】:

  • 我猜你“必须”在覆盖整个屏幕(即你的根布局)的组合中定义诸如小吃店之类的东西,并定义一个 livedata 以在视图模型中与小吃店交互并传递该视图使用CompositonLocalProvider 对可组合树进行建模,并随时随地在代码中的任何位置进行交互

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


【解决方案1】:

我会说,最好的方法是将小吃栏的状态(可见/不可见)存储在您的视图模型中,然后让小吃栏从那里读取。无论何时何地,您想要切换状态,只需更改视图模型中的值,就可以了

如果您不熟悉视图模型,这是构建应用程序的推荐和标准方式,请记住,在 Compose 中,推荐的方式是将状态存储在视图模型中,而不是作为常规变量,而是作为状态持有者。

例如,在您的用例中,您可以将小吃店的可见性状态存储为 mutableStateOf(false),因为初始可见性值为 false。

这假设您可以从整个应用程序访问您的视图模型,开发人员通常会这样做,无论他们需要更新状态,所以,祝您好运

【讨论】:

    【解决方案2】:

    您可能需要将变量 SnackBarHostStateProvider 声明为包级变量,以便能够从提供程序和子项访问它。

    另请参阅此相关答案:https://stackoverflow.com/a/69905470/293878

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 2022-09-25
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多