position 값 유지 여부Flutter에서 VideoPlayerController.seekTo()를 사용하여 동영상 재생 위치를 이동시키는 기능을 구현 중입니다. 아래 코드를 기준으로:
IconButton(
color: Colors.white,
onPressed: () {
final currentPosition = videoPlayerController.value.position;
Duration position = Duration();
if (currentPosition.inSeconds > 3) {
position = currentPosition - Duration(seconds: 3);
}
videoPlayerController.seekTo(position);
},
)
position = 1초가 됩니다. position 값이 유지되지 않는 이유는 무엇인가요?position 값은 유지되지 않는다.position 변수가 onPressed 함수의 로컬 변수이기 때문입니다.position = 1초로 설정되더라도, 함수 실행이 종료되면 이 값은 더 이상 유지되지 않습니다.currentPosition): 4초.Duration position = Duration(); // 초기값: 0초
if (currentPosition.inSeconds > 3) {
position = currentPosition - Duration(seconds: 3);
}
videoPlayerController.seekTo(position); // position = 1초4초 > 3이 true이므로:position = 4초 - 3초 = 1초.seekTo(position)이 호출되어 동영상이 1초로 이동합니다.currentPosition): 1초.Duration position = Duration(); // 초기값: 0초
if (currentPosition.inSeconds > 3) {
position = currentPosition - Duration(seconds: 3);
}
videoPlayerController.seekTo(position); // position = 0초1초 > 3이 false이므로:position은 초기값인 0초로 유지됩니다.seekTo(position)이 호출되어 동영상이 0초(처음)으로 이동합니다.position의 초기값이 항상 Duration.zero(0초)로 설정되기 때문에, 조건이 false인 경우 0초로 이동하게 됩니다.position이 로컬 변수라 이전 값이 유지되지 않고, 버튼을 누를 때마다 새로 선언됩니다.position을 클래스 변수로 설정position 값을 유지하려면 로컬 변수 대신 클래스 변수로 선언해야 합니다. 아래는 수정된 코드입니다:
class _VideoPlayerState extends State<_VideoPlayer> {
late final VideoPlayerController videoPlayerController;
Duration currentSeekPosition = Duration.zero; // 클래스 변수로 선언
void initState() {
super.initState();
videoPlayerController = VideoPlayerController.file(File(widget.video.path))
..initialize().then((_) {
setState(() {});
});
}
Widget build(BuildContext context) {
return IconButton(
color: Colors.white,
onPressed: () {
final currentPosition = videoPlayerController.value.position;
if (currentPosition.inSeconds > 3) {
currentSeekPosition = currentPosition - Duration(seconds: 3);
} else {
currentSeekPosition = currentPosition; // 현재 위치 유지
}
videoPlayerController.seekTo(currentSeekPosition);
},
icon: const Icon(Icons.rotate_left),
);
}
}
4초에서 버튼 클릭:
currentSeekPosition = 1초로 업데이트.1초에서 다시 버튼 클릭:
currentSeekPosition = 1초로 유지.position은 로컬 변수이기 때문에 값이 유지되지 않고, 조건을 만족하지 못하면 초기값(0초)으로 돌아갑니다.position을 클래스 변수로 전환하여 값을 지속적으로 유지해야 합니다. 이렇게 하면 동영상이 의도한 대로 동작하게 됩니다! 🎉