Установка пути к видео перед инициализацией видеоконтроллера - PullRequest
1 голос
/ 06 апреля 2020

Итак, я пытаюсь использовать пример флаттера для тестирования видео, но я хочу указать путь к файлу, который сохраняется в постоянном хранилище. Моя проблема в том, что я не могу понять, как это сделать.

Вот мой код: https://dartpad.dev/6930fc8c208c9bd1c00ae34303365e48

Future<String> getVideo() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var videoid = prefs.getString('fileview');
    return videoid;
  }

  @override
  void initState() {
    getVideo();

    _controller = VideoPlayerController.file(File(getVideo()));
    // Initialize the controller and store the Future for later use.
    _initializeVideoPlayerFuture = _controller.initialize();

    // Use the controller to loop the video.
    _controller.setLooping(true);

    super.initState();
  }
  }

Так что я могу ' t установите getVideo () в File, потому что это будущее initstate.

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете написать еще одну асинхронную c функцию для инициализации вашего контроллера и прослушать это будущее для построения вашего пользовательского интерфейса.

Future initPlayer() async {
   var filePath = await getVideo();
   _controller = VideoPlayerController.file(File(filePath));
   _initializeVideoPlayerFuture = _controller.initialize();
   _controller.setLooping(true);
   return _initializeVideoPlayerFuture;
}

Вы должны написать другую функцию для обработки состояния воспроизведения, потому что игрок будет будет нулевым, когда метод сборки будет запущен в первый раз.

bool get isVideoPlaying {
   return _controller?.value?.isPlaying != null && _controller.value.isPlaying;
}

Наконец, измените ваш метод сборки следующим образом:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Butterfly Video'),
    ),
    body: FutureBuilder(
      future: initPlayer(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return AspectRatio(
            aspectRatio: _controller.value.aspectRatio,
            child: VideoPlayer(_controller),
          );
        } else {
          return Center(child: CircularProgressIndicator());
        }
      },
    ),
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        setState(() {
          if (isVideoPlaying) {
            _controller?.pause();
          } else {
            _controller?.play();
          }
        });
      },
      child: Icon(
        isVideoPlaying ? Icons.pause : Icons.play_arrow,
      ),
    ),
  );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...