You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Smooth Page Indicator实现页面切换的配置方法

Smooth Page Indicator 关联页面跳转配置方案

SmoothPageIndicator的状态完全和绑定的PageController同步,你只需要将同一个PageController同时绑定到承载页面的PageView组件即可实现指示器和页面切换的联动,以下分两种常用场景给出适配方案:

场景1:引导页在同一个PageView内切换(引导效果推荐方案)

修改后的完整代码如下:

final controller = PageController(viewportFraction: 0.8, keepPage: true);

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        const SizedBox(height: 35.0),
        // 新增Expanded包裹的PageView,承载Page1和Page2
        Expanded(
          child: PageView(
            controller: controller,
            // 这里按你的实际页面组件替换即可
            children: const [
              // 你的原有Page1页面内容
              Page1(),
              // 要跳转的目标Page2页面
              Page2(),
            ],
          ),
        ),
        Container(
          child: SmoothPageIndicator(
            controller: controller, // 和PageView共用同一个controller即可自动同步状态
            count: 2,
            effect: const JumpingDotEffect(
              dotHeight: 16,
              dotWidth: 16,
              jumpScale: .7,
              verticalOffset: 15,
            ),
          ),
        ),
      ]),
    // 如果需要点击按钮触发跳转到下一页,修改onPressed逻辑如下
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        // 获取当前页码,没有到最后一页就切到下一页
        if(controller.page?.round() != 1){
          controller.animateToPage(
            1, 
            duration: const Duration(milliseconds: 300), 
            curve: Curves.easeIn
          );
        }else{
          // 已经在最后一页,执行你原来的扫码逻辑
          _scanQR();
        }
      },
      child: const Icon(Icons.qr_code),
      backgroundColor: Colors.pink,
    ),
  );
}

主要改动说明:

  • 新增PageView组件作为页面载体,和SmoothPageIndicator共用同一个PageController,滑动页面或者调用controller的跳转方法时,指示器会自动同步更新状态
  • 调整了FAB的点击逻辑,未到最后一页时切到下一页,到达最后一页后执行原有扫码逻辑

场景2:滑到最后一页需要跳转到独立路由的Page2

如果你要跳转的Page2是独立的路由页面,不属于PageView的子页面,可以通过监听PageController的页码变化实现跳转:

@override
void initState() {
  super.initState();
  controller.addListener(() {
    // 当滑动到第二页时,跳转到独立路由的Page2
    if(controller.page?.round() == 1){
      Navigator.push(context, MaterialPageRoute(builder: (context)=> const Page2()));
    }
  });
}

@override
void dispose() {
  // 页面销毁时同步销毁controller避免内存泄漏
  controller.dispose();
  super.dispose();
}

内容的提问来源于stack exchange,提问作者MaksIngenr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:54:07