这是一个视频通话屏幕.它需要令牌和通道名称才能工作,这些名称需要传递给init调用引擎.我将它们存储在一个用作可变状态的数据类中.

屏幕状态数据类

@Keep
data class CallScreenState(
    val callerId: Int? = null,
    val recieverId: Int? = null,
    val chatRoom: ChatRoom.Data? = null,
    val rtcToken: AgoraTokenResponse.TokenData? = null
)

并通过该代码处于视图模型初始化状态:

var callScreenState by mutableStateOf(CallScreenState())

在聊天室和令牌API的成功响应视图模型中,使用该代码更新状态.

callScreenState = callScreenState.copy(
                                chatRoom = chatRoom.data,//from response
                                rtcToken = token.data   //from response
                            )

From here it is expected to recompose the screen with new updated value of chatRoom and rtcToken.

在Composable中

val screenState = remember {
    viewModel.callScreenState
}

此屏幕状态用于将值传递给init引擎

val mEngine = remember {
    initEngine(
        context,
        object : IRtcEngineEventHandler() {
            override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
                Timber.e("hhp-CallScreen onJoinChannelSuccess channel:$channel,uid:$uid,elapsed:$elapsed")
            }

            override fun onUserJoined(uid: Int, elapsed: Int) {
                Timber.e("hhp-CallScreen onUserJoined:$uid")
                val desiredUserList = remoteUserMap.toMutableMap()
                desiredUserList[uid] = null
                remoteUserMap = desiredUserList.toMap() as HashMap<Int, TextureView?>
            }

            override fun onUserOffline(uid: Int, reason: Int) {
                Timber.e("hhp-CallScreen onUserOffline:$uid")
                val desiredUserList = remoteUserMap.toMutableMap()
                desiredUserList.remove(uid)
                remoteUserMap = desiredUserList.toMap() as HashMap<Int, TextureView?>
            }

            override fun onNetworkQuality(uid: Int, txQuality: Int, rxQuality: Int) {
                Timber.e("hhp-CallScreen onNetworkQuality $uid $txQuality $rxQuality")

            }
        },
        screenState.chatRoom?.channelName ?: "",  //Not recomposing when value changes in viewmodel
        viewModel.userRole,
        token = screenState.rtcToken?.token ?: "" //Not recomposing when value changes in viewmodel
    )
}

这是initEngine函数的创建

fun initEngine(
    current: Context,
    eventHandler: IRtcEngineEventHandler,
    channelName: String,
    userRole: String,
    token: String
): RtcEngine =
    RtcEngine.create(current, BuildConfig.AGORA_APPID, eventHandler).apply {
        enableVideo()
        setChannelProfile(1)
        if (userRole == "Broadcaster") {
            setClientRole(1)
        } else {
            setClientRole(0)
        }
        //Expected to be recomposed when screen state value updated with new values
        joinChannel(token, channelName, "", 0)
    }

我一开始就知道,屏幕内部的频道名和令牌状态是空的,也就是在API调用之前.一旦获取令牌和聊天室的API成功,屏幕状态将从viewModel更新,我预计initEngine Fun将再次被调用,因为它应该重新组合.但事实并非如此.我错过了什么吗?如何让它在屏幕内的Channel Name值发生变化时重新组合?

推荐答案

我不能理解您的整个用例,但是您有没有try 为您的remember指定一个key

如何使其在屏幕内的通道名值中重新组合 有变化吗?

你可以try 这两种方法中的任何一种,虽然我不确定它们是否能解决你的问题,但当你提供一个keyremember,并且它发生变化时,它将是re-calculate,假设remember's之前使用的channelName在下一个re-composition上将不同.

这,

val screenState = remember(key1 = channelname) {
    viewModel.callScreenState
}

或者这个

val mEngine = remember(key1 = channelname) { ... }

Android相关问答推荐

Jetpack Compose Scaffold—content不在TopAppBar下面开始'

即使安装了Chrome和YouTube,Android对action_view a YouTube URL的意图也是空的

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

无法在Android Gradle中同步Chaquopy版本

strings.xml中字符串数组中的占位符

Jetpack编写错误(java.lang.NoSuchMethodError:无接口方法startRestartGroup)

在Jetpack Compose中实现自动换行

Kotlin 协程、 retrofit 、android

通过 adb 解压并重新安装后 Android 应用程序崩溃

如何从包装在泛型中的 retrofit 调用中检索密钥?

Material 3 中的 ModalBottomSheet 用于 compose

如何以编程方式通过 whatsapp android 共享图像和文本

未找到 com.android.tools.build:gradle:7.4.0 的匹配变体

在 Jetpack Compose 中包装内容

如何在jetpack compose中通过lamda返回columnScope/RowScope

新安装 Expo Go 的 android 设备上的 sdk 46.0.0 (@snack/sdk.46.0.0) 出错

Kotlin Compose forEach 中的负间距

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

Jetpack Compose Tapjacking:过滤对模糊 UI 的touch

如何从构建的流对象中发出值