簡體   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