[英]Kotlin - How do I pass a function that has a class constructor with it's own parameter as a parameter of a composable?
我正在使用 Kotlin 开发 Android 应用程序。 该应用程序使用基于片段的导航,但我使用了一些 Jetpack Compose 来构建它的一些元素,而不是使用 RecyclerViews 等。
现在我有一张卡片可组合,它根据一个对象构建自己,另一个卡片可以创建一个带有 LazyColumn 的列表。 该卡有它自己的单独文件,但可组合列表是使用它的片段代码的一部分。 这是因为当单击其中一张卡片时,它会调用一个函数来加载一个片段,该片段列出了卡片所代表的对象的详细信息(在本例中为事件)。
这是我的列表片段中的代码:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_liste_evenement,container,false).apply {
val listeEvens : ArrayList<Événement> = ArrayList<Événement>()
listeEvens.add(évén)
listeEvens.add(évén2)
listeEvens.add(évén3)
val composeView = findViewById<ComposeView>(R.id.listeBlocsEven)
composeView.setContent {
ListeCarteÉvénements(événements = listeEvens)
}
}
}
@Composable
fun ListeCarteÉvénements(événements: List<Événement>) {
LazyColumn {
items(événements) { e ->
CarteÉvénement(événement = e,clickEvent = { loadFragment(details_evenement(e)) })
}
}
}
这是卡片可组合的声明:
@Composable
fun CarteÉvénement(événement: Événement,clickEvent: () -> Unit) {
Column(modifier = Modifier
.clip(RectangleShape)
.padding(all = 8.dp)
.fillMaxWidth()
.height(300.dp)
.background(MaterialTheme.colors.primaryVariant)
.clickable(onClick = clickEvent))
private fun loadFragment(fragment: Fragment) {
val transaction = requireActivity().supportFragmentManager.beginTransaction()
transaction.replace(R.id.fragmentContainerView, fragment)
transaction.addToBackStack(null)
transaction.commit()
}
如您所见,这样做可以让我直接访问事件卡,以便我可以将单击事件作为我的详细信息片段作为属性。
这一切都有效,但我的问题是:如果我想将列表可组合放在与卡片相同的文件中(在片段之外),我将如何传递 loadFragment 函数,该函数接收一个片段,该函数也有它自己的参数(在这种情况下来自点击卡的事件)?
您可以将 lambda 回调传递给ListeCarteÉvénements
并将接收事件作为参数。
override fun onCreateView (...) : View {
...
composeView.setContent {
ListeCarteÉvénements(
événements = listeEvens,
onItemClick = { e -> loadFragment(details_evenement(e)) }
)
}
...
}
@Composable
fun ListeCarteÉvénements(événements: List<Événement>, onItemClick: (Événement) -> Unit {
LazyColumn {
items(événements) { e ->
CarteÉvénement(événement = e,clickEvent = { onItemClick(e) })
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.