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

JRo*_*wan 7 android kotlin android-jetpack-compose

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

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

}

然后我有一个带有 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 {

    }
}
Run Code Online (Sandbox Code Playgroud)

}

我尝试导入该类,但它不允许我这样做。也许我正在以错误的方式构建我的 ui 元素。

感谢您的时间。

Gab*_*tti 23

要创建可组合函数,只需将@Composable注释添加到函数名称中,不需要类。

创建一个文件Ticket.kt。放进去就行

@Composable
fun TicketView(){    
  //your code
}
Run Code Online (Sandbox Code Playgroud)

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

  • 说得对,但我不喜欢亮灯! (2认同)