【问题标题】:How to make Pageview to show the same widget (without losing state), infinitely when scrolling - Flutter如何使 Pageview 在滚动时无限显示相同的小部件(不丢失状态) - Flutter
【发布时间】:2021-08-22 05:40:47
【问题描述】:

我只有一个页面。我想一次又一次地显示同一页面,而不是在下一页上再次重建它,或者在滚动(无限)时不丢失它的状态

这是下面的代码,(每次我移到下一页时,小部件 [0] 都会重新构建。我不希望这样。我想使用上一页中的小部件 [0] 而不是重新构建新页面。]

   Widget widgets = [Page1()];
    PageView.builder(
            controller: PageController(),
            itemBuilder: (BuildContext context, int itemIndex) {
              return widgets[0];
            },
          ),

我尝试过使用AutomaticKeepAliveClientMixin,但当我向后滚动时它会保留上一页的状态,但每次我进入新页面时它都会重建一个新的小部件。我想在新页面中重复使用之前的小部件。

【问题讨论】:

  • 参见medium.com/flutter/… - 他们说:“看到新的 Flutter 开发人员创建对他们知道不会随时间改变的小部件的引用并将它们置于状态以使其不会改变的情况并不少见”不能被摧毁和重建。不要这样做。”
  • @pskink 我也无法理解声明和文章。
  • 基本上不用担心每次跳转到下一页都会调用build()方法
  • @pskink 我在新页面上创建并销毁了小部件。但问题是,当我滑动到另一个页面时,由于在滑动到新页面时创建了繁重的小部件,我的应用程序变得过于卡顿。我已经对要创建的页面进行了优化。但是新页面中的小部件要求太高了。这就是为什么我决定在新页面更改时重用小部件(InAppwebView)并提供指向它的链接。我的应用太卡了。
  • build 方法为什么要花那么长时间?你在那里建造1000个小部件吗?请注意,build 不应包含任何副作用代码 - 它应该只构建并返回一些小部件

标签: flutter dart flutter-pageview


【解决方案1】:

你可以试试 PageView+Children 和 AutomaticKeepAliveClientMixin

【讨论】:

  • 我无法在 pageView 中进行无限滚动。有什么解决办法吗?
  • 如果我使用Children方法,我没有好办法。如果您使用的是 Builder 方法,则可以将 itemCount 设置为更大的值。
【解决方案2】:

你可以使用控制器获取无限页

final INFINTE_PAGE_OFFSET = 9999;

final PageController pageController = PageController(
    initialPage: INFINITE_PAGE_OFFSET,
    keepPage: true,
  );

然后在你的PageView.builder()...

PageView.builder(
  controller: pageController,
  itemBuilder: (context, index) {
    int pageIndex = index - INFINITE_PAGE_OFFSET;
    return Text("Page No. $pageIndex");
  }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2021-06-27
    • 2021-03-22
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多