• 主页
  • 在使用Chewie视频包时,在处理了错误之后,我得到了一个已使用过的Flutter

在使用Chewie视频包时,在处理了错误之后,我得到了一个已使用过的Flutter

我正在使用Chewie包来显示视频:https://pub.dev/packages/chewie

一切都运行得很好。但是,当我试图在有人退出视频会话时处理控制器时,我得到了错误。

首先是我使用的代码,它由一个带有向后箭头的扁平按钮控制。我的想法是关闭并处理视频屏幕。

void userExited() async {
  _chewieController.dispose();
  //dispose();
  print('USER EXITED!!');
  Navigator.pop(context);
}

然而,每当我按下按钮时,我就会得到一个:

在释放后使用了ChewieController。

错误消息。我应该指出的是,在我的代码中没有任何其他地方调用dispose()。我的问题是,我需要做些什么来消除这个错误。此外,如何正确地处理chewie视频控制器并无错误地关闭屏幕。

下面是完整的代码:

class VideoScreen extends StatefulWidget {
  final MediaItem mediaItem;

  VideoScreen(this.mediaItem);

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

class _VideoScreenState extends State<VideoScreen> {
  ChewieController _chewieController;
  VideoPlayerController _videoPlayerController;

  void initState() {
    super.initState();
    _videoPlayerController = VideoPlayerController.network(
      widget.mediaItem.itemUrl,
    );
    // Wrapper on top of the videoPlayerController
    _chewieController = ChewieController(
      videoPlayerController: _videoPlayerController,
      //aspectRatio: 16 / 9,
      aspectRatio: _videoPlayerController.value.aspectRatio,
      showControlsOnInitialize: false,
      fullScreenByDefault: false,
      // Prepare the video to be played and display the first frame
      autoInitialize: true,
      looping: false,
      autoPlay: true,
      // Errors can occur for example when trying to play a video
      // from a non-existent URL
      errorBuilder: (context, errorMessage) {
        return Center(
          child: Text(
            errorMessage,
            style: TextStyle(color: Colors.white),
          ),
        );
      },
    );

    _videoPlayerController.addListener(() {
      if (_videoPlayerController.value.position ==
          _videoPlayerController.value.duration) {
        print('video Ended');
        closeScreen();
        Navigator.pop(context);
      }
    });
  }


  void closeScreen() async {
    final _media = Provider.of<Media>(context, listen: false);
    _media.increasePlayCount(widget.mediaItem.id);
    final _auth = Provider.of<Auth>(context, listen: false);
    _media.createMediaHistory(_auth.user.uid, widget.mediaItem.id);
    dispose();
    print('VIDEO FINISHED ... CLOSE!!');
    Navigator.pop(context);
  }

  void userExited() async {
    _chewieController.dispose();
    //dispose();
    print('USER EXITED!!');
    Navigator.pop(context);
  }

  @override
  Widget build(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;
    return Scaffold(
      body: SafeArea(
        child: Stack(
           children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Chewie(
                controller: _chewieController,
              ),
            ),
            Positioned(
              left: screenWidth / 20,
              top: screenWidth / 20,
              child: FloatingActionButton(
                onPressed: () {
                  userExited();
                },
                elevation: 0.0,
                child: Icon(Icons.arrow_back_ios),
//                backgroundColor: Color(0xFF1976D2),
                backgroundColor: Colors.blue,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

如有任何建议,我们将不胜感激。

非常感谢

转载请注明出处:http://www.jxbyjx.net/article/20230518/1701020.html