You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Windows应用播放视频报错:UnimplementedError: init()未实现

Flutter Windows桌面应用视频屏保无法播放问题解决

问题描述

在Flutter Windows桌面应用中实现视频屏保功能时,视频无法正常运行,控制台抛出错误:

flutter: Error initializing video: UnimplementedError: init() has not been implemented.

用户代码如下:

import 'dart:async';  // For Timer functionality
import 'dart:io';     // For File access
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoPlayerFromFile(),
    );
  }
}

class VideoPlayerFromFile extends StatefulWidget {
  @override
  _VideoPlayerFromFileState createState() => _VideoPlayerFromFileState();
}

class _VideoPlayerFromFileState extends State<VideoPlayerFromFile> {
  VideoPlayerController? _controller;  // Change to nullable
  bool _isBlackScreen = false;
  Timer? _blackScreenTimer;  // Timer to trigger the black screen every 15 minutes

  @override
  void initState() {
    super.initState();
    _initializeVideoPlayer();
    _startBlackScreenTimer();  // Start the timer for the 15-minute gap
  }

  // Function to initialize the video player
  Future<void> _initializeVideoPlayer() async {
    String filePath = r'C:\videodata\video.mp4';  // Ensure correct path with 'r' to escape backslashes

    // Check if the file exists
    if (await File(filePath).exists()) {
      // Initialize the video player controller with the file path
      _controller = VideoPlayerController.file(File(filePath));

      // Wait for the video to initialize
      await _controller!.initialize().then((_) {
        // Once the video is initialized, update the state to start playing
        setState(() {
          _controller!.play();  // Automatically start the video
        });
      }).catchError((error) {
        print("Error initializing video: $error");
      });
    } else {
      // File does not exist, print error message
      print('File does not exist at path: $filePath');
    }
  }

  // Function to start the 15-minute timer for the black screen
  void _startBlackScreenTimer() {
    _blackScreenTimer = Timer.periodic(Duration(seconds: 15), (timer) {
      _showBlackScreen();
    });
  }

  // Function to show the black screen for 7 seconds
  void _showBlackScreen() {
    setState(() {
      _isBlackScreen = true;
    });

    // Pause the video during the black screen
    _controller?.pause();

    // After 7 seconds, remove the black screen and resume the video
    Future.delayed(Duration(seconds: 7), () {
      setState(() {
        _isBlackScreen = false;
        _controller?.play();
      });
    });
  }

  @override
  void dispose() {
    _controller?.dispose();
    _blackScreenTimer?.cancel();  // Cancel the timer when the widget is disposed
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Play Video with Black Screen Interval'),
      ),
      body: Center(
        // Show the black screen if triggered, otherwise display the video
        child: _isBlackScreen
            ? Container(
          color: Colors.black,  // Black screen
        )
            : _controller != null && _controller!.value.isInitialized
            ? AspectRatio(
                aspectRatio: _controller!.value.aspectRatio,
            child: VideoPlayer(_controller!),
        )
            : Text('Loading video... or File not found'),
      ),
      floatingActionButton: _controller != null && _controller!.value.isInitialized
          ? FloatingActionButton(
              onPressed: () {
                setState(() {
            // Play or pause the video depending on its current state
                    if (_controller!.value.isPlaying) {
                      _controller!.pause();
                    } else {
                      _controller!.play();
                    }
                  });
              },
            child: Icon(
          _controller!.value.isPlaying ? Icons.pause : Icons.play_arrow,
        ),
      )
          : null,  // Hide the button if the controller isn't initialized
    );
  }
}

解决方案

这个错误是由于video_player插件的Windows平台实现未正确配置导致的,按以下步骤修复:

  • 添加Windows平台专属依赖
    在pubspec.yaml中补充video_player_windows依赖,这是Windows平台的具体实现:

    dependencies:
      flutter:
        sdk: flutter
      video_player: ^2.8.0
      video_player_windows: ^1.0.0
    
  • 更新依赖并重建项目
    执行以下命令确保依赖生效:

    flutter pub get
    flutter clean
    flutter build windows
    
  • 验证视频编码兼容性
    确认目标视频文件使用Windows支持的编码格式(如H.264视频编码+AAC音频编码),避免因编码不兼容导致初始化失败。

  • 优化初始化逻辑(可选)
    可以将控制器初始化的链式调用简化,提升代码可读性:

    Future<void> _initializeVideoPlayer() async {
      final filePath = r'C:\videodata\video.mp4';
      if (await File(filePath).exists()) {
        _controller = VideoPlayerController.file(File(filePath));
        try {
          await _controller!.initialize();
          setState(() => _controller!.play());
        } catch (error) {
          print("Error initializing video: $error");
        }
      } else {
        print('File does not exist at path: $filePath');
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:47:35