PageView запоминает прокрученные страницы, даже если keepPage имеет значение false - PullRequest
0 голосов
/ 29 марта 2020

Это мой контроллер:

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),
);

и все тот же результат.

...