温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用Flutter首页必用组件NestedScrollView

发布时间:2020-07-28 14:27:34 来源:亿速云 阅读:202 作者:小猪 栏目:移动开发

这篇文章主要为大家展示了如何使用Flutter首页必用组件NestedScrollView,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

昨天Flutter 1.17版本重磅发布,新的版本主要是优化性能、修复bug,有人觉得此版本毫无亮点,但也从另一方面体现了Flutter目前针对移动端已经较为完善,想了解具体内容,文末有链接,如果你想升级到最新版本,建议慎重,有些人升级后项目无法运行。

今天介绍的组件是NestedScrollView,大部分的App首页都会用到这个组件。

可以在其内部嵌套其他滚动视图的滚动视图,其滚动位置是固有链接的。

在普通的ScrollView中, 如果有一个Sliver组件容纳了一个TabBarView,它沿相反的方向滚动(例如,允许用户在标签所代表的页面之间水平滑动,而列表则垂直滚动),则该TabBarView内部的任何列表都不会相互作用 与外部ScrollView。 例如,浏览内部列表以滚动到顶部不会导致外部ScrollView中的SliverAppBar折叠以展开。

滚动隐藏AppBar

比如实现如下场景,当列表滚动时,隐藏AppBar,用法如下:

NestedScrollView(
 headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
  return <Widget>[SliverAppBar(
   title: Text('亿速云'),
  )];
 },
 body: ListView.builder(itemBuilder: (BuildContext context,int index){
  return Container(
   height: 80,
   color: Colors.primaries[index % Colors.primaries.length],
   alignment: Alignment.center,
   child: Text(
    '$index',
    style: TextStyle(color: Colors.white, fontSize: 20),
   ),
  );
 },itemCount: 20,),
)

效果如下:

如何使用Flutter首页必用组件NestedScrollView

SliverAppBar展开折叠

用法如下:

NestedScrollView(
 headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
  return <Widget>[SliverAppBar(
   expandedHeight: 230.0,
   pinned: true,
   flexibleSpace: FlexibleSpaceBar(
    title: Text('复仇者联盟'),
    background: Image.network(
     'http://img.haote.com/upload/20180918/2018091815372344164.jpg',
     fit: BoxFit.fitHeight,
    ),
   ),
  )];
 },
 body: ListView.builder(itemBuilder: (BuildContext context,int index){
  return Container(
   height: 80,
   color: Colors.primaries[index % Colors.primaries.length],
   alignment: Alignment.center,
   child: Text(
    '$index',
    style: TextStyle(color: Colors.white, fontSize: 20),
   ),
  );
 },itemCount: 20,),
)

效果如下:

如何使用Flutter首页必用组件NestedScrollView

与TabBar配合使用

用法如下:

NestedScrollView(
 headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
  return <Widget>[
   SliverAppBar(
    expandedHeight: 230.0,
    pinned: true,
    flexibleSpace: Padding(
     padding: EdgeInsets.symmetric(vertical: 8),
     child: PageView(),
    ),
   ),
   SliverPersistentHeader(
    pinned: true,
    delegate: StickyTabBarDelegate(
     child: TabBar(
      labelColor: Colors.black,
      controller: this._tabController,
      tabs: <Widget>[
       Tab(text: '资讯'),
       Tab(text: '技术'),
      ],
     ),
    ),
   ),
  ];
 },
 body: TabBarView(
  controller: this._tabController,
  children: <Widget>[
   RefreshIndicator(
    onRefresh: (){
     print(('onRefresh'));
    },
    child: _buildTabNewsList(_newsKey, _newsList),
   ),

   _buildTabNewsList(_technologyKey, _technologyList),
  ],
 ),
)

StickyTabBarDelegate 代码如下:

class StickyTabBarDelegate extends SliverPersistentHeaderDelegate {
 final TabBar child;

 StickyTabBarDelegate({@required this.child});

 @override
 Widget build(
   BuildContext context, double shrinkOffset, bool overlapsContent) {
  return Container(
   color: Theme.of(context).backgroundColor,
   child: this.child,
  );
 }

 @override
 double get maxExtent => this.child.preferredSize.height;

 @override
 double get minExtent => this.child.preferredSize.height;

 @override
 bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
  return true;
 }
}

效果如下:

如何使用Flutter首页必用组件NestedScrollView

其他属性

通过scrollDirectionreverse参数控制其滚动方向,用法如下:

 

NestedScrollView(
 scrollDirection: Axis.horizontal,
 reverse: true,
 ...
)

scrollDirection滚动方向,分为垂直和水平方向。

reverse参数表示反转滚动方向,并不是由垂直转为水平,而是垂直方向滚动时,默认向下滚动,reverse设置false,滚动方向改为向上,同理水平滚动改为水平向左。

controller为滚动控制器,可以监听滚到的位置,设置滚动的位置等,用法如下:

_scrollController = ScrollController();

//监听滚动位置
  _scrollController.addListener((){
   print('${_scrollController.position}');
  });
  //滚动到指定位置
  _scrollController.animateTo(20.0);

CustomScrollView(
	controller: _scrollController,
	...
) 

physics表示可滚动组件的物理滚动特性,具体查看ScrollPhysics

以上就是关于如何使用Flutter首页必用组件NestedScrollView的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI