可变值更改后未执行可组合函数

Composable function not being executed after mutable value change

提问人:Iets Iets 提问时间:11/1/2022 最后编辑:Iets Iets 更新时间:11/2/2022 访问量:132

问:

所以我得到了这行代码:



fun LiveTrainingScreen(viewModel: LiveTrainingViewModel = viewModel()) {


Column(modifier = Modifier.padding(PaddingStatic.Small).zIndex(2f)) {
    //Large Video Display
    //here
    var videoLink = remember { mutableStateOf(LiveTrainingViewModel.cockPitRight) }

    val exoPlayerCamera1 = viewModel.GetCameraPlayer(videoLink.value)


    DisposableEffect(
        AndroidView(
            modifier = Modifier
                .weight(1f)
                .fillMaxSize()
                .clip(RoundedCornerShape(RoundedSizeStatic.Medium))
                .clickable { videoLink = mutableStateOf(LiveTrainingViewModel.mapCamera) },
            factory = {
                PlayerView(viewModel.context).apply {
                    player = exoPlayerCamera1
                    useController = false
                    resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL

                    FrameLayout.LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.MATCH_PARENT
                    )
                }
            }
        )
    ) {
        onDispose {
            exoPlayerCamera1.release()
        }
    }
}
}

但是当我单击 video 元素时,当我更改 mediaItem Uri 时,代码不会重新执行,因为视频帧一直显示相同的视频。

我不明白我做错了什么。

通过 mutablestate 手动字符串更改,重新执行代码以更改来自 Internet 的视频显示

科特林 android-jetpack-compose 可变 exoplayer2.x

评论

0赞 TheLibrarian 11/1/2022
什么和在哪里.mediaItem
0赞 Iets Iets 11/1/2022
mediaItem 用于从 Internet 获取视频,它是通过 videoLink: String 创建的,我正在传递给 GetCameraPlayer(videoLink.value) 函数
0赞 TheLibrarian 11/1/2022
您能否将该流程的代码添加到问题中?

答:

0赞 z.g.y 11/1/2022 #1

您正在创建另一个 mutableState(),而不是更新已经计算的当前状态,并且您也没有指定任何 to 来告诉您的可组合对象某些内容已更改State<String>rememberkeyrememberre-calculatere-compose

...
.clickable { videoLink = mutableStateOf(LiveTrainingViewModel.mapCamera) }
...

您可以像这样解构 remember 返回的值,然后您可以访问其值和 lambda,您可以调用该 lambda 来传递新值以供可组合对象重新组合。

val (videoLinkValue, setValue) = remember { mutableStateOf(LiveTrainingViewModel.cockPitRight) }

像这样更新它

...
.clickable { setValue (LiveTrainingViewModel.mapCamera) }
...

使用第一个解构组件观察值

val exoPlayerCamera1 = viewModel.GetCameraPlayer(videoLinkValue)

或者你可以简单地这样做

val videoLink by remember { mutableStateOf(LiveTrainingViewModel.cockPitRight) }

然后像这样更新它.onClick

.clickable { videoLink = LiveTrainingViewModel.mapCamera }

评论

0赞 Iets Iets 11/2/2022
我会检查一下,我以为我已经试过了。但是我的模拟器现在不会像往常一样启动哈哈哈哈
0赞 Iets Iets 11/2/2022
可悲的是没有工作,我虽然最佳实践是使用状态功能更改视频,但我现在将以不同的方式尝试。我认为这与 Exoplayer 有关
1赞 Iets Iets 11/2/2022 #2

因此,出于某种原因,exoplayer 在完成状态更新时不会更新。

所以我尝试第二次设置MediaItem,效果很好

.clickable {  exoPlayerCamera1.setMediaItem(MediaItem.fromUri(LiveTrainingViewModel.mapCamera))
},