我的应用程序使用句柄,我在我的活动中使用LoadManager
读取联系人,使用ContentResolver
读取联系人,当我完成工作时,我会将光标发送到我的viewModel,以便处理数据并执行一些业务逻辑,为此,我在我的活动之上声明了以下内容:
@AndroidEntryPoint
class MainActivity : ComponentActivity(), LoaderManager.LoaderCallbacks<Cursor> {
private val contactsViewModel: ContactsViewModel by viewModels()
...
这样我就可以在onLoadFinished
内使用它:
override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor?) {
contactsViewModel.updateContactsListFromCursor(cursor, loader.id)
}
在我的viewModel中,我有以下代码,它用要显示的联系人更新列表的UI状态:
data class ContactsListUiState(
val contacts: MutableList<Contact>,
val searchFilter: String)
@HiltViewModel
class ContactsViewModel @Inject constructor() : ViewModel() {
private val _contactsListUiState =
MutableStateFlow(ContactsListUiState(mutableStateListOf(), ""))
val contactsListUiState: StateFlow<ContactsListUiState> = _contactsListUiState.asStateFlow()
private fun updateContactsList(filter: String) {
viewModelScope.launch(Dispatchers.IO) {
...
_contactsListUiState.update { currentState ->
currentState.copy(contacts = list, searchFilter = filter)
}
}
最后,我应该按照官方文档使用句柄显示LazyColumn
和我将viewModel传递给我的可组合函数的联系人:
@Composable
fun ContactsListScreen(
navController: NavController,
modifier: Modifier = Modifier, viewModel: ContactsViewModel = hiltViewModel()
) {
val uiState by viewModel.contactsListUiState.collectAsStateWithLifecycle()
...
但当我访问uiState.contacts
时,它是空的,我的列表没有显示任何内容,我还注意到,我在活动中使用的contactsViewModel
与我从Composable函数内的hiltViewModel()
获得的viewModel实例不同,这可能会导致此问题.
如何在活动和可组合函数之间共享sameViewModel的任何建议假设我必须从获取游标的onLoadFinded函数(该函数不可组合)调用viewModel,因此我必须在活动本身内有一个viewModel引用