我有这个代码来获取互联网连接状态:

override fun getStatus() = callbackFlow {
    val callbackFlow = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            trySend(Status.Available)
        }

        override fun onLost(network: Network) {
            trySend(Staus.Lost)
        }

        override fun onUnavailable() {
            trySend(Status.Unavailable)
        }
    }
    manager.registerDefaultNetworkCallback(callbackFlow)
    awaitClose {
        manager.unregisterNetworkCallback(callbackFlow)
    }
}.distinctUntilChanged()

我从ViewModel类调用DIN函数:

fun getStatus() = repo.getStatus()

在活动中,我有:

val status = viewModel.getStatus().collectAsState(
    initial = Status.Unavailable
).value
Text(
    text = "$status"
)

问题是,当我启动应用程序时,当我连接时,在很短的一段时间内,我会得到Unavailable,然后是Available.如何摆脱Unavailable人?

推荐答案

ConnectivityManager需要一些时间来确定当前连接状态,因此callbackFlow不会立即产生值.然而,在您的Composable中,状态对象(由collectAsState检索)立即需要一个值,即使流还没有足够的时间来生成值.这就是您必须为该函数提供initial值的原因.该值将一直被获取,直到流产生它的第一个值.您将该值设置为Staus.Unavailable(它不应该是Status而不是Staus吗?),因此即使当您的设备已连接时,它也会首先显示为Unavailable,直到可以确定实际的Available连接.

只需将initial的值更改为您想要显示的任何值,直到可以确定连接状态.定义新的状态Unknown或类似的东西以将其与其他状态值区分开来可能是有用的.

Android相关问答推荐

ENV变量在gradle进程中没有更新

如何处理穿戴构图上的长点击事件?

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

Kotlin为多个控件设置一个侦听器

在c中更新MVVMCross中TextView的Alpha#

如何在 Jetpack Compose LazyColumn 中将项目分组在一起,例如卡片

在 Bash 脚本中使用 XMLLINT 解析 XML 单元测试文件,并将其放入数组中以表示成功和失败

Android kotlin 中闪屏 API 执行完成后如何根据身份验证将用户导航到特定屏幕

如何在jetpack compose中使可组合的屏幕zoom 到不同的手机(屏幕)尺寸?

我如何比较多个时间范围并在 Android Compose 中并排显示它们

用作输入参数的 Lambda 函数导致重组

在移动设备上看到时如何增加 PasswordField 文本?

ImageBitmap 使用 Glide/Coil 到画布

喷气背包组成影子奇怪的行为

复用 RecyclerView 适配器,避免不必要的 API 调用

Kotlin Compose 全局页脚视图

使 Compose LazyColumn 的最后一项填满屏幕的其余部分

react-native-config 在发布版本中不起作用

如何使用 Glide 将图像下载到设备内部存储

在 Android Studio 中保存数据