You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter中YouTube视频无法播放问题解决及非Webview替代方案咨询

解决YoutubePlayerFlutter的PlatformException错误

首先,你遇到的PlatformException错误,根源是youtube_player_flutter依赖的flutter_inappwebview组件在Android端没有正确注册或配置。以下是具体的解决步骤:

1. 修正Android端配置

打开android/app/src/main/AndroidManifest.xml,做以下调整:

  • 确保添加网络权限:
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • <application>标签内添加android:usesCleartextTraffic="true"(部分Webview资源需要非HTTPS访问支持):
    <application
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true">
    
  • 注册InAppWebView的Activity(如果配置中没有的话):
    <activity android:name="com.pichillilorenzo.flutter_inappwebview.InAppWebViewActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    

2. 清理缓存并重新构建项目

运行以下命令确保依赖和配置生效:

flutter clean
flutter pub get
flutter run

3. 修正你的Flutter代码

你的代码存在两个小问题:每次build时重复创建控制器、未释放控制器资源,修正后的代码如下:

import 'package:cooking_genie/src/presentation/core/app_colors.dart';
import 'package:flutter/material.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class YoutubePlayerWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return YoutubePlayerWidgetState();
  }
}

class YoutubePlayerWidgetState extends State<YoutubePlayerWidget> {
  late YoutubePlayerController _controller;

  @override
  void initState() {
    super.initState();
    // 在initState中初始化控制器,避免重复创建
    _controller = YoutubePlayerController(
      initialVideoId: 'zn2GwbPG-tc',
      flags: const YoutubePlayerFlags(
        hideControls: false,
        controlsVisibleAtStart: true,
        autoPlay: false,
        mute: false,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return YoutubePlayer(
      controller: _controller,
      showVideoProgressIndicator: true,
      progressIndicatorColor: AppColors.primaryColor,
    );
  }

  @override
  void dispose() {
    // 释放控制器资源,避免内存泄漏
    _controller.dispose();
    super.dispose();
  }
}

除Webview外的YouTube播放方案

如果想要避开Webview相关的问题,这里有几个更优的选择:

1. 使用youtube_player_iframe

这个包基于YouTube的iframe播放器实现,比youtube_player_flutter更轻量,依赖更少,配置简单,兼容性也更好。示例代码:

import 'package:youtube_player_iframe/youtube_player_iframe.dart';

class YoutubeIframePlayer extends StatelessWidget {
  const YoutubeIframePlayer({super.key});

  @override
  Widget build(BuildContext context) {
    final controller = YoutubePlayerController.fromVideoId(
      videoId: 'zn2GwbPG-tc',
      autoPlay: false,
      params: const YoutubePlayerParams(
        showControls: true,
        showFullscreenButton: true,
        enableJavaScript: true,
      ),
    );

    return YoutubePlayerIFrame(controller: controller);
  }
}

2. 集成原生YouTube Player API

这种方案可以获得最原生的播放体验,但需要编写原生代码并配置API密钥:

  • Android:使用YouTube Android Player API,需要在Google Cloud Console创建API密钥,然后通过Flutter的MethodChannel调用原生播放逻辑
  • iOS:使用YouTube iOS Player Helper,同样需要API密钥,通过MethodChannel实现跨平台调用

3. 注意:不推荐的方案

不要尝试通过video_playerchewie播放YouTube视频的直链——YouTube官方禁止这种方式,存在版权风险,且视频链接极易失效,不适合生产环境使用。

内容的提问来源于stack exchange,提问作者abdulec90

火山引擎 最新活动