Youtube_player_flutter: [๋ฒ„๊ทธ] ๋น„๋””์˜ค์˜ ๋ฌดํ•œ ๋กœ๋”ฉ

์— ๋งŒ๋“  2020๋…„ 03์›” 07์ผ  ยท  24์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sarbagyastha/youtube_player_flutter

๋ฒ„๊ทธ ์„ค๋ช…
์•ฑ์— ๊ตฌํ˜„๋œ ๊ธฐ๋ณธ ์˜ˆ์ œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ๋น„๋””์˜ค๊ฐ€ ๋ฌดํ•œํžˆ ๋กœ๋“œ๋˜๊ณ  ๋””๋ฒ„๊ทธ ์ฝ˜์†”์˜ ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€๋Š”
W/System (14804): A resource failed to call release

์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด
initState() ์—์„œ ์ด์™€ ๊ฐ™์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

_controller = YoutubePlayerController(
      initialVideoId: 'iLnmTe5Q2Qw',
      flags: YoutubePlayerFlags(
        forceHideAnnotation: true
      ),
    );

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ„์ ฏ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

YoutubePlayer(
            controller: _controller,
            showVideoProgressIndicator: true,
            progressIndicatorColor: Colors.amber,
            onReady: () {
                print('Player is ready.');
            },
          ),

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
์ž‘๋™ํ•˜๋Š” YouTube ๋™์˜์ƒ์ด ํ‘œ์‹œ๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์žฌ์ƒ์„ ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ์„ธ๋ถ€ ์‚ฌํ•ญ:

  • ์žฅ์น˜: ์—๋ฎฌ๋ ˆ์ดํ„ฐ
  • ์šด์˜ ์ฒด์ œ: ์•ˆ๋“œ๋กœ์ด๋“œ
  • ๋ฒ„์ „ API 28

    • Flutter ๋งˆ์Šคํ„ฐ ์ฑ„๋„(์ตœ์‹  ์—…๋ฐ์ดํŠธ)์ด์ง€๋งŒ ๋ฒ ํƒ€ ์ฑ„๋„์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ

์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ
์ด ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/flutter/flutter/issues/24565
์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„์ ฏ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Scaffold
  |-> SingleChildScrollView
    |-> Column
      |-> YoutubePlayer

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๋””๋ฒ„๊ทธ ์ฝ˜์†” ์™„๋ฃŒ:

D/EGL_emulation(14804): eglMakeCurrent: 0xe7195440: ver 3 1 (tinfo 0xe715fcd0)
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 0 (0) 0 0
D/EGL_emulation(14804): eglCreateContext: 0xd2bf3640: maj 3 min 0 rcv 3
D/EGL_emulation(14804): eglMakeCurrent: 0xd2bf3640: ver 3 0 (tinfo 0xd0257060)
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 2 (2) 0 0
D/eglCodecCommon(14804): setVertexArrayObject: set vao to 1 (1) 0 0
W/System  (14804): A resource failed to call release.
I/flutter (14804): The controller is not ready for method calls.
bug question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Android Pixel 2 XL ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. v6.1.1๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋น„๋””์˜ค๊ฐ€ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

minSdk๋ฒ„์ „ 21

webview_flutter๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

_controller = YoutubePlayerController(
        initialVideoId: videoID,
        flags: YoutubePlayerFlags(
          mute: false,
          enableCaption: false,
          autoPlay: false,
        ),
      );

๋ชจ๋“  24 ๋Œ“๊ธ€

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์ด๋‚˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์˜์ƒ์ด ๊ณ„์† ๋กœ๋“œ ์ค‘์ž…๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์˜ ์‹ค์ œ Android ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Android Emulator(๋””๋ฒ„๊ทธ)๊ฐ€ ์ž‘๋™ํ•˜๊ณ  iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ(๋””๋ฒ„๊ทธ) ๋ฐ Device(๋ฆด๋ฆฌ์Šค)๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์น˜: ์‚ผ์„ฑ ๊ฐค๋Ÿญ์‹œ A6
์•ˆ๋“œ๋กœ์ด๋“œ: 9(ํŒŒ์ด)
ํ”Œ๋Ÿฌํ„ฐ 1.12.13+hotfix.9
youtube_player_flutter: ^6.1.0+7

์ด๊ฒƒ์€ ์ •๋ง๋กœ ์‡ผ ์Šคํ† ํผ์ด๋ฉฐ ๋Œ€์‹  flutter_youtube_view ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

์ข‹์•„, ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์กฐ์‚ฌ ํ›„์— ๋‚ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ”Œ๋Ÿฌํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ Android ๊ถŒํ•œ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์—๋Š” ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค -> ์ธํ„ฐ๋„ท์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ youtube-player๋Š” ์†Œ์Šค ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜์›ํžˆ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. AndroidManifest.xml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<uses-permission android:name="android.permission.INTERNET"/>

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Flutter ์ถœ์‹œ ์•ฑ์ด ์„ค์น˜๋œ ๊ฒฝ์šฐ ๊ธฐ๊ธฐ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

์ข‹์•„, ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์กฐ์‚ฌ ํ›„์— ๋‚ด ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ”Œ๋Ÿฌํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„ Android ๊ถŒํ•œ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์—๋Š” ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค -> ์ธํ„ฐ๋„ท์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ youtube-player๋Š” ์†Œ์Šค ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜์›ํžˆ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. AndroidManifest.xml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<uses-permission android:name="android.permission.INTERNET"/>

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: Flutter ์ถœ์‹œ ์•ฑ์ด ์„ค์น˜๋œ ๊ฒฝ์šฐ ๊ธฐ๊ธฐ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS ๊ธฐ๊ธฐ๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 6.1.0+7 ์‚ฌ์šฉ

์ด ๋ฌดํ•œ ๋กœ๋“œ ์ค‘์— FullScreen์„ ์‹œ๋„ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๋น„๋””์˜ค ID = ์˜ค๋ฅ˜ ์ฝ”๋“œ: 1

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
์˜ˆ์ œ๋Š” ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌดํ•œ ๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” webview_flutter๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค : ^0.3.20+2

๋‚ด pubspec์—์„œ ์ด ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋””์˜ค ID๊ฐ€ ์‹ค์ œ๋กœ ๊ฒŒ์‹œ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. x์ผ ํ›„ ํ”„๋ฆฌ๋ฏธ์–ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ YouTube ํ”Œ๋ ˆ์ด์–ด๋Š” ์ดˆ์—ฐ์„ ์•ž๋‘๊ณ  ์žˆ๋Š” ๋™์˜์ƒ์„ ์žฌ์ƒํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

iOS 9.3.5๊ฐ€ ์„ค์น˜๋œ iPad 3์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ์œ„์˜ ์–ด๋Š ๊ฒƒ๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

v7.0.0์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

v7.0.0์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

7.0.0+3 ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋น„๋””์˜ค ์‹œ์ž‘ ์ „ ๋ฌดํ•œ ๋กœ๋”ฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹Android ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌดํ•œ ๋กœ๋”ฉ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Android Pixel 2 XL ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. v6.1.1๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋น„๋””์˜ค๊ฐ€ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

minSdk๋ฒ„์ „ 21

webview_flutter๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

_controller = YoutubePlayerController(
        initialVideoId: videoID,
        flags: YoutubePlayerFlags(
          mute: false,
          enableCaption: false,
          autoPlay: false,
        ),
      );

Android Pixel 3์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„๋””์˜ค๊ฐ€ ๊ณ„์† ๋กœ๋“œ๋˜๊ณ  iOS์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์—๋ฎฌ๋ ˆ์ดํ„ฐ๋งŒ์˜ ๋ฌธ์ œ์ธ๊ฐ€์š”?? ์‹ค์ œ Android ๊ธฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
๋น„๋””์˜ค๋Š” ์ž˜ ์žฌ์ƒ๋˜์ง€๋งŒ ๋กœ๋”๋Š” ๋น„๋””์˜ค ํ™”๋ฉด์˜ ์™ผ์ชฝ ํ•˜๋‹จ์—์„œ ๊ณ„์† ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

6.1.1 ํŒจํ‚ค์ง€๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ

@JigarKotak7 ํšŒ์‹  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. v6.1.1 ํŒจํ‚ค์ง€๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Define your controller in initState() ์— @Gunlek ์•„์ด๋””์–ด๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

class AboutTopic extends StatefulWidget {
  final String videoLink;

  AboutTopic({this.videoLink});

  <strong i="9">@override</strong>
  _AboutTopicState createState() => _AboutTopicState();
}

class _AboutTopicState extends State<AboutTopic> {
  YoutubePlayerController _controller;

  <strong i="10">@override</strong>
  void initState() {
     _controller = YoutubePlayerController(
      initialVideoId:
          YoutubePlayer.convertUrlToId(widget.videoLink),
      flags: YoutubePlayerFlags(
          mute: false,
          autoPlay: true,
          disableDragSeek: true,
          loop: false,
          enableCaption: false),
    );

    super.initState();
  }

  <strong i="11">@override</strong>
  Widget build(BuildContext context) {
    return Scaffold(
       appBar: AppBar(
        title: Text('About'),
        centerTitle: true,
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.of(context).pop();
          },
        )
      ),

      body: YoutubePlayer(
        controller: _controller,
        showVideoProgressIndicator: true,
        bottomActions: <Widget>[
          const SizedBox(width: 14.0),
          CurrentPosition(),
          const SizedBox(width: 8.0),
          ProgressBar(isExpanded: true),
          RemainingDuration(),
        ],
        aspectRatio: 4 / 3,
        progressIndicatorColor: Colors.white,
        onReady: () {
          print('Player is ready.');
        },
      ),
    );
  }
}

@Hardikkr ๋‹คํ–‰ ์ž…๋‹ˆ๋‹ค.
์•„๋ž˜ ๋งํฌ์—๋Š” YouTube ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์œ„ํ•ด ๋นŒ๋“œํ•œ ์•ฑ์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์žˆ์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.
https://www.youtube.com/watch?v=O3dy9p4ybes

@Hardikkr ๋‹คํ–‰ ์ž…๋‹ˆ๋‹ค.
์•„๋ž˜ ๋งํฌ์—๋Š” YouTube ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์œ„ํ•ด ๋นŒ๋“œํ•œ ์•ฑ์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์žˆ์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.
https://www.youtube.com/watch?v=O3dy9p4ybes

๋‚˜๋Š” ๋˜ํ•œ ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๋Š” ๋ฐ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œํžˆ ๋กœ๋“œ๋˜๊ณ  ์žˆ๋Š”๋ฐ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ™์€ ๋ฌธ์ œ

๋™์ผํ•œ ๋ฌดํ•œ ๋กœ๋”ฉ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์‹ค์ œ ์žฅ์น˜์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @santhoshisrimanthula
๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ขŒ์ ˆ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค lol.

๊ทธ๋ž˜์„œ. ์ตœ์‹  ๋ฒ„์ „์€ ์ผ๋ถ€ ํœด๋Œ€ํฐ์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋‹ค๋ฅธ ํœด๋Œ€ํฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”

youtube_player_flutter: ^6.1.1 ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

image

๋””๋ฒ„๊ทธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋Œ€ํ•ด์„œ๋งŒ ์ธํ„ฐ๋„ท ๊ถŒํ•œ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ธํ„ฐ๋„ท ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•œ ํ›„ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰