Development/Flutter

[Flutter] 외부 위젯 가져와서 사용하기(video_player)

가비닷 2024. 4. 26. 21:59

 

 

flutter pub get

1. 해당 위젯을 pub.dev  에서 검색하여 문서를 확인

 

2. 제목 우측에 복사 버튼으로 해당 패키지 명(+버전) 복사

 

 

3. 복사한 패키지이름을 패키지를 관리하는 pubspec.yaml 파일에 추가

  • video_player: ^2.8.6 
dependencies:
    flutter:
        sdk: flutter

    # The following adds the Cupertino Icons font to your application.
    # Use with the CupertinoIcons class for iOS style icons.
    cupertino_icons: ^1.0.6
    video_player: ^2.8.6

  단! flutter의 pubspec.yaml은 들여쓰기가 잘못되는것을 오류로 판단 하므로 들여쓰기에 신경써야 함.

 

  • console로 직접 추가도 가능하지만 가능하면 해당 위젯 페이지로 가서 버전과 상태를 확인하고 추가하는것이 더 추천함.

 

4. 추가한 패키지를 다운로드

  • 콘솔에서 직접 명령 입력
flutter pub get

 

 

5. 특별한 권한이 필요한 경우 권한 추가 필요

  • 인터넷 접근 권한이 필요하므로 INTERNET 권한 라인을 AndroidManifest.xml파일에 추가
  • <project root>/android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET"/>

 

 

6. 해당 패키지를 import 시켜서 코드에 적용한다.

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:video_player/video_player.dart';

class _MyHomePageState extends State<VideoApp> {
  late VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.networkUrl(
        Uri.parse('https://vt.tumblr.com/tumblr_o600t8hzf51qcbnq0_480.mp4'))//샘플 영상 주소
      ..initialize().then((_) {
        // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
        setState(() {});
      });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          children: [
            _controller.value.isInitialized
                ? AspectRatio(
                    aspectRatio: _controller.value.aspectRatio,
                    child: VideoPlayer(_controller))
                : Container(),
            const SizedBox(
              height: 50,
            ),
            Flex(
              mainAxisSize: MainAxisSize.max,
              direction: Axis.horizontal,
              children: [
                IconButton(
                  icon: const Icon(Icons.rotate_left), // const는 Icon에만 적용
                  onPressed: () {
                    seekTo(_controller.value.position -
                        const Duration(milliseconds: 3000));
                  },
                ),
                IconButton(
                  icon: Icon(_controller.value.isPlaying
                      ? Icons.play_arrow
                      : Icons.stop),
                  onPressed: () {
                    setState(() {
                      if (_controller.value.isPlaying) {
                        _controller.pause();
                      } else {
                        _controller.play();
                      }
                    });
                  },
                ),
                IconButton(
                  icon: const Icon(Icons.rotate_right),
                  onPressed: () {
                    seekTo(_controller.value.position +
                        const Duration(milliseconds: 3000));
                  },
                ),
              ],
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            _controller.value.isPlaying
                ? _controller.pause()
                : _controller.play();
          });
        },
      ),
    );
  }