kotlin 如何在适配器和jetpack组合之间进行通信(惰性列)?

qv7cva1a  于 2023-02-16  发布在  Kotlin
关注(0)|答案(1)|浏览(96)

在经典的Android编程中(复合之前),要在recyclerview上显示列表,我需要适配器,如果我想给予任何操作,如可点击元素,其中逻辑将在片段/视图模型中提供,我必须通过参数创建这样的参数,如

(Int) -> Unit

当我创建lazy column的时候,jetpack compose看起来怎么样?它应该看起来一样,只是在Screens/UI中创建参数,然后在fragment/viewmodel中以同样的方式配置逻辑,还是有一些其他的方法?

wfsdck30

wfsdck301#

摆脱recyclerview的臃肿是我最喜欢compose的优点之一,让我们假设你想在屏幕上包含以下列表:

@Composable
private fun TestList(
    myItems: List<String>,
    onClick: (String) -> Unit,
    modifier: Modifier = Modifier,
) {
    LazyColumn(modifier.fillMaxSize()) {
        items(myItems) { item ->
            TestItemView(
                text = item,
                onClick = onClick
            )
        }
    }
}

@Composable
private fun TestItemView(
    text: String,
    onClick: (String) -> Unit,
    modifier: Modifier = Modifier,
) {
    Surface(modifier.fillMaxWidth()) {
        Button(
            onClick = { onClick(text) },
            content = { Text(text) }
        )
    }
}

选项A:将状态保持在可组合状态。

@Composable
private fun TestScreenA() {
    val myItems = remember { mutableStateOf(listOf("A", "B", "C", "D")) }

    TestList(
        myItems = myItems.value,
        onClick = { clickedItem ->
            // for demonstration purposes we remove item on click
            myItems.value = myItems.value.filterNot { it == clickedItem }
        }
    )
}

选项B:将状态保留在视图模型中(和之前一样)

class TestViewModelB: ViewModel() {
    private val _myItems = MutableStateFlow(listOf("A", "B", "C", "D"))
    val myItems = _myItems.asStateFlow()

    fun onItemClicked(clickedItem: String){
         // for demonstration purposes we remove item on click
        _myItems.update { items -> items.filterNot { it == clickedItem } }
    }
}

@Composable
private fun TestScreenB(
    // inject viewModel here using your favorite DI-Framework
    viewModel: TestViewModelB 
) {
    TestList(
        // you might want to use collectAsStateWithLifecycle in the future
        // see https://medium.com/androiddevelopers/consuming-flows-safely-in-jetpack-compose-cde014d0d5a3
        myItems = viewModel.myItems.collectAsState().value,
        onClick = viewModel::onItemClicked
    )
}

这两个选项都是可行的(特别是在使用rememberSavable时)。然而,我建议刚迁移到编写的人使用选项B,因为它更类似于他们所使用的。我个人使用选项A用于简单的状态,选项B用于更复杂的状态(如列表)

相关问题