我正在使用jetpack Compose和flow,在試圖用LaunchedEffect
@Composable的呼叫只能在@Composable函式的背景關系中發生
。這里我詳細介紹了我的代碼的流程
這里它在LaunchedEffect中產生了錯誤。
螢屏
。
@Composable
fun LoginScreen(
navController: NavController,
viewModel: LoginViewModel = hiltViewModel().
) {
盒子(
modifier = Modifier.fillMaxSize().fillMaxHeight()
) {
列(
modifier = Modifier.fillMaxWidth().padding(15.dp) 。
) {
//TextField 用戶名
//TextField password //TextField password //TextField password
按鈕(
onClick = {
//錯誤
//@Composable呼叫只能從@Composable函式的背景關系發生。
LaunchedEffect(Unit) {
viewModel.login(
viewModel.passwordValue.value, viewModel.usernameValue.value
)
}
},
) {
Text(text = stringResource(id = R.string.login))
}
}
}
}
ViewModel
@HiltViewModel
class LoginViewModel @Inject constructor(private val toLogin: ToLogin)。ViewModel() {
private val _usernameValue = mutableStateOf(""/span>)
val usernameValue: State<String> = _usernameValue
private val _passwordValue = mutableStateOf(""/span>)
val passwordValue: State<String> = _passwordValue
fun setUsernameValue(username: String) {
_usernameValue.value = username
}
fun setPasswordValue(密碼:String) { _passwordValue.value = password.
_passwordValue.value = password
}
suspend fun login(用戶名。String, password: String) {
val r = toLogin(username, password)。
r.collect {
Log.d("XTRACE", it.toString())。
}
}
}
API
class AuthApiSource @Inject constructor(
private val loginApiService: LoginApiService,
) {
suspend fun login(用戶名。String, password: String)。Result<AccessToken?> = runCatching {
loginApiService.toLogin(
username = 用戶名。
password = password,
).body()。
}
}
使用的情況
class ToLogin @Inject constructor(private val apiAuth: 許可證:AuthApiSource) {
operator fun invoke(用戶名。String, password: String)。Flow<Result<AccessToken?>> =
流動 {
val response = runCatching {
val token = apiAuth.login(username, password)
token.getOrThrow()
}
emit(response)
}
}
正確的做法是什么?
uj5u.com熱心網友回復:
你必須使用rememberCoroutineScope:
@Composable
fun LoginScreen(
navController: NavController,
viewModel: LoginViewModel = hiltViewModel().
) {
val scope = rememberCoroutineScope()
箱子(
modifier = Modifier.fillMaxSize().fillMaxHeight()
) {
列(
modifier = Modifier.fillMaxWidth().padding(15.dp) 。
) {
//TextField 用戶名
//TextField password //TextField password //TextField password
按鈕(
onClick = {
//錯誤
//@Composable呼叫只能從@Composable函式的背景關系發生。
scope.launch {
viewModel.login(
viewModel.passwordValue.value, viewModel.usernameValue.value
)
}
},
) {
Text(text = stringResource(id = R.string.login))
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311882.html
標籤:
