美文网首页
Flutter CustomScrollView实现折叠布局+上

Flutter CustomScrollView实现折叠布局+上

作者: 大队辅导猿 | 来源:发表于2020-08-12 10:11 被阅读0次

    标题越长功能越简单系列

    image.png

    实现的具体效果

    实现的具体效果
    实现思路:用原生RefreshIndicator实现下拉刷新,CustomScrollView中controller来判断是否滑动到底部
    Scaffold(
            /**
             * 外面包裹下拉刷新控件
             * 下拉刷新组件具体属性
             * RefreshIndicator
             *  ({
             *   Key key,
             *   @required this.child,子控件
             *   this.displacement: 40.0, //触发下拉刷新的距离
             *   @required this.onRefresh, //下拉回调方法,方法需要有async和await关键字,没有await,刷新图标立马消失,没有async,刷新图标不会消失
             *   this.color, //进度指示器前景色 默认为系统主题色
             *   this.backgroundColor, //背景色
             *   this.notificationPredicate: defaultScrollNotificationPredicate,
             *   })
             */
            body: RefreshIndicator(
              child:  CustomScrollView(
                primary: false,
                controller: _controller,
                physics: ScrollPhysics(),
                //滑动效果,如阻尼效果等等
    //            physics: const BouncingScrollPhysics(),
                slivers: <Widget>[
                  getTitle(),//上面的折叠布局
                  SliverToBoxAdapter(
                    child: Gaps.vGap10,
                  ),//就是个间距
                  SliverGrid(
                    gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                      maxCrossAxisExtent: 250.0,
                      mainAxisSpacing: 10.0,
                      crossAxisSpacing: 10.0,
                      childAspectRatio: 1.2, //子控件宽高比
                    ),
                    delegate: SliverChildBuilderDelegate(
                      (BuildContext context, int index) {
                        //Item的子组件这里就不展示了,就是一个层叠布局
                        return getVideoItem(_sideoEntityList[index], index);
                      },
                      childCount: _sideoEntityList.length,
                    ),
                  ),
                  SliverToBoxAdapter(
                    child:  Visibility(
                      child:  Container(
                        padding: EdgeInsets.fromLTRB(0, 10, 0, 10),
                        child:  Center(
                          child:  Text(loadingText),
                        ),
                      ),
                      visible: _provider.isLoadMore,
                    ),
                  ),//Visibility包裹的文字,根据是否有更多数据显示/隐藏
                ],
              ),
              onRefresh: () {
                //下拉刷新具体操作
                return _RrefreshPull().then((value) {
                  print('success');
                }).catchError((error) {
                  print('failed');
                });
              },
            ),
          )
    
    ScrollController 控制器的具体实现
    ScrollController _controller;
     _controller = ScrollController();
      _controller.addListener(() {
          int offset = _controller.position.pixels.toInt();
          // 如果滑动到底部
          if (_controller.position.pixels == _controller.position.maxScrollExtent) {
            print("滑动到底部");
            if (isLoding) {
             //下拉刷新的具体操作
            }
          }
        });
    
    头部的折叠布局具体实现
     /// 获取标题布局
      Widget getTitle() {
        return new SliverAppBar(
          leading: GestureDetector(
            child: Icon(
              Icons.arrow_back,
             //这里我主要是为了实现夜间模式
              color: isDark ? Colours.bg_color : Colours.dark_bg_color,
            ),
            onTap: () => Navigator.pop(context),
          ),
          //左侧按钮
          elevation: 4,
          //阴影的高度
          forceElevated: true,
          //是否显示阴影
          backgroundColor: isDark ? Colours.dark_bg_color : Colours.bg_color,
          iconTheme: IconThemeData(color: Colors.white, size: 25, opacity: 1),
          primary: true,
          // appbar是否显示在屏幕的最上面,为false是显示在最上面,为true就显示在状态栏的下面
          titleSpacing: 16,
          expandedHeight: 120.0,
          pinned: true,
          //是否固定导航栏,为true是固定,为false是不固定,往上滑,导航栏可以隐藏
          flexibleSpace: FlexibleSpaceBar(
            centerTitle: false,
            titlePadding:
                const EdgeInsetsDirectional.only(start: 50.0, bottom: 12.0),
            title: Text(
              '专项视频课',
              style: new TextStyle(fontSize: 20.0, color: isDark ? Colours.dark_text : Colours.text),
            ),
          ),
        );
      }
    

    GIthub 点我点我 具体实现都在这

    相关文章

      网友评论

          本文标题:Flutter CustomScrollView实现折叠布局+上

          本文链接:https://www.haomeiwen.com/subject/pypprktx.html