我们可以在另一个类中使用其他类中的可组合函数吗?



我只是在练习jetpack撰写并试图习惯它,我在我的应用程序中创建了一个名为Views的目录,我在该目录中创建了不同的kotlin类,每个类都有不同的可组合功能,用于我的UI的不同部分。问题是我不能从不同的kotlin文件在其他文件中调用可组合函数。

例如,我有一个类Ticket与可组合的TicketView函数

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) {
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
Image(painter = painterResource(id = if(myTicket.getNumber(0) == winingTicket.getNumber(0) && !isActualTicket) R.drawable.ball1star else R.drawable.ball1),"ball 1",modifier = Modifier.fillMaxSize())
Text(
if (isActualTicket) winingTicket.getNumber(0).toString() else myTicket.getNumber(0).toString(),
fontSize = 25.sp,
textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
Image(painter = painterResource(id = if(myTicket.getNumber(1) == winingTicket.getNumber(1) && !isActualTicket) R.drawable.ball1star else R.drawable.ball1),"ball 2",modifier = Modifier.fillMaxSize())
Text(if (isActualTicket) winingTicket.getNumber(1).toString() else myTicket.getNumber(1).toString(),
fontSize = 25.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
Image(painter = painterResource(id = if(myTicket.getNumber(2) == winingTicket.getNumber(2) && !isActualTicket) R.drawable.ball1star else R.drawable.ball1),"ball 3",modifier = Modifier.fillMaxSize())
Text(if (isActualTicket) winingTicket.getNumber(2).toString() else myTicket.getNumber(2).toString(),
fontSize = 25.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
Image(painter = painterResource(id = if(myTicket.getNumber(3) == winingTicket.getNumber(3) && !isActualTicket) R.drawable.ball1star else R.drawable.ball1),"ball 4",modifier = Modifier.fillMaxSize())
Text(if (isActualTicket) winingTicket.getNumber(3).toString() else myTicket.getNumber(3).toString(),
fontSize = 25.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
Image(painter = painterResource(id = if(myTicket.getNumber(4) == winingTicket.getNumber(4) && !isActualTicket) R.drawable.ball1star else R.drawable.ball1),"ball 5",modifier = Modifier.fillMaxSize())
Text(if (isActualTicket) winingTicket.getNumber(4).toString() else myTicket.getNumber(4).toString(),
fontSize = 25.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(1f).size(75.dp,75.dp)){
var id = R.drawable.power1
if(myTicket.getNumber(5) == winingTicket.getNumber(5) && !isActualTicket){
if(isPowerball){
id = R.drawable.powerstar1
}else{
id = R.drawable.megastar1
}
}else{
if(isPowerball){
id = R.drawable.power1
}else{
id = R.drawable.mega1
}
}
Image(painter = painterResource(id =  id),"powerball",modifier = Modifier.fillMaxSize())
Text(if (isActualTicket) winingTicket.getNumber(5).toString() else myTicket.getNumber(5).toString(),
fontSize = 25.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 45.dp))
}
Box(modifier = Modifier.weight(2f).size(75.dp,75.dp)){
Text(winingTicket.calculateWin(myTicket.ticket!!, true),
color = Color.White,
fontSize = 20.sp,textAlign = TextAlign.Center,
style = TextStyle(textDecoration = TextDecoration.Underline),
fontWeight = FontWeight.Bold,
modifier = Modifier.fillMaxSize().paddingFromBaseline(top = 12.dp))
}


}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
PowerMegaTheme {
var myTicket = MyTicket()
myTicket.ticket = "1 2 12 4 5 6"
myTicket.multi = true;
var winningTicket = WinningTicket()
winningTicket.winningNumber = "1 2 12 4 5 6"
winningTicket.multiplier = "2"
TicketView(myTicket = myTicket, winingTicket = winningTicket,isActualTicket = true,isPowerball = true, numTicket = 1)
}
}

}

然后我有一个TicketCard类,其中包含TicketCard可组合函数,我想使用

中的TicketView可组合函数
class TicketCard {
@Composable
fun TicketCard(winningTicket: WinningTicket, myTickets: List<MyTicket>, isPowerball: Boolean){
Card(){
Text(winningTicket.date!!)
var count = 1
for(myTicket in myTickets){
//I would like to use TicketView here
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
PowerMegaTheme {
}
}

}

我试着导入这个类,但是它不让我这么做。也许我构建ui元素的方式不对。

感谢您的宝贵时间。

要创建一个可组合的函数,只需在函数名中添加@Composable注释,而不需要类。

创建文件Ticket.kt。就放在

里面
@Composable
fun TicketView(){    
//your code
}

然后在另一个文件中您可以使用TicketView。唯一的要求是Composable函数只能从另一个Composable函数中调用。

最新更新