百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Flutter组件之PageView对比IndexedStack

wptr33 2024-12-05 17:00 26 浏览

#头条创作挑战赛#

简介

Flutter作为跨平台的优秀语言,值得每一位开发者学习,今天给大家带来PageView和IndexedStack在使用中的对比,相信很多开发的同学都遇到过这样的场景,点击应用底部的导航栏切换页面。如此简单的需要相信大家很轻松完成。

在Flutter中,系统给我们提供了BottomNavigationBar用来实现底部导航栏。展示的页面可以使用很多布局控件实现。如:PageView,IndexedStack,Container等。本文主要讲解PageView和IndexedStack在实现上的差异,帮助开发同学选择合适的实现方案。

IndexedStack

IndexedStack 是层叠布局,继承于Stack类。层叠布局意味着布局都是堆叠在一起的。类似Android里面FramLayout。先来看构造函数。

class IndexedStack extends Stack {
IndexedStack({
  super.key,
  super.alignment, 
  super.textDirection, 
  super.clipBehavior,
  StackFit sizing = StackFit.loose,
  this.index = 0, 
  super.children,
})
......
}

常用参数

  • index: 当前显示view的下标
  • children:子view的集合
  • alignment:对齐方式
  • textDirection:子view的显示方向
  • clipBehavior:设置裁剪方式

IndexedStack默认只显示一个子view。当初始化页面时,IndexedStack内部的所有子View都会被初始化。用户可以根据 index下标来切换需要显示的子view。类似Android原生控件ViewAnimator。对ViewAnimator不熟悉的同学,需要自己查阅一下Android原生控件。

基本使用

IndexedStack{
    index:0,
    children:[Center()]
}

PageView

PageView是一个逐页显示的可滚动的布局控件。类似Android原生的ViewPage。其构造函数如下:

PageView({
    super.key,
    this.scrollDirection = Axis.horizontal,
    this.reverse = false,
    PageController? controller,
    this.physics,
    this.pageSnapping = true,
    this.onPageChanged,
    List<Widget> children = const <Widget>[],
    this.dragStartBehavior = DragStartBehavior.start,
    this.allowImplicitScrolling = false,
    this.restorationId,
    this.clipBehavior = Clip.hardEdge,
    this.scrollBehavior,
    this.padEnds = true,
  })

常用参数

  • scrollDirection:页面滑动方向,Axis.horizontal 水平左右滑动。 Axis.vertical 上下滑动。
  • onPageChanged:滑动回调
  • children:子view集合
  • scrollBehavior:滑动样式
  • pageSnapping: 每次滑动是否强制切换整个页面,如果为false,则会根据实际的滑动距离显示页面

使用PageView加载页面时,默认加载当前页面数据,当页面从第一页切换到第二页,然后返回到第一页时。控制台打印如下:

flutter  :pageIndex 0
flutter: :pageIndex 1
flutter: :pageIndex 0

从打印的信息可以看出,PageView默认是没有页面缓存功能的,这点和Android原生ViewPager不同。

基本使用

Scaffold(
      appBar: AppBar(
        title:  Text(_titleList[currentIndex]),
        actions: const [
          Padding(padding: EdgeInsets.only(right: 10),child: Icon(Icons.search,color: Colors.white,),)
        ],
      ),
      body:PageView(
       controller: _controller,
        children: _pageList,
      ),
   bottomNavigationBar: BottomNavigationBar(items:  _initItems(),
      currentIndex: currentIndex,
      onTap: (index){
      setState(() {
        _controller.jumpToPage(currentIndex);
      });
  }

一般使用PageView只需要controller控制器,和chaildren集合就行。controller是PageController。点击底部的BottomNavigationBar时,调用controller.jumpToPage切换指定下标的页面。

IndexedView对比PageView

  1. IndexedView适用于根据条件显示多个View其中的一个,根据下标Index指定显示的子view,但是对于列表页面则不适用,一般列表页面数据量较大,当加载IndexedView时会同时加载其内部的所有view。
  2. PageView可以实现按需加载,当切换到指定页面时才主动加载数据,同时支持上下,左右页面切换。
  3. 如果PageView需要实现页面缓存,可以在子页面中混入AutomaticKeepAliveClientMixin,实现其wantKeepAlive方法,返回true,可以使其页面再次返回第一页时,页面数据不会重新加载。或者结合KeepLiveWrapper控件使用。

总结

PageView可以实现Android原生ViewPager的功能。配合TabBar或BottomNavigationBar可以实现顶部或底部页面导航。而IndexedStack适合较少页面且数据量不大的页面切换。

通过本篇文章的介绍,希望能给正在学习Flutter的同学一点帮助,如有不对的地方,请指正。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...