android - 如何在 Compose Navigation 中导航 View 模型字段更改?

标签 android kotlin android-jetpack-compose android-viewmodel

在我的应用程序中,我想将信息发送到服务器,在收到成功响应后,我想将信息传递到当前屏幕以导航到另一个屏幕。

流程如下:

我从 UI 调用 viewModel 向服务器发送请求。在 ViewModel 我有一个回调:

@HiltViewModel
class CreateAccountViewModel @Inject constructor(
    private val cs: CS
) : ViewModel() {

    private val _screen = mutableStateOf("")

    val screen: State<String> = _screen

    fun setScreen(screen: Screen) {
        _screen.value = screen.route
    }

    private val signUpCallback = object : SignUpHandler {
        override fun onSuccess(user: User?, signUpResult: SignUpResult?) {
            setScreen(Screen.VerifyAccountScreen)
            Log.i(Constants.TAG, "sign up success")

        }

        override fun onFailure(exception: Exception?) {
            Log.i(Constants.TAG, "sign up failure ")
        }

    }
}

如您所见,我还有 State 负责屏幕,所以当响应成功时,我想更新状态,以便 UI 层(屏幕)知道它应该导航到另一个屏幕。我的问题是:我如何观察 State in

@Composable
fun CreateAccountScreen(
    navController: NavController,
    viewModel: CreateAccountViewModel = hiltViewModel()
) {
}

或者是否有更好的方法来实现这一目标?

最佳答案

我认为您的 View 模型应该对导航路线一无所知。在这种情况下,简单的 verificationNeeded 标志就足够了:

var verificationNeeded by mutableStateOf(false)
    private set

private val signUpCallback = object : SignUpHandler {
    override fun onSuccess(user: User?, signUpResult: SignUpResult?) {
        verificationNeeded = true
        Log.i(Constants.TAG, "sign up success")
    }

    override fun onFailure(exception: Exception?) {
        Log.i(Constants.TAG, "sign up failure ")
    }
}

最佳做法是不要在管理 NavHost 的 View 之外共享 navController,并且只传递偶数处理程序。当您需要测试或预览屏幕时,它可能很有用。

以下是更改此标志时的导航方式:

@Composable
fun CreateAccountScreen(
    onRequestVerification: () -> Unit,
    viewModel: CreateAccountViewModel = hiltViewModel(),
) {
    if (viewModel.verificationNeeded) {
        LaunchedEffect(Unit) {
            onRequestVerification()
        }
    }
}

在您的导航管理 View 中:

val navController = rememberNavController()
NavHost(
    navController = navController,
    startDestination = Screen.CreateAccount
) {
    composable(Screen.CreateAccount) {
        CreateAccountScreen(
            onRequestVerification = {
                navController.navigate(Screen.VerifyAccountScreen)
            }
        )
    }
}

关于android - 如何在 Compose Navigation 中导航 View 模型字段更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70114719/

相关文章:

android - 如何在 Jetpack Compose 中实现 list multiSelect?

Android实际自动缩放宽度/高度参数?

android - android模拟器上未显示开发人员菜单 react native

android - Android:组织代码-Retrofit2样板

spring-boot - Gradle5.2 中的 Gradle kotlin Unresolved reference : dependtest

android - Jetpack compose 更新到 1.0.0-rc01 后无法预览

drop-down-menu - DropDownMenuItem 在 Android jetpack compose 中无法正常工作

android - 构建android报错java版本

java - Java 编译器会优化对最终静态变量的方法调用吗?当它变成 dalvik 代码时会发生什么?

multithreading - 如何限制 kotlin 协程的最大并发性