Yar*_*rit 5 android kotlin android-jetpack-compose kotlin-stateflow compose-recomposition
我正在使用 composeLazyColumn和 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
)
}
}
Run Code Online (Sandbox Code Playgroud)
这样我的updateContactsList()函数就会更新 stateFlow,并且我应该在collectAsStateWithLifecycle()可组合函数内部收集联系人列表MainActivity
@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))
}
}
...
Run Code Online (Sandbox Code Playgroud)
wherecontactsListViewModel是在我使用 hilt 注入的活动之上声明的:
@AndroidEntryPoint
class MainActivity : ComponentActivity(), LoaderManager.LoaderCallbacks<Cursor> {
private val contactsViewModel: ContactsViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
由于某种原因uiState.contacts,可组合函数内为空,但当我将其记录在 viewModel 函数内时,它确实包含项目,因此我的列表保持为空。
关于可能出什么问题有什么建议吗?
谢谢
请使用SnapshotStatelist/( mutableStateListOf()) 而不是普通列表 ( mutableList)。
private val _contactsListUiState = MutableStateFlow(ContactsListUiState(mutableStateListOf()))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |