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

使用PageController的jumpToPage触发expandable_page_view轮播异常

解决expandable_page_view调用jumpToPage时的异常问题

我目前使用expandable_page_view库实现轮播项高度灵活变化的需求,核心Widget代码如下:

ExpandablePageView.builder(
  controller: _pageController,
  onPageChanged: _onShopItemScrolled,
  itemCount: _currentShops.length,
  itemBuilder: ((context, index) {
    final shopItem = ShopItem(
      shop: _currentShops[index],
      origin: _mapController.camera.center,
    );

    return SlideTransition(
      position: _slidingAnimation,
      child: shopItem,
    );
  }),
),

点击地图标记时会调用jumpToPage()方法,但执行后Widget出现异常表现。此前使用carousel_slider库时无此问题,但该库不支持轮播项高度灵活变化,因此切换至expandable_page_view。

标记触发的简化方法代码如下:

void _updateSelectedShopMarker(Map<String, dynamic> shop) async {
  setState(() {
    _previousShopId = shop["id"];
    _currentShopIndex = _currentShops.indexOf(shop);
    if (_currentShopIndex == -1) {
      return;
    }
    if (!_onMarkerShowSelectedShop) {
      _onMarkerShowSelectedShop = true;
    } else {
      if (_pageController != null) {
        _pageController!.jumpToPage(_currentShopIndex);
      }
    }
  });
}

已排除动画因素影响——移除SlideTransition后异常仍存在,求解决思路。


可行解决方向:

  • 规范PageController初始化
    确保_pageController在initState中初始化,避免在build方法内重复创建导致状态不一致:

    @override
    void initState() {
      super.initState();
      _pageController = PageController();
    }
    

    调用jumpToPage前,额外校验_currentShopIndex是否在0到_currentShops.length-1的有效范围内,防止非法索引触发异常。

  • 强制触发高度重计算
    expandable_page_view依赖子项高度动态调整自身尺寸,jumpToPage的瞬时跳转可能跳过高度计算逻辑,可尝试:

    1. 给每个ShopItem添加唯一key,确保Flutter正确识别子项状态:
      final shopItem = ShopItem(
        key: ValueKey(shop["id"]),
        shop: _currentShops[index],
        origin: _mapController.camera.center,
      );
      
    2. 在jumpToPage后通过帧回调触发刷新:
      if (_pageController != null) {
        _pageController!.jumpToPage(_currentShopIndex);
        WidgetsBinding.instance.addPostFrameCallback((_) {
          setState(() {});
        });
      }
      
  • 替换跳转方式测试
    用animateToPage替代jumpToPage,验证是否是瞬时跳转与高度计算的冲突:

    _pageController!.animateToPage(
      _currentShopIndex,
      duration: Duration(milliseconds: 300),
      curve: Curves.easeInOut,
    );
    
  • 检查库版本兼容性
    确认当前expandable_page_view版本是否存在已知bug,尝试升级到最新版本,或查看库的Issue列表,参考其他用户的同类问题解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:32:40