我的ViewModel被重新组成,以更改mutableState值

发布于 2025-01-29 20:05:15 字数 1486 浏览 5 评论 0 原文

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

LoginScreen() is my composable function and i am trying to use a textfield inside it which takes email data from my viewmodel.Everytime my email values changes, LoginScreen function is recomposed and reinitialises my viewModel which results in no change in my textfield.
I am wondering why is this happening and how to fix it.

@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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

可爱咩 2025-02-05 20:05:15

var viewModel = loginscreenviewmodel(navcontroller = navcontroller,localcontext.current)

,因为您不使用 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。

var viewModel=LoginScreenViewModel(navController = navController, LocalContext.current)

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 a ViewModel, you'd need to use a channel and a DisposableEffect/LaunchedEffect to send commands from ViewModel to a NavController.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文