android-fragments JetpackCompose Fragment onCreate问题

wfveoks0  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(171)

我需要在SignScreen的onCreate方法中调用一个函数,但是没有任何适用的地方。我不能从任何地方调用currentUserCheck函数。
我尝试的方法:
1.在viewModel的init块中调用它。但问题是它在这里为NavController抛出了nullPointerException
1.在MainActivityMyTheme中调用它,但我在这些范围内遇到了许多奇怪的问题。

视图模型

@HiltViewModel                                                                                     
class SignViewModel (@ApplicationContext context: Context) : ViewModel() {
    val auth = FirebaseAuth.getInstance()

    init {
        currentUserCheck(NavController(context))
    }

    fun signIn(email: String?, password: String?, context: Context, navController: NavController) {

        if (email != null && email.isNotBlank() && password != null && password.isNotBlank()) {
            auth.signInWithEmailAndPassword(email, password).addOnSuccessListener {
                navController.navigate(ScreenHolder.ProfileScreen.route) {
                    popUpTo(ScreenHolder.SigningScreen.route) {
                        inclusive = true
                    }
                }
            }.addOnFailureListener {
                Toast.makeText(context, it.localizedMessage, Toast.LENGTH_LONG).show()
            }
        } else {

            Toast.makeText(
                context,
                "Lütfen email ve şifre alanlarını boş bırakmayınız.",
                Toast.LENGTH_LONG
            ).show()
        }
    }

    fun signUp(email: String?, password: String?, context: Context, navController: NavController) {
        if (email != null && email.isNotBlank() && password != null && password.isNotBlank()) {
            auth.createUserWithEmailAndPassword(email, password)
                .addOnSuccessListener {
                    navController.navigate(ScreenHolder.ProfileScreen.route) {
                        popUpTo(ScreenHolder.ProfileScreen.route) {
                            inclusive = true
                        }
                    }
                }
        } else {
            Toast.makeText(
                context,
                "Lütfen email ve şifre alanlarını boş bırakmayınız.",
                Toast.LENGTH_LONG
            ).show()
        }
    }

    fun currentUserCheck(navController: NavController) {
        if (auth.currentUser != null) {
            navController.navigate(ScreenHolder.ProfileScreen.route) {
                popUpTo(ScreenHolder.ProfileScreen.route) {
                    inclusive = true
                }
            }
        }
    }
}
ki1q1bka

ki1q1bka1#

解决方案

正如@Pztar所说,我在viewModel中将身份验证控制操作声明为一个状态,然后我在我的Composable SignScreen中使用LaunchEffect观察到它,它得到了解决。
第一个

相关问题