GallerySaver

샤워실의 바보·2024년 2월 15일
0
post-thumbnail
post-custom-banner
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:gallery_saver/gallery_saver.dart'; // GallerySaver 패키지를 임포트하여 비디오를 갤러리에 저장하는 기능을 사용합니다.
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class VideoPreviewScreen extends StatefulWidget {
  final XFile video;

  const VideoPreviewScreen({
    super.key,
    required this.video,
  });

  
  State<VideoPreviewScreen> createState() => _VideoPreviewScreenState();
}

class _VideoPreviewScreenState extends State<VideoPreviewScreen> {
  late final VideoPlayerController _videoPlayerController;
  bool _savedVideo = false; // 비디오가 갤러리에 저장되었는지 여부를 추적하는 상태 변수를 추가합니다.

  Future<void> _initVideo() async {
    _videoPlayerController = VideoPlayerController.file(
      File(widget.video.path),
    );

    await _videoPlayerController.initialize();
    await _videoPlayerController.setLooping(true);
    await _videoPlayerController.play();

    setState(() {});
  }

  
  void initState() {
    super.initState();
    _initVideo();
  }

  Future<void> _saveToGallery() async { // 비디오를 갤러리에 저장하는 함수를 정의합니다.
    if (_savedVideo) return; // 이미 저장된 경우 함수를 조기에 종료합니다.

    await GallerySaver.saveVideo( // GallerySaver를 사용하여 비디오를 갤러리에 저장합니다.
      widget.video.path,
      albumName: "TikTok Clone!", // 저장될 앨범의 이름을 지정합니다.
    );

    _savedVideo = true; // 비디오 저장 상태를 업데이트합니다.

    setState(() {}); // UI를 업데이트하기 위해 상태를 변경합니다.
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        title: const Text('Preview video'),
        actions: [
          IconButton(
            onPressed: _saveToGallery, // 앱 바의 버튼이 눌리면 _saveToGallery 함수를 호출합니다.
            icon: FaIcon(_savedVideo // 저장된 상태에 따라 아이콘을 변경합니다.
                ? FontAwesomeIcons.check
                : FontAwesomeIcons.download),
          )
        ],
      ),
      body: _videoPlayerController.value.isInitialized
          ? VideoPlayer(_videoPlayerController)
          : null,
    );
  }
}

이 코드 조각은 사용자가 녹화한 비디오를 갤러리에 저장하는 기능을 추가한 VideoPreviewScreen 클래스의 일부입니다. 사용자는 앱 바에 있는 아이콘 버튼을 눌러 비디오를 갤러리에 저장할 수 있습니다. 저장이 완료되면 아이콘이 다운로드 아이콘에서 체크 아이콘으로 변경됩니다.

주요 기능:

  • 사용자가 녹화한 비디오를 디바이스의 갤러리에 저장합니다.
  • 비디오 저장 후 사용자 인터페이스에 반영하여 사용자에게 피드백을 제공합니다.

구현 세부 사항:

  • _saveToGallery 함수: GallerySaver 패키지의 saveVideo 메소드를 사용하여 비디오를 갤러리에 저장합니다. 저장할 비디오의 경로와 앨범 이름을 지정합니다. 비디오가 성공적으로 저장되면 _savedVideo 상태를 true로 설정하여 UI를 업데이트합니다.
  • 앱 바의 액션 버튼: 사용자가 이 버튼을 누르면 _saveToGallery 함수가 호출되어 비디오가 갤러리에 저장됩니다. 버튼의 아이콘은 _savedVideo 상태에 따라 변화합니다. 비디오가 저장되지 않았다면 다운로드 아이콘을, 저장되었다면 체크 아이콘을 표시합니다.

사용된 패키지:

  • gallery_saver: 갤러리에 이미지나 비디오를 저장하기 위한 플러터 패키지입니다. 이 예제에서는 비디오를 갤러리에 저장하는 데 사용됩니다.

주의 사항:

  • _saveToGallery 함수는 비디오가 이미 저장되었는지 확인하기 위해 _savedVideo 상태를 검사합니다. 이미 저장된 경우 함수는 조기에 반환됩니다. 이는 중복 저장을 방지하기 위한 것입니다.
  • setState 메소드 호출은 비디오 저장 상태 변경 후 UI를 즉시 업데이트하기 위해 사용됩니다.

이 기능을 구현함으로써 사용자는 앱 내에서 녹화한 비디오를 쉽게 갤러리에 저장하고 관리할 수 있습니다.

profile
공부하는 개발자
post-custom-banner

0개의 댓글