[英]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.