You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用youtube_explode_dart加载下一页视频失败求助

解决方案

首先明确youtube_explode_dart的分页逻辑:

  • 调用search()返回的SearchList对象本身就包含第一页的20条数据
  • nextPage()方法会加载下一页数据,并将数据追加到当前的SearchList中,而非替换原有数据

你的代码问题在于:

  1. 初始获取数据后立刻调用nextPage(),直接用合并后的列表覆盖变量,丢失了增量加载的逻辑
  2. 未区分"首次加载"和"加载更多"场景,每次调用getData()都会重新发起搜索,重置分页状态

修复步骤:

  1. 拆分首次加载与加载更多方法:

    • 首次加载初始化分页状态和数据列表
    • 加载更多仅追加新页数据
  2. 修改后代码实现:

// 类成员变量,保存分页状态和数据列表
SearchList<Video>? data;
List<Video> searchQueryList = [];
bool isLoading = false;

// 首次加载首批数据
Future<void> fetchInitialData() async {
  isLoading = true;
  setState(() {});

  String query = searchQueryController.text.trim().isEmpty
      ? 'trending hindi punjabi english and bhojpuri songs'
      : searchQueryController.text.trim();

  // 获取第一页数据
  data = await yt.search.search(query, filter: SortFilters.relevance);
  // 初始化列表为第一页内容
  searchQueryList = data!.toList();

  isLoading = false;
  setState(() {});
}

// 加载下一批数据
Future<void> loadMore() async {
  if (data == null || !data!.hasNextPage) return; // 无下一页则终止请求

  isLoading = true;
  setState(() {});

  // 加载下一页,数据自动追加到data中
  await data!.nextPage();
  // 提取新增的下一页数据并追加到列表
  searchQueryList.addAll(data!.skip(searchQueryList.length).toList());

  isLoading = false;
  setState(() {});
}
  1. 使用方式:
    • 页面初始化时调用fetchInitialData()获取首批20条视频
    • 用户滚动到页面底部(或点击"加载更多"按钮)时,调用loadMore()加载下一批数据

关键说明:

  • data!.hasNextPage可判断是否存在下一页,避免无效请求
  • data!.skip(searchQueryList.length).toList()用于提取新增数据,防止重复添加原有内容
  • 必须拆分两种加载逻辑,否则每次都会重新搜索并重置分页状态

内容的提问来源于stack exchange,提问作者Neal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:11:01