繁体   English   中英

Kotlin - 如何传递具有类构造函数的函数,该函数具有自己的参数作为可组合的参数?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM