提问人:Iets Iets 提问时间:11/1/2022 最后编辑:Iets Iets 更新时间:11/2/2022 访问量:132
可变值更改后未执行可组合函数
Composable function not being executed after mutable value change
问:
所以我得到了这行代码:
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 的视频显示
答:
0赞
z.g.y
11/1/2022
#1
您正在创建另一个 mutableState(),而不是更新已经计算的当前状态,并且您也没有指定任何 to 来告诉您的可组合对象某些内容已更改State<String>
remember
key
remember
re-calculate
re-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))
},
评论
mediaItem