Это мой контроллер:
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 - это виджет без состояния, я начал печатать ха sh код каждой карты MediaCard, созданной при перелистывании и когда я go вернулся к предыдущему пролистал страницы, он имеет тот же хэш-код. Кстати, внутри MediaCard у меня есть StatefulWidget, потому что я играю видео внутри, и каждый раз, когда я прокручиваю, у меня вызывается метод dispose, что я и хочу сделать, так почему MediaCard сохраняется?
Edit1: Я сделал еще один базовый c тест:
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),
);
и все тот же результат.