我的ViewModel被重新组成,以更改mutableState值
loginscreen()是我的可组合函数,我正在尝试使用其中的文本字段,该文本字段从我的ViewModel中获取电子邮件数据。每个时间我的电子邮件值都会更改,登录屏幕函数已重新计算并重新引入我的ViewModel,从而导致我的TextField不会更改。 我想知道为什么会发生这种情况以及如何解决。
@Composable
fun LoginScreen(navController: NavHostController
){
var viewModel=LoginScreenViewModel(navController = navController, LocalContext.current)
Column(
modifier = Modifier
.fillMaxSize()
.background(primary)
.verticalScroll(rememberScrollState())
){
TextField(value = viewModel.emailText
, onValueChange = {
viewModel.emailText=it
Log.i("Email text",viewModel.emailText)
},
placeholder = {
Text("Email")
},
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Email
),
modifier = Modifier
.fillMaxWidth()
.padding(top = 10.dp)
)
}
}
class LoginScreenViewModel():ViewModel() {
var emailText by mutableStateOf("a")
var passwordText by mutableStateOf("")
var isVisibilityOn by mutableStateOf(false)
lateinit var mAuth:FirebaseAuth
private lateinit var navController: NavHostController
private lateinit var context: Context
constructor(navController: NavHostController,context:Context) : this() {
this.navController=navController
this.context=context
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
,因为您不使用
val viewModel =记住{viewmodelprovider(localviewModelStore.current.current,object,object object object:viewModelProvider.factory.factory; clazz:class< t>)= loginScreenViewModel(navController)}})。get(loginscreenviewmodel :: class.java)}
以获取对您的ViewModel的引用。尽管您可以用只是调用
= view> = viewModel(factory =/ * factory * factory */)
。然后,您不能直接将
navController
引用到viewModel
,您需要使用频道和可置效果/启动效应来发送命令从ViewModel到NavController。Well, because you are not using
val viewModel = remember { ViewModelProvider(LocalViewModelStore.current, object: ViewModelProvider.Factory { override fun <T: ViewModel> create(clazz: Class<T>) = LoginScreenViewModel(navController) } }).get(LoginScreenViewModel::class.java) }
to get the reference to your ViewModel.Although you can greatly reduce that with just calling
= viewModel(factory = /* factory */)
.Then again, you can't directly pass a
NavController
reference to aViewModel
, you'd need to use a channel and a DisposableEffect/LaunchedEffect to send commands from ViewModel to a NavController.