这是我的控制者:
PageController _getScenePageController() {
return PageController(
initialPage: 0, keepPage: false,
);
}
在一开始,我使用了PageView.builder,但是我注意到在源代码中,它们将构建功能包装在AutomaticKeepAlive中。 所以我尝试了如下所示的PageView.custom:
return PageView.custom(
scrollDirection: Axis.vertical,
controller: _getScenePageController(),
childrenDelegate: SliverChildBuilderDelegate((context, index) {
return BlocProvider<MediaCardBloc>(
create: (BuildContext context) =>
_getMediaCardBloc(_scenes, index),
child: MediaCard(_scenes[index],
themeColor: _theme.overlayColor, key: ValueKey(index)));
}, childCount: _scenes.length, addAutomaticKeepAlives: false),
);
MediaCard是一个无状态小部件,我开始打印在刷卡时创建的每个MediaCard的哈希码,当我返回以前刷过的页面时,它具有相同的哈希码。 顺便说一句,在MediaCard内部,我有一个StatefulWidget,因为我在内部播放视频,每次滚动时,我都会得到称为dispose的方法,这就是我想发生的事情,所以为什么保存MediaCard?
编辑1: 我做了更基本的测试:
class Test extends StatelessWidget {
@override
Widget build(BuildContext context) {
print("**********Test build hashcode:${this.hashCode}");
return Container(child: Text("${this.hashCode}", style: TextStyle(fontSize: 50),),alignment: Alignment.center,);
}
}
这是PageView:
return PageView.custom(
scrollDirection: Axis.vertical,
controller: _getScenePageController(),
childrenDelegate: SliverChildBuilderDelegate((context, index) {
return Test();
}, childCount: _scenes.length, addAutomaticKeepAlives: false),
);
结果仍然相同。