Youtube_player_flutter: [рдмрдЧ] рдлрд╝реБрд▓рд╕реНрдХреНрд░реАрди рдирд┐рдпрдВрддреНрд░рдг рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ iOS рдкрд░ рдХреНрд░реИрд╢ рдпрд╛ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдорд╛рд░реНрдЪ 2020  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: sarbagyastha/youtube_player_flutter

рдмрдЧ рд╡рд┐рд╡рд░рдг
рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдбрдХреНрд╢рди рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдорд╣рд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЖрдИрдУрдПрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдлреБрд▓рд╕реНрдХреНрд░реАрди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдРрдк рдХреБрдЫ рдЖрдИрдУрдПрд╕ рдкрд░ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд╕рдВрд╕реНрдХрд░рдг (13 рд╕реЗ рдкрд╣рд▓реЗ) рдпрд╣ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рднреА рдкреНрд░рд┐рдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдЖрдИрдУрдПрд╕ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (13) рдкрд░ рдРрдк рдШреВрдорддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡реАрдбрд┐рдпреЛ рд╣рдХрд▓рд╛рддрд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ iOS рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╣реЛрддреА рд╣реИ, Android рдбрд┐рд╡рд╛рдЗрд╕ рдЗрд╕рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдХреЛрдб
рдореИрдВ рдЬрд┐рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреНрд░реБрдЯрд┐ рд╣реИ (рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)

youtube_player.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class YoutubePlayerContainer extends StatefulWidget {
  const YoutubePlayerContainer(
      {Key key, <strong i="15">@required</strong> this.youtubeController, <strong i="16">@required</strong> this.thumbnail})
      : super(key: key);

  final YoutubePlayerController youtubeController;
  final String thumbnail;

  <strong i="17">@override</strong>
  _YoutubePlayerContainerState createState() => _YoutubePlayerContainerState();
}

class _YoutubePlayerContainerState extends State<YoutubePlayerContainer> {
  bool loading;
  <strong i="18">@override</strong>
  void initState() {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight
    ]);
    loading = true;
    super.initState();
  }

  <strong i="19">@override</strong>
  Widget build(BuildContext context) {
    return Stack(children: [
      Center(
        child: YoutubePlayer(
          bottomActions: <Widget>[
            CurrentPosition(),
            ProgressBar(isExpanded: true),
          ],
          controller: widget.youtubeController,
          showVideoProgressIndicator: true,
          onReady: () async {
            await Future.delayed(Duration(milliseconds: 700));
            setState(() {
              loading = false;
            });
          },
          progressIndicatorColor: Theme.of(context).primaryColor,
        ),
      ),
      if (loading)
        Center(
          child: Container(
            height: 60,
            width: 60,
            child: CircularProgressIndicator(
              strokeWidth: 6,
            ),
          ),
        ),
    ]);
  }

  <strong i="20">@override</strong>
  void dispose() {
    widget.youtubeController.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }
}

рдФрд░ рдпрд╣рд╛рдВ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдкрд┐рдЫрд▓реЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ

YoutubePlayerContainer(
                          thumbnail: thumbnail,
                          youtubeController: YoutubePlayerController(
                              initialVideoId:
                                  YoutubePlayer.convertUrlToId(videoUrl),
                              flags: YoutubePlayerFlags(enableCaption: false)),
                        )

рдЯреЗрдХреНрдирд┐рдХрд▓ рдбрд┐рдЯреЗрд▓:

  • рдбрд┐рд╡рд╛рдЗрд╕: рдЖрдИрдлреЛрди (рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдг)
  • рдУрдПрд╕: рдЖрдИрдУрдПрд╕ 13 рдФрд░ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ рдЕрдпрдорд╛рди-рдХреЛрд░реНрддреЛрдмрд╛ тАЛтАЛрд╣рд╛рдп, рдореИрдВ рднреА рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕рдорд╛рдзрд╛рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рднреА рдХрд╛рдо

@ рдЕрдпрдорд╛рди-рдХреЛрд░реНрддреЛрдмрд╛ тАЛтАЛрд╣рд╛рдп, рдореИрдВ рднреА рдПрдХ рд╣реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕рдорд╛рдзрд╛рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рднреА рдХрд╛рдо

рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ рдерд╛ рдлреБрд▓рд╕реНрдХреНрд░реАрди рдмрдЯрди рдХреЛ рд╣рдЯрд╛рдирд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЛ рдШреВрд░реНрдгрди рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛, рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдпрд╛ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реИред

@srinivasii рдореБрдЭреЗ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ RotatedBox рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдиреАрдЪреЗ рдкреВрд░рд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рд╣реИред

рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class YoutubePlayerContainer extends StatefulWidget {
  const YoutubePlayerContainer({Key key, <strong i="10">@required</strong> this.youtubeController})
      : super(key: key);

  final YoutubePlayerController youtubeController;

  <strong i="11">@override</strong>
  _YoutubePlayerContainerState createState() => _YoutubePlayerContainerState();
}

class _YoutubePlayerContainerState extends State<YoutubePlayerContainer> {
  int _rotation;
  <strong i="12">@override</strong>
  void initState() {
    _rotation = 0;
    super.initState();
  }

  <strong i="13">@override</strong>
  Widget build(BuildContext context) {
    return RotatedBox(
      quarterTurns: _rotation,
      child: Stack(
        children: <Widget>[
          SizedBox.expand(
            child: YoutubePlayer(
              bottomActions: <Widget>[
                IconButton(
                  icon: Icon(
                    _rotation == 0 ? Icons.fullscreen : Icons.fullscreen_exit,
                    color: Colors.white,
                  ),
                  onPressed: () async {
                    widget.youtubeController.pause();
                    if (_rotation == 0) {
                      setState(() {
                        _rotation = 1;
                      });
                    } else {
                      setState(() {
                        _rotation = 0;
                      });
                    }
                  },
                ),
                RemainingDuration(),
                ProgressBar(isExpanded: true),
                CurrentPosition(),
              ],
              controller: widget.youtubeController,
              showVideoProgressIndicator: true,
              progressIndicatorColor: Theme.of(context).primaryColor,
            ),
          ),
          Align(
            alignment: Alignment.topRight,
            child: IconButton(
              icon: Icon(
                Icons.close,
                color: Colors.white,
              ),
              onPressed: () => Navigator.of(context).pop(),
            ),
          ),
        ],
      ),
    );
  }

  <strong i="14">@override</strong>
  void dispose() {
    widget.youtubeController.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }
}

v7.0.0.0 рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jumper900 picture jumper900  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

snoopdoggy322 picture snoopdoggy322  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

PcolBP picture PcolBP  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sc00n picture sc00n  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

megamonster21099 picture megamonster21099  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ