我正在使用Compose LazyColumn和viewModel,通过在我的viewModel中包含以下内容来更新列表项:

    data class ContactsListUiState(
       val contacts: MutableList<Contact>
    )
    @HiltViewModel
    class ContactsViewModel @Inject constructor(savedStateHandle: SavedStateHandle) : ViewModel() {
    private val _contactsListUiState = MutableStateFlow(ContactsListUiState(mutableListOf()))
    val contactsListUiState: StateFlow<ContactsListUiState> = _contactsListUiState.asStateFlow()

    private fun updateContactsList(newContacts: MutableList<Contact>) {
        _contactsListUiState.update{ currentState ->
            currentState.copy(
                contacts = newContacts
            )
        }
    }

这样,我的updateContactsList()函数将更新stateFlow,并且我应该在MainActivity内的可组合函数中收集包含collectAsStateWithLifecycle()的联系人列表

@OptIn(ExperimentalLifecycleComposeApi::class, ExperimentalFoundationApi::class)
    @Composable
    fun ContactsListScreen(
        navController: NavController,
        modifier: Modifier = Modifier
    ) {
        Log.d("ViewModel", "ContactsListScreen recomposed")
        val uiState by contactsViewModel.contactsListUiState.collectAsStateWithLifecycle()
        Box(modifier = modifier) {
            val listState = rememberLazyListState()
            val scope = rememberCoroutineScope()
            Column {
                TextField(
                    value = searchText,
                    singleLine = true,
                    onValueChange = {
                        searchText = it
                        Log.d("MainActivity", "calling filter with $it")
                        contactsViewModel.filterContactsByString(it)
                    },
                    leadingIcon = if (searchText.isNotBlank()) searchLeadingIcon else null,
                    trailingIcon = if (searchText.isBlank()) searchTrailingIcon else null,
                    modifier = Modifier
                        .fillMaxWidth()
                        .background(Color.White)
                )
                LazyColumn(
                    Modifier.fillMaxWidth(),
                    state = listState,
                    contentPadding = PaddingValues(bottom = 80.dp)
                ) {                      
                        items(uiState.contacts) { contact ->
                            ContactListItem(
                                navController,
                                contact = contact,
                                modifier = Modifier.fillMaxWidth()
                            )
                            Divider(thickness = 0.5.dp, color = colorResource(id = R.color.blue))
                    }
                }
                 ...

其中contactsListViewModel是在我使用句柄注入的活动之上声明的:

@AndroidEntryPoint
class MainActivity : ComponentActivity(), LoaderManager.LoaderCallbacks<Cursor> {
    private val contactsViewModel: ContactsViewModel by viewModels()

由于某种原因,uiState.contacts在可组合函数中是空的,但当我将其记录到viewModel函数中时,它确实包含项,因此我的列表保持为空.

对可能出了什么问题有什么建议吗?

谢谢

推荐答案

请使用SnapshotStatelist/(mutableStateListOf())而不是普通列表(mutableList).

private val _contactsListUiState = MutableStateFlow(ContactsListUiState(mutableStateListOf()))

另外,请判断这个post,这个one和这个one

Android相关问答推荐

如何在Android Emulator上从物理设备接收TCP消息

如何解决Android Studio中的in fragment问题

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

Android事件:APP_SCOUT_HANG警告SQLite

如何将两个变量传递给Nav主机,然后将其传递给另一个屏幕?

在Delphi中使用OpenCV for Android在使用JLIST时抛出错误

在androidStudio中,如何使用带有ResolutionStrategy的ResolutionSelector而不是setTargetResolve()?

Jetpack Compose:根据盒子中的最大视图固定宽度和高度

安卓Azure通讯聊天UI库导入?

可组合函数无限地从视图模型获取值

错误:参数的类型必须是用@Entity注释的类或其集合/array. java.lang.String tocd);

Android Jetpack Compose全宽度抽屉优化

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

我怎样才能在多行 TextView 旁边有一个 ImageView 并且不超过父级的限制?

Kotlin 协程、 retrofit 、android

以下代码如何在 Android 上运行

如何使用 Jetpack Compose 在图像上叠加文本

为什么官方文档用大写字母表示val变量?

如何为具有不同屏幕尺寸但相同密度的手机创建响应式布局?

OpenGLES,为什么 glReadPixels() 不能从 FBO 的 Renderbuffer 的 colored颜色 缓冲区中读取数据?