如何轻松扩展Jetpack Compose组件?

问题描述 投票:0回答:2

我想自定义实现

ScrollableTabRow
,它允许可组合元素“粘性”地显示在选项卡行的右端。但我无法找到一种简单的方法来扩展默认实现的功能。

首先,

ScrollableTabRow
不是一个类,所以我无法真正“扩展”它。它是一个函数,所以我必须复制它(并将其重命名为,比如说,
StickyTabRow
),然后在我认为合适的地方和方式更改逻辑。然而,这样做的问题是,
ScrollableTabRow
的默认实现使用了几个私有和内部变量、单例对象和函数,我无法在自己的文件中访问这些变量。因此,我需要将所有这些依赖项复制到
StickyTabRow
中,然后复制这些依赖项的依赖项,依此类推。

实现自定义可组合组件不是很困难吗?我在这里缺少什么?

kotlin tabs android-jetpack-compose android-jetpack extend
2个回答
2
投票

根据我的经验,很少需要实际复制核心可组合项并进行小的更改。大多数时候,您只需使用正确的容器和/或传递正确的修饰符和内容函数就可以做您想做的事情。

话虽如此,我确实同意,如果这些私有辅助函数可以在您实际需要自定义副本的罕见情况下使用,那就太好了。


0
投票

实现自定义可组合组件当然不是这样的 难的?我在这里缺少什么?

大多数时候,编写一个包含核心 Composable 的 Composable 和更新逻辑或组合修饰符就足以满足您的要求。

但是,在某些情况下,您需要通过复制粘贴源代码来编写可组合项或修饰符来更新很小的部分,因为某些参数不会向开发人员公开。

例如,要更改 ScrollableTabRow 行的最小尺寸,您可能需要复制粘贴整个源代码进行更改,以便选项卡的最小尺寸可以低于 90.dp。

private val ScrollableTabRowMinimumTabWidth = 90.dp

就像这里。

https://stackoverflow.com/a/76533630/5457853

或者,当您需要一个返回除黑线之外的可绘制区域边界的图像可组合项时,您需要从头开始重写它。

https://github.com/SmartToolFactory/Compose-Image

或者一个可以添加自定义拇指的滑块,它是为Material3重写的,但在M2版本中它不可用。所以你需要从头开始重写。

此外,没有单击、变换拖动修改器,可以让您不消耗或改变传播方向。因此,在这种情况下,您需要重写源代码,如下所示。当手势开始或结束时,变换手势也不会返回。

https://stackoverflow.com/a/76021552/5457853

或这里

https://stackoverflow.com/a/70847531/5457853

可能有很多示例您可能需要复制粘贴可组合项或修饰符,但与可以使用默认可组合项或修饰符的情况相比,这些示例并不多。

如果您需要的某些参数未公开,并且没有其他方法可以通过约束、大小修饰符、其他修饰符或将其包装在另一个可组合项中来更改它,您的选择是复制粘贴源代码并在需要更改的位置进行更改.

但好的一点是,除了 LazyList 之外,大多数可组合组件都非常简单,并且复制粘贴后很容易进行修改。

© www.soinside.com 2019 - 2024. All rights reserved.