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

Flutter切换TabBarView崩溃:scrollable_positioned_list断言失败问题

解决TabBarView切换时scrollable_positioned_list崩溃问题

问题原因

你遇到的断言失败(package:scrollable_positioned_list/src/scrollable_positioned_list.dart第250行“_scrollableListState == null”不成立),是因为scrollable_positioned_list 0.2.3版本存在生命周期管理缺陷:当TabBarView切换导致页面销毁重建时,列表内部的_scrollableListState引用未被正确清理,重新创建组件时旧状态仍存在,触发了断言检查。

解决方案

1. 升级库版本(优先推荐)

官方在后续版本中修复了这类状态绑定的bug,直接升级到最新稳定版即可解决:

flutter pub upgrade scrollable_positioned_list

2. 为每个Tab的列表设置唯一Key

如果暂时无法升级,给每个Tab内的ScrollablePositionedList分配独立的GlobalKey,确保组件重建时能正确关联新状态、清理旧状态:

class _MyTabPageState extends State<MyTabPage> {
  // 为每个Tab的列表创建唯一Key
  final _tabListKeys = [
    GlobalKey<ScrollablePositionedListState>(),
    GlobalKey<ScrollablePositionedListState>(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(tabs: [Tab(text: "Tab1"), Tab(text: "Tab2")]),
      ),
      body: TabBarView(
        children: [
          ScrollablePositionedList(
            key: _tabListKeys[0],
            itemCount: 100,
            itemBuilder: (ctx, idx) => ListTile(title: Text("Tab1 Item $idx")),
          ),
          ScrollablePositionedList(
            key: _tabListKeys[1],
            itemCount: 100,
            itemBuilder: (ctx, idx) => ListTile(title: Text("Tab2 Item $idx")),
          ),
        ],
      ),
    );
  }
}

3. 自定义组件管理状态(备选)

如果上述方案无效,可以自定义StatefulWidget包裹ScrollablePositionedList,在dispose方法中尝试手动清理状态(此方法需结合库源码细节,不推荐作为首选)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:20:22