Как вернуть виджет до завершения VideoPlayerController.file().initialize().whenComplete();?

#flutter #dart

#flutter #dart

Вопрос:

В настоящее время я пытаюсь вернуть виджет в FutureBuilder() . Вот как выглядит мой код:

FutureBuilder:

 Widget build(BuildContext context)
{
  return Scaffold(
    appBar: AppBar(
      title: Text('Content'),
    ),
    body: FutureBuilder<String>(
      future: downloadRequest(),
        builder: (BuildContext context, AsyncSnapshot<String> snapshot)
        {
          if(snapshot.hasData)
          {
            if(arguments["file_type"] == "video/mp4")
            {
              _controller = VideoPlayerController.file(new File(snapshot.data));

              _initializeVideoPlayerFuture = _controller.initialize();

              _initializeVideoPlayerFuture.whenComplete(() => buildVideo());
            }
            else
            {
              return Center(
                child:
                  Text("Invalid data type")
                );
            }
          }
          else
          {
            return SizedBox(
              child: CircularProgressIndicator(),
              width: 60,
              height: 60,
            );
          }
        }
    ),
  );
 

buildVideo:

 Future<Column> buildVideo() async
  {
    return Column(
      children: <Widget>[
        AspectRatio(
          aspectRatio: _controller.value.aspectRatio,
          child: VideoPlayer(_controller),
        ),
        FloatingActionButton(
          onPressed: () {
            setState(() {
              if (_controller.value.isPlaying) {
                _controller.pause();
              }
              else {
                _controller.play();
              }
            });
          },
          child: Icon(
            _controller.value.isPlaying ? Icons.pause : Icons
                .play_arrow,
          ),
        ),
      ],
    );
}
 

Проблема в том, что, поскольку этот код выполняется внутри FutureBuilder() , он требует widget возврата. Если я запускаю приведенный выше код, он выдает ошибку.

Как я могу отобразить виджет Spinner, пока я жду _initializeVideoPlayerFuture завершения?

Комментарии:

1. FutureBuilder в официальной документации есть пример кода о том, как его использовать

2. @pskink Ты все же понимаешь, что я пытаюсь сделать? В FutureBuilder документации по классу нет примера при использовании VideoPlayerController.file().initialize().whenComplete();

3. вызовите все ваши асинхронные задачи (downloadRequest, за которым следует _controller.initialize) внутри некоторого async метода и передайте его Future возвращаемое значение вашему FutureBuilder

4. Это гораздо лучшее решение. Спасибо.