【发布时间】:2021-11-24 00:45:51
【问题描述】:
我正在做一个项目,我想从 Api 获取数据并将其显示在 UI 中。顺便说一句,我正在使用 Jetpack Compose。如何在 Main Activity 中调用挂起函数?我想获取列表,然后在LotrAppTheme{} 中调用函数bookListScreen(bookList : BookList)。我该怎么做?
主要活动:
package com.example.lotrapp
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private val bookViewModel: BookViewModel by viewModels()
private lateinit var bookList : BookList
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
LOTRAppTheme {
}
}
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
LOTRAppTheme {
}
}
查看模型:
package com.example.lotrapp
import androidx.lifecycle.ViewModel
import com.example.lotrapp.models.BookList
import com.example.lotrapp.repository.BookRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class BookViewModel @Inject constructor(
private val repository: BookRepository
) : ViewModel() {
suspend fun getBookList() : BookList? {
return repository.getBookList()
}
}
BookListScreen
@Composable
fun bookListScreen(bookList : BookList) {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.Gray)
) {
LazyColumn(
contentPadding = PaddingValues(all = 12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
itemsIndexed(
items = bookList.docs
) {
index, book -> BookItem(book)
}
}
}
}
【问题讨论】:
-
在
Activity中执行业务逻辑是一种不好的做法。您可以在视图模型中调用一个方法,该方法又调用挂起函数 -
嗨。你先是接受了我的回答,然后又推翻了你的决定。让它工作有问题吗?
-
其实是的,当我按照你说的做的时候,列表是空的。 idk 有什么问题,但我们不需要在那里的某个地方添加一个“记住”吗?而且它是一个异步函数,我们如何确保它在可组合函数(bookListScreen)运行之前完成?
标签: kotlin retrofit2 kotlin-coroutines android-jetpack-compose dagger-hilt