Flutter PageStorage的_StorageEntryIdentifier为空的原因排查
针对你遇到的page_storage.dart中writeState函数里contextIdentifier(即_StorageEntryIdentifier)为空的问题,结合你的代码配置,可能的原因和解决方向如下:
PageStorage与滚动组件的上下文关联问题
你在外层用PageStorage包裹了Scaffold,但要确保SingleChildScrollView处于PageStorage的子上下文树中。如果buildListView函数传入的context是PageStorage外层的上下文,滚动组件无法关联到目标bucket,就会导致标识为空。可以用Builder组件重新生成子上下文,确保滚动组件在PageStorage的子树内:SingleChildScrollView buildListView(Item item) { return Builder( builder: (context) { return SingleChildScrollView( key: PageStorageKey<String>("article-detail-${item.id}"), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: []) ); }, ); }全局PageStorageBucket初始化问题
确认global.pageStorageBucket是已初始化的PageStorageBucket()实例,而非null。如果全局bucket未正确初始化,PageStorage无法完成状态存储的标识绑定。PageStorageKey的唯一性与有效性
确保item.id不为空,拼接后的"article-detail-${item.id}"是全局唯一的标识。重复的PageStorageKey会导致状态存储冲突,甚至无法生成有效标识。另外,避免在组件构建时动态生成可能重复的key。滚动状态写入的时机问题
如果滚动组件尚未完成挂载与PageStorage的绑定就触发了状态写入,也会出现标识为空的情况。可以确保在组件mounted之后再触发相关状态操作,比如在initState中添加延迟,或等待组件构建完成后再处理滚动状态。
内容的提问来源于stack exchange,提问作者Dolphin

