Jetpack Compose中能否在类内调用其他类的Composable函数?
核心问题
你现在的写法将Composable函数作为普通Kotlin类的成员方法,调用时必须先实例化对应类才能访问方法,这是你无法直接调用的核心原因。另外这种封装方式也不符合Jetpack Compose的官方开发规范。
推荐解决方案(符合官方最佳实践)
Compose的UI组件推荐直接写为顶层函数,不需要包裹在普通类中,和系统自带的Column、Text等组件用法保持一致:
- 移除
Ticket.kt、TicketCard.kt中的类包裹,将Composable函数直接定义在文件顶层
修改后的Ticket.kt示例:
// 移除class Ticket的包裹,直接写在文件顶层 @Composable fun TicketView(myTicket: MyTicket, winingTicket: WinningTicket, isActualTicket: Boolean, isPowerball: Boolean, numTicket: Int) { Column( ){ // 原有实现逻辑完全不变 if(isActualTicket) Text("Winning Ticket",fontSize = 25.sp) else Text("Ticket " + numTicket,fontSize = 25.sp,) Row(modifier = Modifier.fillMaxWidth().background(color= Color.Black),verticalAlignment = Alignment.CenterVertically) { // 原有Row内部实现不变 } } } @Preview(showBackground = true) @Composable fun DefaultPreview() { // 原有预览代码不变 }
- 此时你在
TicketCard.kt中只要导入对应的TicketView函数,就可以直接调用,修改后的TicketCard代码如下:
// 同样移除class TicketCard的包裹 @Composable fun TicketCard(winningTicket: WinningTicket, myTickets: List<MyTicket>, isPowerball: Boolean){ Card(){ Text(winningTicket.date!!) myTickets.forEachIndexed { index, myTicket -> // 直接调用TicketView TicketView( myTicket = myTicket, winingTicket = winningTicket, isActualTicket = false, isPowerball = isPowerball, numTicket = index + 1 ) } } }
兼容方案(保留原有类结构)
如果你一定要保留Ticket、TicketCard的类封装,有两种修改方式:
- 调用时先实例化对应类:
var count = 1 for(myTicket in myTickets){ Ticket().TicketView( myTicket = myTicket, winingTicket = winningTicket, isActualTicket = false, isPowerball = isPowerball, numTicket = count++ ) }
- 将Composable函数放到类的伴生对象中,无需实例化即可调用:
class Ticket { companion object { @Composable fun TicketView(myTicket: MyTicket, winingTicket: WinningTicket, isActualTicket: Boolean, isPowerball: Boolean, numTicket: Int) { // 原有实现不变 } } } // 调用方式 Ticket.TicketView(/*传入对应参数*/)
内容的提问来源于stack exchange,提问作者JRowan
相关产品推荐
相关产品推荐

