gpt4 book ai didi

kotlin - Activity中如何调用suspend函数?

转载 作者:行者123 更新时间:2023-12-05 03:37:08 25 4
gpt4 key购买 nike

我正在做一个项目,我想从 Api 获取数据并将其显示在 UI 中。顺便说一句,我正在使用 Jetpack Compose。如何调用Main Activity中的suspend函数?我想获取列表,然后在 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()
}
}

图书列表屏幕

@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)
}
}


}
}

最佳答案

正如@gtxtreme 所说,业务逻辑不得在 Activity 中,但如果您在 Activity 中做某事需要您在可组合项中启动协程,那么您可以使用以下方法创建协程范围:

val coroutineScope = rememberCoroutineScope()

然后每当您想使用暂停功能时:

coroutineScope.launch {
//do some suspend work
}

或者,如果您希望有一个协程范围来经常根据特定键(例如本地数据库中的搜索查询)运行您的 api,那么请在 compose 中使用所谓的Handlers示例:

LaunchedEffect(key1 = searchQuery){
//do api call
}

闭包之间的代码将在最开始的组合和代码更改时运行。

关于kotlin - Activity中如何调用suspend函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69421636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com