我有一个页面视图,我想以编程方式滚动页面视图,因此我有两个 Select :

  1. 使用animateToPage
  2. 使用jumpToPage

现在,我需要平滑过渡效果,所以我必须使用First API.但是,我有一个问题:当我从第一页滚动到最后一页时,animateToPage将加载不需要显示的中间页.(JumpToPage没有这个问题,但我需要动画).

如何避免呢?

推荐答案

我们可以通过

  1. 将最后一个页面小工具交换到当前页面的下一个位置
  2. 动画转到下一页
  3. 跳转到真实的最后一页索引
  4. 将交换的索引刷新为其先前的值

在这个例子中,我使用了fixed PageView children count, which is 8.

演示

演示

比较

  1. Combine to 8th page Button

按照CopsOnRoad的建议,此按钮将触发Scroll animation至最后一页(在本例中为第8页).首先,我们 JumpToPage(6),然后是AnimateToPage(7,..).

这种方法有效,but adversely, user will notice sudden change of current page to 7th page.

  1. Flash Jump to 8th page Button

与第一种方法不同,此按钮将避免不必要地显示第七页

语法解释

this is the main function

void flashToEight() async {
  int pageCurrent = pageController.page.round();
  int pageTarget = 7;
  if (pageCurrent == pageTarget){
    return;
  }
  swapChildren(pageCurrent, pageTarget); // Step # 1
  await quickJump(pageCurrent, pageTarget); // Step # 2 and # 3
  WidgetsBinding.instance.addPostFrameCallback(refreshChildren); // Step # 4
}

detailed look

// Step # 1
void swapChildren(int pageCurrent, int pageTarget) {
  List<Widget> newVisiblePageViews = [];
  newVisiblePageViews.addAll(pageViews);

  if (pageTarget > pageCurrent) {
    newVisiblePageViews[pageCurrent + 1] = visiblePageViews[pageTarget];
  } else if (pageTarget < pageCurrent) {
    newVisiblePageViews[pageCurrent - 1] = visiblePageViews[pageTarget];
  }

  setState(() {
    visiblePageViews = newVisiblePageViews;
  });
}

// Step # 2 and # 3
Future quickJump(int pageCurrent, int pageTarget) async {
  int quickJumpTarget;

  if (pageTarget > pageCurrent) {
    quickJumpTarget = pageCurrent + 1;
  } else if (pageTarget < pageCurrent) {
    quickJumpTarget = pageCurrent - 1;
  }
  await pageController.animateToPage(
    quickJumpTarget,
    curve: Curves.easeIn,
    duration: Duration(seconds: 1),
  );
  pageController.jumpToPage(pageTarget);
}

// Step # 4
List<Widget> createPageContents() {
    return <Widget>[
      PageContent(1),
      PageContent(2),
      PageContent(3),
      PageContent(4),
      PageContent(5),
      PageContent(6),
      PageContent(7),
      PageContent(8),
    ];
  }

void refreshChildren(Duration duration) {
  setState(() {
    visiblePageViews = createPageContents();
  });
}

完整工作-示例存储库

您可以查看完整的源代码并在本地构建.Github

Flutter相关问答推荐

flutter:如何将字体大小设置得更大(更大)

Flutter在创建时为提供者调用初始化函数

如何在应用程序启动时解析和加载JSON文件?

Flutter版本3.19.2需要更新版本的Kotlin Gradle插件./android/build.gradle:ext.kotlin_version = latest-version>'

带有可滚动页面(不包括分页区)的Flutter 页面视图

来自FutureProvider的数据只打印两个不同的变量,它们对一个实例只有一次相同的值,为什么?

功能不起作用的Flutter 块复制

如何知道当前屏幕是否处于抖动状态?

Flutter 日期时间格式

在flutter中实现类似3D的可滚动堆叠分页列表

flutter Listview构建器溢出

NotifierProvider 每次更新都会重新构建并且值不更新

无法在 ListView (Flutter) 中限制 Card 的最大宽度

reactive_flutter_BLE - 应用找到设备但无法连接(并读取 BLE 数据)

java.lang.IncompatibleClassChangeError:找到接口 com.google.android.gms.location.SettingsClient,

为什么将 bloc 提供程序放在单独的文件/类中会引发错误?

如何从 Flutter Slider Widget 中移除发光效果?

构建失败 - 无法解析 io.grpc:grpc-core:[1.28.0]. (是的,我已经升级到 mavenCentral())

为什么这个循环只发生一次?Flutter /dart

如何从dart 中的当前日期时间中减go 1 天?