Flutter:视频播放器未初始化

问题描述 投票:0回答:2

我有一个视频预览小部件,它接受字符串 url 或视频文件。如果参数是一个字符串,它会从在线/缓存中下载文件。有了这个想法,我的实现如下:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:hero/helpers/cache_manager/cache_manager.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';

class WaveVideoPreview extends StatefulWidget {
  final File? videoFile;
  final String? videoUrl;

  WaveVideoPreview({this.videoFile, this.videoUrl});

  @override
  _WaveVideoPreviewState createState() => _WaveVideoPreviewState();
}

class _WaveVideoPreviewState extends State<WaveVideoPreview> {
  late VideoPlayerController? _controller;
  late ChewieController _chewieController;

  void initState() {
    super.initState();

    _initAsync();
  }

  void _initAsync() async {
    File? _videoFile = widget.videoFile;
    if (_videoFile == null) {
      _videoFile = await getVideo(_videoFile);
    }

    _controller = VideoPlayerController.file(_videoFile!)
      ..initialize().then((_) {
        setState(() {
          _chewieController = ChewieController(
            videoPlayerController: _controller!,
            aspectRatio: _controller!.value.aspectRatio,
            autoPlay: false,
            looping: true,
            allowFullScreen: false,
          );
        });
      });
  }

  Future<File?> getVideo(File? _videoFile) async {
    _videoFile = await MyCache.getVideo(widget.videoUrl!);
    return _videoFile;
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 200.0,
      child: (_controller?.value.isInitialized ?? false)
          ? Chewie(
              controller: _chewieController,
            )
          : SizedBox.shrink(),
    );
  }

  @override
  void dispose() {
    _controller!.dispose();
    _chewieController.dispose();
    super.dispose();
  }
}

static Future<File?> getVideo(String url) async {
    DefaultCacheManager _cacheManager = DefaultCacheManager();
    File? file = await _cacheManager.getSingleFile(url);
    return file;
  }

哪个抛出错误:

════════ Exception caught by widgets library ═══════════════════════════════════
The following LateError was thrown building WaveVideoPreview(dirty, state: _WaveVideoPreviewState#659ef):
LateInitializationError: Field '_controller@1875314998' has not been initialized.

The relevant error-causing widget was
WaveVideoPreview
lib/…/widget/wave_tile.dart:84
When the exception was thrown, this was the stack
#0      _WaveVideoPreviewState._controller (package:hero/screens/home/home_screens/views/waves/widget/video/wave_video_preview.dart)
package:hero/…/video/wave_video_preview.dart:1
#1      _WaveVideoPreviewState.build
package:hero/…/video/wave_video_preview.dart:57

有人知道怎么回事吗?我试过在可空和不可空之间更改视频播放器,但仍然无济于事。正如你所看到的,我有一个空检查,但仍然没有。

flutter dart video video-player
2个回答
0
投票

_initAsync
正在使用异步,它需要一些帧来初始化控制器。

为此使用 FutureBuilder 会更好。或者使它们可以为空,并在使用它时进行空检查。

   VideoPlayerController? _controller;
   ChewieController? _chewieController;

0
投票

请检查您项目的minSdkVersion。 对我来说,因为添加包后,我只是热重新加载应用程序,视频显示失败而没有抛出 minSdkVersion 错误。 一旦我停止应用程序,运行“Flutter Clean”然后再次构建应用程序,它就会抛出错误,要求 minSdkVersion 至少为 24,而你的至少为 21。将其更改为 24 使其对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.