【问题标题】:How to play a List of video carousel?如何播放视频轮播列表?
【发布时间】:2020-12-07 03:37:14
【问题描述】:

我想创建一个视频轮播列表,类似于社交媒体平台。
我尝试使用 flutter_swiper 和 video_player 制作视频轮播。并使用 inview_notifier_list 的自动播放示例创建了一个列表,但无法获得所需的输出。

class VideoList extends StatefulWidget {
  @override
  _VideoListState createState() => _VideoListState();
}

class _VideoListState extends State<VideoList> {
  List<String> videoList = [
    'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
    'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
    'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
    'https://flutter.github.io/assets-for-api-docs/assets/videos/butterfly.mp4',
  ];
  String videoToPlay;
  @override
  void initState() {
    super.initState();
    videoToPlay = videoList[0];
  }

  @override
  Widget build(BuildContext context) {
    return Stack(
      fit: StackFit.expand,
      children: <Widget>[
        InViewNotifierList(
          scrollDirection: Axis.vertical,
          initialInViewIds: ['0'],
          isInViewPortCondition:
              (double deltaTop, double deltaBottom, double viewPortDimension) {
            return deltaTop < (0.5 * viewPortDimension) &&
                deltaBottom > (0.5 * viewPortDimension);
          },
          itemCount: 5,
          builder: (context, index) => Container(
            width: double.infinity,
            height: 300.0,
            alignment: Alignment.center,
            margin: EdgeInsets.symmetric(vertical: 50.0),
            child: SizedBox(
              height: 300,
              width: double.infinity,
              child: Swiper(
                onIndexChanged: (i) {
                  setState(() {
                    videoToPlay = videoList[i];
                  });
                },
                itemCount: videoList.length,
                itemBuilder: (context, index) => LayoutBuilder(
                  builder: (BuildContext context, BoxConstraints constraints) {
                    final InViewState inViewState =
                        InViewNotifierList.of(context);

                    inViewState.addContext(context: context, id: '$index');

                    return AnimatedBuilder(
                      animation: inViewState,
                      builder: (BuildContext context, Widget child) {
                        return VideoWidget(
                            play: inViewState.inView('$index'),
                            url: videoToPlay);
                      },
                    );
                  },
                ),
              ),
            ),
          ),
        ),
        Align(
          alignment: Alignment.center,
          child: Container(
            height: 1.0,
            color: Colors.redAccent,
          ),
        )
      ],
    );
  }
}

下面是我的视频类,视频播放器在其中初始化

class VideoWidget extends StatefulWidget {
  final String url;
  final bool play;

  const VideoWidget({Key key, @required this.url, @required this.play})
      : super(key: key);
  @override
  _VideoWidgetState createState() => _VideoWidgetState();
}

class _VideoWidgetState extends State<VideoWidget> {
  VideoPlayerController _controller;
  Future<void> _initializeVideoPlayerFuture;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(widget.url);
    _initializeVideoPlayerFuture = _controller.initialize().then((_) {
      // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
      setState(() {});
    });

    if (widget.play) {
      _controller.play();
      _controller.setLooping(true);
    }
  }

  @override
  void didUpdateWidget(VideoWidget oldWidget) {
    if (oldWidget.play != widget.play) {
      if (widget.play) {
        _controller.play();
        _controller.setLooping(true);
      } else {
        _controller.pause();
      }
    }
    super.didUpdateWidget(oldWidget);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _initializeVideoPlayerFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return VideoPlayer(_controller);
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    );
  }
}

有人可以帮忙吗,正确的方法应该是什么?

【问题讨论】:

    标签: flutter flutter-dependencies flutter-video-player


    【解决方案1】:

    所以我在这里分享我的解决方案我是如何创建视频 cousrsel 列表的。

    Widget build(BuildContext context) {
        return Stack(
          fit: StackFit.expand,
          children: <Widget>[
            InViewNotifierList(
              scrollDirection: Axis.vertical,
              initialInViewIds: ['0'],
              isInViewPortCondition:
                  (double deltaTop, double deltaBottom, double viewPortDimension) {
                return deltaTop < (0.5 * viewPortDimension) &&
                    deltaBottom > (0.5 * viewPortDimension);
              },
              itemCount: 5,
              builder: (context, index) => Container(
                width: double.infinity,
                height: 300.0,
                alignment: Alignment.center,
                margin: EdgeInsets.symmetric(vertical: 50.0),
                child: LayoutBuilder(
                  builder: (BuildContext context, BoxConstraints constraints) {
                    print('layout called');
                    final InViewState inViewState = InViewNotifierList.of(context);
    
                    inViewState.addContext(context: context, id: '$index');
    
                    return PageView.builder(
                      itemCount: videoList.length,
                      itemBuilder: (context, indexPage) => AnimatedBuilder(
                        animation: inViewState,
                        builder: (BuildContext context, Widget child) {
                          return VideoWidget(
                              play: inViewState.inView('$index'),
                              url: videoList[indexPage]);
                        },
                      ),
                    );
                  },
                ),
              ),
            ),
            Align(
              alignment: Alignment.center,
              child: Container(
                height: 1.0,
                color: Colors.redAccent,
              ),
            )
          ],
        );
      }
    }
    
    
    

    我的视频列表是视频的 URL 列表。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多