Flutter 轮播图封装

Flutter 轮播图封装

PageView组件

支持滚动、懒加载、按需渲染,可以用来实现分页加载、轮播图,可以通过scrollDirection 设置滚动的方向。

效果图

flutter PageView 实现轮播图

实现

dart 复制代码
 @override
  void initState() {
    super.initState();
    // 组件初始化时启动定时器(可选)
    _setTimer();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  List<int> _list = List.generate(10, (index) => index + 1);
  int _currentIndex = 0;
  PageController _pageController = PageController();
  Timer? _timer;

  /// 设置定时器
  void _setTimer() {
    _timer?.cancel();
    _timer = Timer.periodic(Duration(seconds: 3), (timer) {
    // 3s 自动轮播
      _currentIndex += 1;
      if (_currentIndex == _list.length) {
        _currentIndex = 0;
      }
      _jumpPage(_currentIndex);
      setState(() {});
    });
  }

  void _cancelTimer() {
    _timer?.cancel();
  }

  void _jumpPage(int index) {
    // 跳转到指定页面,动画平滑过渡
    _pageController.animateToPage(index,
        duration: const Duration(milliseconds: 300), curve: Curves.linear).then((value) {
        	// 重启定时器
          _setTimer();
        },);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      child: Stack(
        children: [
          PageView(
            onPageChanged: (index) {}, // 也可以在此处设置_curIndex = index, 这样左右滑动也可以跳转,但是指示器动画不好看
            controller: _pageController, // 控制器
            children: List.generate(_list.length, (index) { // 轮播
              return Container(
                alignment: Alignment.center,
                child: Text(
                  "第${index + 1}轮播图",
                  style: const TextStyle(color: Colors.white),
                ),
              );
            }),
          ),
          Positioned(
              bottom: 10,
              left: 0,
              right: 0,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: List.generate(_list.length, (index) {
                  return GestureDetector(
                    onTap: () {
                     // 点击指示器,跳转到对应的页面
                      _cancelTimer(); // 取消定时器, 重置计时时间
                      _jumpPage(index);
                      setState(() {
                        _currentIndex = index;
                      });
                    },
                    child: Container(
                      margin: const EdgeInsets.only(left: 10),
                      height: 20,
                      width: 20,
                      decoration: BoxDecoration(
                          borderRadius:
                              const BorderRadius.all(Radius.circular(20)),
                          color: _currentIndex == index
                              ? Colors.red
                              : Colors.white), // 指示器颜色判读
                    ),
                  );
                }),
              ))
        ],
      ),
    );
};
相关推荐
小 黄 鸡2 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
大龄秃头程序员10 小时前
Flutter 最少代码验证:为什么子 Isolate 调原生,一定要先回到主 Isolate?
flutter
FungLeo10 小时前
成为全栈·Flutter App 篇·分类、标签与搜索:移动端内容发现
flutter·移动开发·标签·搜索·分类管理·成为全栈
m0_7381858212 小时前
Flutter 鸿蒙化实战:the_apple_sign_in 适配 OpenHarmony,Apple 登录
flutter·华为·harmonyos·鸿蒙
m0_7381858212 小时前
Flutter 鸿蒙化实战:umeng_analytics_plugin 适配 OpenHarmony,友盟统计
flutter·华为·harmonyos·鸿蒙
FungLeo13 小时前
成为全栈·Flutter App 篇·列表分页与下拉刷新:去重、失败保留和返回位置
flutter·移动开发·下拉刷新·分页加载·列表优化·成为全栈
大龄秃头程序员15 小时前
【从一道面试题入手】深入理解 Dart 事件循环调度机制
flutter
恋猫de小郭16 小时前
Kotlin 2.5 的 Companion 改造,对 KMP 的重要升级
android·前端·flutter
程序员老刘1 天前
Flutter你看看人家RN
flutter·react native·ai编程
大龄秃头程序员2 天前
【Flutter Bloc 从 0 到 1】用最少代码跑通 Bloc
flutter