Jetpack Compose - 布局可重用组件

2024-05-01

为了练习 Jetpack Compose 中的可重用组件,我开始了一些练习。 见下图。

正如我想象的那样,绿色行、输入行以及之间的行具有相同的结构。 第一个元素获得了可用空间,第二个元素获得了 50.dp,最后一个元素获得了 70.dp。 我尝试将宽度分成变量,并将该变量作为修饰符传递给行中的单个元素。我想如果我需要额外的字段,我可以毫无问题地扩展它。

代码不起作用!

@Composable
fun groundComponent(
    modifier: Modifier = Modifier,
    spaceBetween: Dp = 0.dp,
    color: Color,
    content: @Composable () -> Unit
) {
    Surface(
        color = color
    ) {
        Row(
            modifier = modifier,
            horizontalArrangement = Arrangement.spacedBy(spaceBetween)
        ) {
            content()
        }
    }
}

@Composable
fun inputSection() {
val firstRowWidth = 1F
val secondRowWidth = 70.dp
val thirdRowWidth = 50.dp

Text("Add Ingredient")
groundComponent(color = Color.Green){
            Text( text="Ingredient", modifier = Modifier.weight(firstRowWidth ))
            Text( text="Amount", modifier = Modifier.widthIn(secondRowWidth ))
            Text( text="Unit", modifier = Modifier.widthIn(thirdRowWidth ))
        }
groundComponent{
            Text( text="Sugar", modifier = Modifier.weight(firstRowWidth ))
            Text( text="500", modifier = Modifier.widthIn(secondRowWidth ))
            Text( text="gr", modifier = Modifier.widthIn(thirdRowWidth ))
        }
groundComponent{
            Text( text="Carrot", modifier = Modifier.weight(firstRowWidth ))
            Text( text="1.5", modifier = Modifier.widthIn(secondRowWidth ))
            Text( text="kg", modifier = Modifier.widthIn(thirdRowWidth ))
        }
groundComponent{
                TextField(
value = "newIngredient", 
onValueChange = {}, 
modifier = Modifier.weight(firstRowWidth ))
            TextField(
value = "newAmount", 
onValueChange = {}, 
modifier = Modifier.widthIn(secondRowWidth )
)
            TextField(
value = "newUnit", 
onValueChange = {}, 
modifier = Modifier.widthIn(thirdRowWidth )
)
        }
Button(onClick={}){Text("add")}
}

我在使用 .weight 修饰符时遇到了几个错误。 那么如何才是解决这种情况的正确方法呢?

Thanks!


Modifier.weight 是在特定范围(例如 RowScope 和 ColumnScope)中定义的 Modifier。为了能够使用在特定范围内定义的修饰符,您需要将 Receiver 添加到您的内容中。例如,BoxScope 定义为 Modifier.align(),您也可以定义您的范围。

@Composable
fun GroundComponent(
    modifier: Modifier = Modifier,
    spaceBetween: Dp = 0.dp,
    color: Color=Color.Unspecified,
    content: @Composable RowScope.() -> Unit
) {
    Surface(
        color = color
    ) {

        // Can't call content here because it has RowScope as receiver
//        content()
        Row(
            modifier = modifier,
            horizontalArrangement = Arrangement.spacedBy(spaceBetween)
        ) {
            content()
        }
    }
}

同样在 InputSection 中,您将重量分数定义为

val firstRowWidth = 1F
val secondRowWidth = 70.dp
val thirdRowWidth = 50.dp

这些值应该彼此成比例

例如,如果您设置 1/5/6。或 0f-1f 之间

按照惯例,您可以使用大写首字母来命名 Composable,因为它们被视为小部件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose - 布局可重用组件 的相关文章

随机推荐

  • Javascript继承无限循环

    我在 javascript 中创建了这段代码 function Shape Shape prototype name Shape Shape prototype toString function result if this constr
  • maven-compiler-plugin 无法编译 Eclipse 没有问题的文件[重复]

    这个问题在这里已经有答案了 Eclipse 编译以下代码没有任何问题 而当mvn尝试编译此代码 结果编译失败 try Distribution rep get id returns a java util Optional Distribu
  • Python 请求与 PyCurl 性能

    Requests 库与 PyCurl 的性能相比如何 我的理解是 Requests 是 urllib 的 python 包装器 而 PyCurl 是本机 libcurl 的 python 包装器 因此 PyCurl 应该获得更好的性能 但不
  • Java - 哪个是 Graph 的最佳实现结构?

    图很大但是无向 边缘未加权 在我的实现中 我必须找到具有最大度数的顶点并在顶点和边上进行删除 链接列表 数组列表 地图 哪一种更适合我的实施 表示图的两个基本数据结构是 adjacency list the adjacency matrix
  • Angular 2子组件引用父组件

    我有一个包含三个组件的应用程序 应用程序 编辑视图 对话框 应用程序组件包含 EditView 组件 该组件可以包含许多其他 EditView 组件和一个 Dialog 组件 如果 Dialog 组件在页面上可见 对话框组件包含应用程序组件
  • 什么构成“有效”C 标识符?

    根据 Zaibis 的建议 并且与我自己的相关 answer to 宏名称的有效字符是什么 https stackoverflow com a 34315237 547214 也g 不允许的标识符中的 和其他 Unicode 字符 http
  • Timer 和 TimerTask - 如何从 TimerTask 运行中重新安排 Timer

    基本上我想做的是制作一个在 x 秒后运行特定 TimerTask 的计时器 但随后 TimerTask 可以重新安排计时器在 y 秒后执行任务 示例如下 它在我尝试在 TimerTask 运行中安排此任务的行上给出错误 线程 Timer 0
  • SwiftUI如何用TabView隐藏导航栏

    我正在使用 SwiftUITabView inside NavigationView 但我就是无法在iOS 13 0模拟器中隐藏导航栏 这是代码 import SwiftUI struct TestView View var body so
  • 模拟、存根和假对象之间有什么区别[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 尽管有大量资源 但即使在 SO 上 这些 Q A 中也仅对其中两个术语进行了比较 那么 简而言之 它们各自是什么 它们之间有何关系 或者他们根本就没有
  • 如何通过id获取消息discord.py

    我想知道如何通过消息 ID 获取消息 我努力了discord fetch message id and discord get message id 但两者都会提出 Command raised an exception Attribute
  • 如何从字符串中删除或替换所有标点符号?

    我有一个由单词组成的字符串 其中一些包含标点符号 我想删除它们 但我一直不知道如何做到这一点 例如 如果我有类似的东西 var words Hello this is a string 我希望能够创建一个数组 Hello this is a
  • Rails - 从对象哈希创建选择标签

    我需要根据哈希中的可用值创建一个选择框 例如 我有一个 事物 该 事物 有多种状态字段 1 gt State A 2 gt State B 通过事物上的方法可用 我如何从中构建一个选择标签 正如施罗克韦尔所说 Hash each a 返回以
  • 如何删除WKWebView中的缓存?

    任何一个合作过的人WKWebView并尝试清除缓存 如果是 该怎么做 有什么例子吗 P S Normal NSURLCache不管用 更新的 Swift 5 版本 WKWebsiteDataStore default removeData
  • 否定句子的算法

    我想知道是否有人熟悉算法句子否定的任何尝试 例如 给定一个句子 这本书很好 请提供任意数量的意思相反的替代句子 例如 这本书不好 甚至 这本书不好 显然 以高精度实现这一点可能超出了当前 NLP 的范围 但我确信在这个主题上已经有了一些工作
  • Bash 脚本问题

    我可以很好地运行这个命令 并得到我想要的输出 ifconfig eth0 grep HWaddr awk print 5 但是 当我将命令设置为变量并打印该变量时 出现错误 CASS INTERNAL ifconfig eth0 grep
  • 为什么使用 DIV 或 span 标签比使用表格布局“更好”? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么不在 HTML 中使用表格进行布局 https stackoverflow com questions 83073 why not use tables for layout in html 为
  • 输入实例不是 JSON 格式

    我正在使用 Google 的公共模板和示例来练习 GCP ML 引擎here https github com GoogleCloudPlatform cloudml samples tree master cloudml template
  • 从头开始使用映像部署无法启动

    我正在使用以下内容构建图像Dockerfile FROM golang 1 19 2 bullseye as builder COPY src src WORKDIR src RUN CGO ENABLED 1 go build race
  • 使用新的 iOS Facebook SDK API (3.0) 上传照片

    如何使用新的 API SDK 从 iOS 应用程序将照片上传到 Facebook 我已经尝试过 但一事无成 只能继续原地踏步 这是我目前拥有的代码 void dataForFaceboo self postParams NSMutableD
  • Jetpack Compose - 布局可重用组件

    为了练习 Jetpack Compose 中的可重用组件 我开始了一些练习 见下图 正如我想象的那样 绿色行 输入行以及之间的行具有相同的结构 第一个元素获得了可用空间 第二个元素获得了 50 dp 最后一个元素获得了 70 dp 我尝试将