android - 应用程序返回前台时不显示 PIN 屏幕
问题描述
我正在 Jetpack Compose 中构建一个应用程序,用户可以在其中设置将存储在 sharedPrefs 中的个性化 PIN。每次应用程序回到前台(并且用户已经预先设置了一个 PIN),应用程序应该打开“输入 PIN”屏幕。在应用程序启动时,一切正常,并提示用户输入他们的 PIN,但一旦应用程序进入后台然后返回前台,“输入 PIN”屏幕将不再显示。
主要活动
class MainActivity : ComponentActivity() {
private val openPinScreen = MutableStateFlow(false)
@Inject
lateinit var sharedPrefsRepository: SharedPrefsRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val pinState = openPinScreen.collectAsState()
MyAppTheme {
MyApp(pinState.value)
}
}
}
override fun onResume() {
super.onResume()
sharedPrefsRepository.getPin()?.let {
openPinScreen.value = sharedPrefsRepository.hasSetPin()
}
}
}
fun MyApp(showPin: Boolean) {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = Route.Splash.route) {
composable(Route.Splash.route) {
SplashScreen {
navController.apply {
popBackStack()
navigate(Route.MainContent.route)
}
}
}
composable(Route.MainContent.route) {
MainContent(
modifier = Modifier
.fillMaxSize()
.background(Color.White),
isPinRequired = showPin
)
}
}
}
主要内容.kt
fun MainContent(
modifier: Modifier,
isPinRequired: Boolean,
viewModel: MainViewModel = hiltViewModel()
) {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
val shouldOpenPinScreen by remember {
mutableStateOf(isPinRequired)
}
LaunchedEffect(isPinRequired){
if (shouldOpenPinScreen) navController.navigate(Route.Pincode.route)
}
Scaffold(...){
NavHost(
navController = navController,
startDestination = Route.Home.route
) {
composable(...) {...}
composable(...) {...}
composable(...) {...}
}
}
我在调试过程中检查过 MainActivity 中的一切正常,但是在尝试将值获取到相应的 Composable 时似乎存在问题。具体来说,
LaunchedEffect(isPinRequired){
if (shouldOpenPinScreen) navController.navigate(Route.Pincode.route)
}
不再调用,导航到Route.Pincode.route
也不会触发。替换也没有帮助LaunchedEffect(isPinRequired)
。LaunchedEffect(Unit)
有人对我如何解决这个问题有任何想法吗?
解决方案
问题在于以下几行:
val shouldOpenPinScreen by remember {
mutableStateOf(isPinRequired)
}
shouldOpenPinScreen
修复 的第一个值isPinRequired
并且不使用新值更新。您可以isPinRequired
作为键传递给remember
,在这种情况下,变量将被更新。但我通常看不出拥有这个变量的意义,如果它总是与 相同isPinRequired
,你可以删除它并通过使用来替换它isPinRequired
。
推荐阅读
- python - 如何使用线性回归系数得出二手车的价值?
- mysql - 在错误的页面上抛出异常
- .net - dotnet publish 中的 out 是什么意思?
- graphql - 使用 Hot Chocolate 时忽略输入对象类型中的只读属性
- python - 如何从列表中删除 0.1%?
- c# - 从天网序列化 protobuf 和在 C# 中序列化给出不同的字节
- kotlin - Kotlin:使用不可序列化的对象反序列化映射
- excel - 重新排列用户窗体控件的顺序
- python - yFinance 的 JSON 解码错误 [JSONDecodeError:预期值:第 1 行第 1 列(字符 0)]
- python - Django Rest 注册(第 3 方包)要求签名以验证注册.. 什么签名?