【问题标题】:How do I fetch data from next page from youtube playlist in flutter?如何从颤动的 youtube 播放列表中的下一页获取数据?
【发布时间】:2019-06-17 15:46:02
【问题描述】:

我已经尝试使用 pageToken,但问题是当前 50 个元素添加到视频列表中时,后 50 个没有添加。显示前 50 个数据后,当它应该得到下一个 50 时,它显示错误: RangeError(索引):无效值:不在 0..28 范围内,包括:50 如果我得到解决方案,我将非常感激,在此先感谢。

class _PlaylistPageState extends State<PlaylistPage> {
  bool isMore = false;
  Map data = new Map();
  List<dynamic> videos = new List();

getData() async {
    String baseUrl =
        "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${widget.plist}" +
            "&maxResults=50&key=" +
            "AIzaSyCrrzqrXMfI8xpD0a5wdU1xDcc7QTUjLSA";
    String nextPageUrl =
        "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${widget.plist}" +
            "&maxResults=50&pageToken=CDIQAA&key=" +
            "AIzaSyCrrzqrXMfI8xpD0a5wdU1xDcc7QTUjLSA";

    var baseResponse;
    var nextPageResponse;
    if(!isMore){
      baseResponse = await http.get(baseUrl);
    } else {
      nextPageResponse = await http.get(nextPageUrl);
    }


      setState(() {
        if(!isMore){
          videos.add(json.decode(baseResponse.body)["items"]);
        } else {
          videos.add(json.decode(nextPageResponse.body)["items"]);
        }
      });
  }

  fetchTen(){
    for(int i = 0; i < 10; i++){
      getData();
    }
  }

 ScrollController _scrollController = new ScrollController();

  @override
  void initState() {
    super.initState();
    fetchTen();
    _scrollController.addListener(() {
      if (_scrollController.position.pixels ==
          _scrollController.position.maxScrollExtent) {
        if(videos.length == 50){
          setState(() {
            isMore = true;
          });
        }
        //print(videos.length);
        fetchTen();
      }
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return Center(
          child:ListView.builder(
              controller: _scrollController,
              itemCount: videos == null ? 0 : videos.length,
              shrinkWrap: true,
              physics: BouncingScrollPhysics(),
              itemBuilder: (context, index) {
                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Material(
                    elevation: 8.0,
                    borderRadius: BorderRadius.all(Radius.circular(10.0)),
                    child: Column(
                      children: <Widget>[
                        Container(
                          height: 200,
                          width: 300,
                          decoration: new BoxDecoration(
                              image: new DecorationImage(
                                image: new NetworkImage(videos[index][index]["snippet"]
                                ["thumbnails"]["high"]["url"]),
                                fit: BoxFit.cover,),
                              borderRadius: BorderRadius.circular(10)
                          ),
                          padding: EdgeInsets.all(8.0),
                        ),
                        Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: new Center(child: Text(videos[index][index]["snippet"]["title"], textAlign: TextAlign.center,),),
                        ),
                      ],
                    ),
                  ),
                );
              })
    );
  }

我希望播放列表中包含所有视频列表,但我只完美地获得了前 50 个。那么,如何从 youtube 播放列表中获取所有视频?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您可以放置​​一个 while 循环来检查 nextPageToken 是否为空,如果不是,您继续获取它并保存在一个临时列表中。完成后,您可以将其保存在原始列表中。

    while (pageToken != null) {
      final response = await DataFetcher(
          playlistId: playlistId,
          pageToken: pageToken)
          .FetchVideoFromPlaylist();
      final extracted_data = json.decode(response) as Map<String, dynamic>;
      pageToken = extracted_data['nextPageToken'];
      List<dynamic> data = extracted_data['items'];
      data.forEach((item) {
        title = item['snippet']['title'];
        thumbnail_url = item['snippet']['thumbnails']['high']['url'];
        videoid = item['contentDetails']['videoId'];
        print(title);
        videoDet.add(
            new VideoDetails(
                videoId: videoid,
                videoUrl: null,
                video_thumbnail: thumbnail_url,
                video_title: title)
        );
      });
    
      if (id == 1)
        cdVideoData = videoDet;}
    

    在这个 DataFetcher 中是一个用于从 youtube 获取视频的函数。 videodet 是一个临时列表,用于存储视频,直到添加完所有视频

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2017-08-19
      • 2021-04-09
      相关资源
      最近更新 更多