第二十八回:如何给PageView添加指示器

这篇具有很好参考价值的文章主要介绍了第二十八回:如何给PageView添加指示器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


我们在前面章回中介绍了PageView这个Widget,本章回中将介绍 如何给PageView添加指示器.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在这里说的指示器表示PageView底部的小圆圈,它用来指示当前哪个页面被选中。常用的场景是滑动页面时小圆圈高亮显示当前被选中的页面,其它小圆圈显示为暗色,表示其它页面没有被选中。本章回中将详细介绍如何给PageView添加这种小圆圈。

添加方法

  1. 指示器为小圆圈,使用Material的圆形实现,这里不理解不要紧,看代码就能明白;
  2. 创建n个指示器(这里的n是PageView中Page的数量),并且使用Row容器把它们排列中一行;
  3. 使用Column当作外层容器,第一行存放PageView,第二行存放排在一行的小圆圈,它们就是PageView的指示器;

示例代码

//创建小圆圈指示器:代码中的r表示小圆圈的半径,s表示小圆圈之间的间隔,它们的值通过参数传入
  Widget _Indicator(int index, int pageCount, double r, double s) {
    
    //通过pageController中的索引值来判断当前页面是否被选中
    bool isIndexPageSelected = (index ==
        (pageController.page != null ? pageController.page?.round() : 0));

    //通过参数传递的索引值来判断当前页面是否被选中
    // bool isIndexPageSelected = (index == currentIndex) ? true : false;
    //打印索引值,调试使用
    // print("page count ${pageController.page?.round()}");
    // print("current : ${currentIndex}");

    return Container(
      //宽度是圆的半径,宽度是半径+左右两边的间隔(space)
      height: r,
      width: r + 2 * s,
      child: Material(
        color: isIndexPageSelected ? Colors.greenAccent : Colors.grey,
        type: MaterialType.circle,
        child: Container(
          width: r,
          height: r,
        ),
      ),
    );
  }

//把三个小圆圈组成一行
  
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        _Indicator(0, 3, 20, 18),
        _Indicator(1, 3, 20, 18),
        _Indicator(2, 3, 20, 18),
      ],
    );
  }
}
//使用Column当作外层容器,第一行存放PageView,第二行存放排在一行的小圆圈,它们就是PageView的指示器;
return Scaffold(
  appBar: AppBar(
    title: const Text("Example of PaveView"),
    backgroundColor: Colors.purpleAccent,
  ),
  body: Column(
    mainAxisAlignment: MainAxisAlignment.spaceAround,
    children: [
      Container(
        width: double.infinity,
        height: 500,
        child: PageView(), //PageView详细的内容省略不写
      ),
      Indicator(
        pageController: mPageController,
        count: 3,
        currentIndex: pageIndex,
      )
    ],
  ),
);

上面的代码中只列出了核心代码,完整的代码可以查看Github上ex015中的内容。编译并且运行上面的代码可以得到一个显示三个Page的页面,每个Page对应一个小圆圈指示器,滑动Page时小圆圈的颜色跟着变化。我在这里就不演示程序运行结果了,建议大家自己动手去实践。

指示器联动

代码中还有一部分内容大家可能看不明白,一个是pageController,另外一个是小圆圈的颜色设置。它们两结合起来可以让小圆圈与page联动,什么是联动?就是Page滑动到哪一页,与该页对应的小圆圈高亮显示,其它页的小圆圈显示为暗色,这样就可以通过小圆圈来指示出当前被选中的页面,这也是我们叫它指示器的原因。

联动的原理:通过pageController获取当前被选中页的索引值,把该值与参数中传入的索引值index进行比较,如果它们相同说明当前页被选中了,反之则说明当前页没有被选中。对于被选中的指示器,我们把它的颜色设置为高亮色,没有被选中的指示器,我们把它的颜色设置为暗色或者叫浅色。

该原理中核心的内容是获取当前被选中页的索引值,除了使用pageController外还有一种方法:在代码中定义一个变量用来存放被选中页的索引值(代码中为currentIndex变量),然后在PageViewonPageChanged()方法中通过setState()方法修改索引值,最后通过指示器的参数传递给指示器。这部分内容对应的代码被注释起来了,大家可以打开注释后再编译程序,从程序运行效果中可以看到这种方法也可以实现指示器联动效果。

看官们,关于"如何给PageView添加指示器"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!文章来源地址https://www.toymoban.com/news/detail-441977.html

到了这里,关于第二十八回:如何给PageView添加指示器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯31天真题冲刺|题解报告|第二十八天

    大家好,我是snippet,今天是我们刷题的第二十八天,距离我们刷题活动结束也就只有几天了,最近刷题有点迷茫了,下面是我今天的题解 目录 一、路标设置 题目链接:P3853 [TJOI2007]路标设置 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目内容: 解题思路: 代码: 题目链接

    2023年04月08日
    浏览(25)
  • 《微服务实战》 第二十八章 分布式锁框架-Redisson

    第二十八章 分布式锁框架-Redisson 第二十七章 CAS 第二十六章 Java锁的分类 第二十五章 Java多线程安全与锁 第二章 CountDownLatch和Semaphone的应用 第一章 Java线程池技术应用 Redisson 在基于 NIO 的 Netty 框架上,充分的利⽤了 Redis 键值数据库提供的⼀系列优势,在Java 实⽤⼯具包中常

    2024年02月10日
    浏览(38)
  • 从0开始学C++ 第二十八课 数据结构深入 - 栈和队列

    第二十八课:数据结构深入 - 栈和队列 学习目标: 理解栈(Stack)的基本概念和特性。 掌握队列(Queue)的基本概念和特性。 学会在C++中使用栈和队列。 了解栈和队列的典型应用场景。 学习内容: 栈(Stack) 概念:栈是一种后进先出(LIFO, Last In First Out)的数据结构,元素

    2024年01月23日
    浏览(34)
  • UNIX网络编程卷一 学习笔记 第二十八章 原始套接字

    原始套接字提供普通的TCP和UDP套接字不具备的以下3个能力: 1.有了原始套接字,进程可以读写ICMPv4、IGMPv4、ICMPv6等分组。例如,ping程序就使用原始套接字发送ICMP回射请求并接收ICMP回射应答。多播路由守护程序mrouted也使用原始套接字发送和接收IGMPv4分组。 这个能力还使得使

    2024年02月11日
    浏览(33)
  • 学C的第二十八天【字符串函数和内存函数的介绍(一)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十七天【指针的进阶(三)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月16日
    浏览(30)
  • 【送书福利-第二十八期】《AIGC:让生成式AI成为自己的外脑》

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《送书福利》系列专栏,该专栏福利多多

    2024年02月05日
    浏览(39)
  • 【送书福利-第二十八期】《从概念到现实:ChatGPT和Midjourney的设计之旅》

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《送书福利》系列专栏,该专栏福利多多

    2024年02月05日
    浏览(30)
  • JavaScript从入门到精通系列第二十八篇:详解JavaScript中的字符串的方法

      文章目录 前言 一:String中的方法 1:获取字符串的长度 2:返回指定位置的字符 3:返回指定位置的字符Unicode编码 4:返回指定位置的字符Unicode编码  二:比较常用的 1:连接两个字符串 2:检索一个字符串中指定内容  3:从后检索一个字符串中指定内容   4:截取字符串

    2024年02月06日
    浏览(44)
  • 孩子都能学会的FPGA:第二十八课——用FPGA实现最近最少使用(LRU)算法

    (原创声明:该文是 作者的原创 ,面向对象是 FPGA入门者 ,后续会有进阶的高级教程。宗旨是 让每个想做FPGA的人轻松入门 , 作者不光让大家知其然,还要让大家知其所以然 !每个工程作者都搭建了全自动化的仿真环境,只需要双击 top_tb.bat 文件就可以完成整个的仿真(前

    2024年02月19日
    浏览(34)
  • 一起Talk Android吧(第五百三十八回:RxJava中的线程切换)

    各位看官们大家好,上一回中咱们说的例子是\\\"RxJava中的多线程操作\\\",本章回中介绍的例子是\\\"R xJava中的线程切换 \\\"。闲话休提,言归正转,让我们一起Talk Android吧! 我们在上一章回中介绍了如何创建多线程,本章回将介绍如何进行线程切换。线程切换是指在主线程和子线程之

    2023年04月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包