当我更改ViewModel变量时,Composable不会更新视图,我也不知道该做什么.

这是我的主要活动:

class MainActivity : ComponentActivity() {
    companion object  {
        val TAG: String = MainActivity::class.java.simpleName
    }

    private val auth by lazy {
        Firebase.auth
    }

    var isAuthorised: MutableState<Boolean> = mutableStateOf(FirebaseAuth.getInstance().currentUser != null)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val user = FirebaseAuth.getInstance().currentUser

        setContent {
            HeroTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    if (user != null) {
                        Menu(user)
                    } else {
                        AuthTools(auth, isAuthorised)
                    }
                }
            }
        }
    }
}

我有一个视图模型:

class ProfileViewModel: ViewModel() {
    val firestore = FirebaseFirestore.getInstance()
    var profile: Profile? = null
    val user = Firebase.auth.currentUser

    init {
        fetchProfile()
    }

    fun fetchProfile() {
        GlobalScope.async {
            getProfile()
        }
    }

    suspend fun getProfile() {
        user?.let {
            val docRef = firestore.collection("Profiles")
                .document(user.uid)

            return suspendCoroutine { continuation ->
                docRef.get()
                    .addOnSuccessListener { document ->
                        if (document != null) {
                            this.profile = getProfileFromDoc(document)
                        }
                    }
                    .addOnFailureListener { exception ->
                        continuation.resumeWithException(exception)
                    }
            }
        }
    }
}

以及一个基于用户身份验证的可组合视图:

@Composable
fun Menu(user: FirebaseUser) {
    val context = LocalContext.current
    val ProfileVModel = ProfileViewModel()

    Column(
        modifier = Modifier
            .background(color = Color.White)
            .fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center,

        ) {

        Text("Signed in!");


        ProfileVModel.profile?.let {
            Text(it.username);
        }

        Row(
            horizontalArrangement =  Arrangement.Center,
            modifier = Modifier.fillMaxWidth()
        ) {
            TextButton(onClick = {
                FirebaseAuth.getInstance().signOut()
                context.startActivity(Intent(context, MainActivity::class.java))
            }) {
                Text(
                    color = Color.Black,
                    text = "Sign out?",
                    modifier = Modifier.padding(all = 8.dp)
                )
            }
        }
    }
}

当我的Firestore方法返回时,我更新profile var,并"期望"在可组合中更新它,如下所示:

    ProfileVModel.profile?.let {
        Text(it.username);
    }

然而,什么都没有改变?

当我从composable内部添加firebase函数时,我只需要做:

context.startActivity(Intent(context, MainActivity::class.java))

它会更新视图.然而,我不太确定如何从ViewModel内部做到这一点,因为"上下文"是一个可组合的特定特性?

我试图查找实时数据,但每个教程要么太混乱,要么与我的代码不同.我来自SwiftUI MVVM,所以当我更新ViewModel中的某些内容时,任何使用该值的视图都会更新.这里的情况似乎不是这样,我们非常感谢您的帮助.

非常感谢.

推荐答案

视图中的纵断面模型应为状态<*&燃气轮机;

private val _viewState: MutableState<Profile?> = mutableStateOf(null)
val viewState: State<Profile?> = _viewState

在可组合中

ProfileVModel.profile.value?.let {
   Text(it.username);
}

Android相关问答推荐

将动作传递给嵌套的可组合物

格雷德的两个星号是什么意思?非路径

如何在停止和销毁时更改函数中Firebase实时数据库的子项的值我试过了,但这不起作用.请使用Kotlin

如何将我的Android应用程序(Kotlin)中的图像分享给其他应用程序?

Android Jetpack Compose调用view-model函数仅一次

在柯特林连续测量网速

Android-LVL库始终返回NOT_SUBLISTED

当按下通知时,将Android应用程序置于前台

我无法在底部导航栏中正确导航-Android底部导航视图

Android-交叉引用表中的ForeignKey用于什么?

可以';t将数据插入房间数据库

在本地通知中设置自定义声音

如何在这段代码android jetpack compose中实现全屏滚动

如何从 firebase 实时数据库中检索最后一个值

根据另一个数组的值对数组进行排序

Jetpack Compose 惰性列在单个项目更新时重新组合所有项目

根据 Jetpack Compose 中的生命周期正确处理变量/函数

Android 12 通过包管理器中断 APK 安装?

无法使用 Gradle 托管设备对基线配置文件运行测试

如果我在网络请求中指定它们是否与判断网络功能相关