我正在使用providervideo_player来管理状态。

VideoProvider具有:

videoPlayerController = VideoPlayerController.network(...);

当用户切换到新视频(同一屏幕)时,我经常更改此设置。如果我直接将新的VideoPlayerController.network(...)分配给videoPlayerController,则旧视频仍会播放,您可以听到声音。解决方法是先videoPlayerController.pause(),然后再分配新的VideoPlayerCOntroller.network

GC是否处置了先前的视频?这有任何性能问题吗?我想摆脱以前的视频和切换到新视频之前使用的资源。切换之前,我无法使用videoPlayerController.dispose(),因为它会导致错误。

最佳答案

当您调用dispose时,VideoPlayer小部件仍在使用您的 Controller 。首先,您需要确保不再使用它(将controller的状态设置为null),然后再调用dispose。

我不确定您是如何通过Provider进行状态管理的,但我将举例说明如何使用常规State进行状态管理。

  VideoPlayerController _controller;

  void _initController(String link) {
    _controller = VideoPlayerController.network(link)
      ..initialize().then((_) {
        setState(() {});
      });
  }

  Future<void> _onControllerChange(String link) async {
    if (_controller == null) {
      // If there was no controller, just create a new one
      _initController(link);
    } else {
      // If there was a controller, we need to dispose of the old one first
      final oldController = _controller;

      // Registering a callback for the end of next frame
      // to dispose of an old controller
      // (which won't be used anymore after calling setState)
      WidgetsBinding.instance.addPostFrameCallback((_) async {
        await oldController.dispose();

        // Initing new controller
        _initController(link);
      });

      // Making sure that controller is not used by setting it to null
      setState(() {
        _controller = null;
      });
    }
  }

07-24 21:30