视频播放器抖动的问题

时间:2020-02-26 15:30:52

标签: flutter dart

我是Flutter的新手,尝试从api加载视频,但是视频播放器无法正常工作。我的_buildFilmsMainPages()小部件中有PageView,每个页面都将从api获取自己的视频。

  1. 加载数据时出现错误:构建FutureBuilder>(脏,状态:_FutureBuilderState>#033d3)时引发了以下NoSuchMethodError: 方法'[]'在null上被调用。 接收者:null 尝试致电:

加载后,此错误消失了。

  1. 当我点按播放(浮动操作按钮)时,我只能看到视频的第一帧,但声音正常。

  2. 当我点击停止按钮(浮动操作按钮)时,视频的第一帧消失了,但声音仍然有效。

      class HomePage extends StatefulWidget {
      HomePage({Key key, this.title}) : super(key: key);
     final String title;
    
     @override
     _ HomePageState createState() => _HomePageState();
    }
    
     class _HomePageState extends State<HomePage> {
    
     VideoPlayerController _controller;
     Future<void> _initializeVideoPlayerFuture;
    bool isVideo = false;
     int filmIndex = 0;
    
     @override
      void initState() {
      super.initState();
     }
    
      @override
      Widget build(BuildContext context) {
      return Scaffold (
       body: SingleChildScrollView(
          child: _buildFilmsMainPages(),
          )            
      );
    }
    
    
       Widget _buildFilmsMainPages() =>
         FutureBuilder( 
            future:getMoviesListByDay(date))),
          builder: (BuildContext context, AsyncSnapshot snapshot) {
    

    没有此代码,我会报错,但播放器无法正常工作 无论如何都正确,并且在加载数据时出现错误

          _controller= VideoPlayerController.network
             (snapshot.data[filmIndex].media!=null? 
              snapshot.data[filmIndex].media.elementAt(1)
              :"https://flutter.github.io/assets-for-api- 
               docs/assets/videos/butterfly.mp4");
             _initializeVideoPlayerFuture =_controller.initialize();
             _controller.setLooping(true);
    
    
    
         if (snapshot.data != null) {
          return
           Column(
           children:<Widget> [
             SizedBox(
              height: 460.0,
               child: PageView.builder(
                 pageSnapping: true,
                 itemCount: snapshot.data.length,
                 onPageChanged: (int index) {
                 setState(() {
                   filmIndex = index;
    

    我想我应该在这里写这段代码

                   _controller = VideoPlayerController.network
                    (snapshot.data[filmIndex].media!=null? 
                    snapshot.data[filmIndex].media.elementAt(1)
                       :"https://flutter.github.io/assets-for-api- 
                     docs/assets/videos/butterfly.mp4");
                   _initializeVideoPlayerFuture = 
                        _controller.initialize();
                   _controller.setLooping(true);
    
    
    
    
                  });
                 },
                 itemBuilder: (context, index) {
                    return Column(
                     children: <Widget>[
                        Container(margin: const 
                        EdgeInsets.symmetric(horizontal: 16.0),
                          child: ClipRRect(
                           borderRadius: BorderRadius.circular(8.0),
                           child: Container(
                            height: 250.0,
                            child: Stack(children: <Widget>[
                             Container(
                              child: GestureDetector(
                                  child: isVideo ?
                                  FutureBuilder(
    
                                future:_initializeVideoPlayerFuture,
                                   builder: (context, snapshot) {
                                    if (snapshot.connectionState ==
                                          ConnectionState.done) {
                                        return AspectRatio(
                                          aspectRatio: 16.0 / 12.0,
                                     child:VideoPlayer(_controller),
                                        );
                                      } else {
                                        return Center(
                                            child: 
                                  CircularProgressIndicator());
                                      }
                                    },
                                  ) :
                                  FadeInImage.assetNetwork(
                                    placeholder: 
                               "assets/placeholder.jpg",
                                    image:
                                    snapshot.data[index].media!=null 
                      ? snapshot.data[index].media.elementAt(0): "",
                                    fit: BoxFit.fill,
    
                          fadeInDuration:Duration(milliseconds: 50),
                                  ),
                                  onTap: () =>
    
                                            )
                                        ),
                                      )
                              )
                              ),
                                Row(children: <Widget>[
                                  Container(
                           margin: const EdgeInsets.only(left: 16.0,
                                    right: 16.0, top: 190.0),
                                      height: 40.0,
                                     width: 40.0,
                                      child: FittedBox(
                                 child: FloatingActionButton(
                                     backgroundColor: Colors.white,
                                     foregroundColor: Colors.black,
                                         onPressed: () {
                                         setState(() {
                                          isVideo = !isVideo;
                                    if (_controller.value.isPlaying) {
                                            _controller.pause();
                                          } else {
                                            _controller.play();
                                          }
                                         });
                                         },
                             child: Icon(_controller.value.isPlaying
                                    ? Icons.pause : LineIcons.play,
                                        size: 30.0,)
                                   ),
                                 )
    
                       );
    

0 个答案:

没有答案