大佬教程收集整理的这篇文章主要介绍了使用Flutter实现一个走马灯布局的示例代码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
import 'package:Flutter/material.dart'; class IndexPage extends StatefulWidget { @override _IndexPageState createState() => _IndexPageState(); } class _IndexPageState extends State<IndexPage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0.0,BACkgroundColor: Colors.white,),body: column( children: <Widget>[],); } }@H_502_0@然后在部件内申明一个 @H_675_0@_pageIndex 变量用来保存当前显示的页面的 index,在 @H_675_0@initState 生命周期里面初始化一个 @H_675_0@PageController 用来配置 @H_675_0@PageView 部件。 @H_502_0@在 @H_675_0@body 的 @H_675_0@column 里面创建一个 @H_675_0@PageView.builder ,使用一个 @H_675_0@SizedBox 部件指定 @H_675_0@PageView 的高度,将 @H_675_0@controller 设置为 @H_675_0@_pageController ,在 @H_675_0@onPageChanged 事件里将当前显示页面的 @H_675_0@index 值赋值给 @H_675_0@_pageIndex 变量。@H_674_6@
int _pageIndex = 0; PageController _pageController; @override void initState() { super.initState(); _pageController = PageController( initialPage: 0,viewportFraction: 0.8,); } body: column( children: <Widget>[ SizedBox( height: 580.0,child: PageView.builder( itemCount: 3,pageSnapping: true,controller: _pageController,onPageChanged: (int indeX) { setState(() { _pageIndex = index; }); },itemBuilder: (BuildContext ctx,int indeX) { return _buildItem(_pageIndex,indeX); },],@H_502_0@关键点: 设置 @H_675_0@PageController 的 @H_675_0@viewportFraction 参数小于 1,这个值是用来设置每个页面在屏幕上显示的比例,小于 1 的话,就可以在当前页面同时显示其它页面的内容了。
/// The fraction of the viewport that each page should occupy. /// Defaults to 1.0,which means each page fills the viewport in the scrolling direction. final double viewportFraction;@H_502_0@实现 _buildItem@H_674_6@ @H_502_0@接着实现 @H_675_0@_buildItem 方法,这个方法就是返回 @H_675_0@PageView.builder 里每一个页面渲染的内容,第一个参数 @H_675_0@activeIndex 是当前显示在屏幕上页面的 @H_675_0@index ,第二个参数 @H_675_0@index 是每一项自己的 @H_675_0@index 。 @H_502_0@使用一个 @H_675_0@Center 部件让内容居中显示,然后用一个 @H_675_0@AnimatedContainer 添加页面切换时的高度变化的动画效果,切换页面的时候使用了 @H_675_0@setState 方法改变了 @H_675_0@_pageIndex , @H_675_0@Flutter 重新绘制每一项。关键点在于判断当前页面是否为正在显示的页面,是的话它的高度就是 500 不是的话就是 450。@H_674_6@
_buildItem(activeIndex,indeX) { return Center( child: AnimatedContainer( curve: Curves.easeInOut,duration: Duration(milliseconds: 300),height: activeIndex == index ? 500.0 : 450.0,margin: EdgeInsets.symmetric(vertical: 20.0,horizontal: 10.0),decoration: BoxDecoration( color: heroes[index].color,borderRadius: BorderRadius.all(Radius.circular(12.0)),child: Stack(),); }@H_502_0@
child: Stack( fit: StackFit.expand,children: <Widget>[ ClipRRect( borderRadius: BorderRadius.all( Radius.circular(12.0),child: Image.network( heroes[index].image,fit: BoxFit.cover,Align( alignment: Alignment.bottomcatenter,child: Row( children: <Widget>[ Expanded( child: Container( padding: EdgeInsets.all(12.0),decoration: BoxDecoration( color: Colors.black26,borderRadius: BorderRadius.only( bottomRight: Radius.circular(12.0),bottomLeft: Radius.circular(12.0),child: Text( heroes[index].title,textAlign: TextAlign.center,style: TextStyle( fontSize: 20.0,fontWeight: FontWeight.bold,color: Colors.white,) ],@H_502_0@实现指示器@H_674_6@ @H_502_0@然后实现页面的指示器,创建一个 @H_675_0@PageInDicator 部件,需要传入 @H_675_0@PageCount 表示总页数,以及 @H_675_0@currenTindex 表示当前显示的页数索引。把所有指示器放在一个 @H_675_0@Row 部件里,判断当前指示器的 @H_675_0@index 是否为正在显示页面的 @H_675_0@index ,是的话显示较深的颜色。
class PageInDicator extends StatelessWidget { final int PageCount; final int currenTindex; const PageInDicator(this.currenTindex,this.PageCount); Widget _inDicator(bool isActivE) { return Container( width: 6.0,height: 6.0,margin: EdgeInsets.symmetric(horizontal: 3.0),decoration: BoxDecoration( color: isActive ? Color(0xff666a84) : Color(0xffb9bcca),shape: BoxShape.circle,BoxShadow: [ BoxShadow( color: Colors.black12,offset: Offset(0.0,3.0),blurRadius: 3.0,); } List<Widget> _buildInDicators() { List<Widget> inDicators = []; for (int i = 0; i < PageCount; i++) { inDicators.add(i == currenTindex ? _inDicator(true) : _inDicator(false)); } return inDicators; } @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center,children: _buildInDicators(),); } }@H_502_0@添加 @H_675_0@PageInDicator 到 @H_675_0@SizedBox 下面@H_674_6@ @H_502_0@封装 Carousel @H_502_0@最后的最后优化一下代码,把部件封装一下,让它成为一个单独的部件,创建一个 @H_675_0@Carousel 部件,对外暴露 @H_675_0@items 和 @H_675_0@height 两个属性,分别配置数据和高度。@H_674_6@
class Carousel extends StatefulWidget { final List items; final double height; const carousel({ @required this.items,@required this.height,}); @override _CarouselState createState() => _CarouselState(); } class _CarouselState extends State<Carousel> { int _pageIndex = 0; PageController _pageController; Widget _buildItem(activeIndex,indeX) { final items = widget.items; return Center( child: AnimatedContainer( curve: Curves.easeInOut,decoration: BoxDecoration( color: items[index].color,child: Stack( fit: StackFit.expand,children: <Widget>[ ClipRRect( borderRadius: BorderRadius.all( Radius.circular(12.0),child: Image.network( items[index].image,Align( alignment: Alignment.bottomcatenter,child: Row( children: <Widget>[ Expanded( child: Container( padding: EdgeInsets.all(12.0),decoration: BoxDecoration( color: Colors.black26,borderRadius: BorderRadius.only( bottomRight: Radius.circular(12.0),child: Text( items[index].title,style: TextStyle( fontSize: 20.0,) ],); } @override void initState() { super.initState(); _pageController = PageController( initialPage: 0,); } @override Widget build(BuildContext context) { return column( children: <Widget>[ Container( height: widget.height,child: PageView.builder( pageSnapping: true,itemCount: heroes.length,onPageChanged: (int indeX) { setState(() { _pageIndex = index; }); },indeX); },PageInDicator(_pageIndex,widget.items.length),); } }@H_502_0@之后在 @H_675_0@IndexPage 部件里就只用实例化一个 @H_675_0@Carousel 了,同时由于 @H_675_0@IndexPage 不用管理部件状态了,可以将它变成 @H_675_0@StatelessWidget 。 @H_502_0@完整代码@H_674_6@
import 'package:Flutter/material.dart'; class Hero { final Color color; final String image; final String title; Hero({ @required this.color,@required this.image,@required this.title,}); } List heroes = [ Hero( color: Color(0xFF86F3FB),image: "https://game.gtimg.cn/images/lol/act/img/skin/big22009.jpg",title: '寒冰射手-艾希',Hero( color: Color(0xFF7D6588),image: "https://game.gtimg.cn/images/lol/act/img/skin/big39006.jpg",title: '刀锋舞者-艾瑞莉娅',Hero( color: Color(0xFF4c314D),image: "https://game.gtimg.cn/images/lol/act/img/skin/big103015.jpg",title: '九尾妖狐-阿狸',]; class Carousel extends StatefulWidget { final List items; final double height; const carousel({ @required this.items,); } } class PageInDicator extends StatelessWidget { final int currenTindex; final int PageCount; const PageInDicator(this.currenTindex,); } } class IndexPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0.0,body: Carousel( height: 540,items: heroes,); } }@H_502_0@至此,整个布局就完成了! :sunglasses: @H_502_0@以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。@H_674_6@
以上是大佬教程为你收集整理的使用Flutter实现一个走马灯布局的示例代码全部内容,希望文章能够帮你解决使用Flutter实现一个走马灯布局的示例代码所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。