Jetpack Compose中Firebase认证失败显示Toast遇上下文问题求解
解决Firebase认证失败时Toast无法显示的LocalContext问题
问题核心在于Firebase的addOnCompleteListener异步回调脱离了Compose的Composition作用域,直接在回调内调用LocalContext.current会因找不到Compose上下文报错。以下是直接有效的解决方法:
- 在Button所在的Composable函数内部、异步回调代码之外提前获取Context并保存,之后在回调里直接使用该变量:
// 在Button代码之前,Composable作用域内获取Context val context = LocalContext.current Button( onClick = { auth.signInWithEmailAndPassword(email, password) .addOnCompleteListener { task -> if (task.isSuccessful) { navController.navigate(Screen.PreferenceScreen.route) } else { Log.w(TAG, "createUserWithEmail:failure", task.exception) Toast.makeText( context, // 使用提前获取的Context "认证失败", Toast.LENGTH_SHORT ).show() } } }, modifier = Modifier .fillMaxWidth() .padding(8.dp), enabled = isPasswordValid && confirmPassword == password, ) { Text(text = "注册") }
原理:LocalContext.current仅能在Composable的Composition作用域中访问,而Firebase异步回调执行时已脱离该作用域,提前保存Context变量即可绕过这个限制。
内容的提问来源于stack exchange,提问作者Dolev Dublon
相关产品推荐
相关产品推荐

