Flutter中的滚动视图(ListView 和GridView)

1- ListView的使用

在文档中我们可以看到ListView有 几种创建方式

在这里插入图片描述

1.1公用的方式

//导入风格样式库
import 'package:flutter/material.dart';

//main函数
main() =>runApp(MyApp());

//MyApp类继承StatelessWidget
class MyApp extends StatelessWidget {

  //重写方法
  @override
  Widget build(BuildContext context) {
   
    return MaterialApp(
      home: JCHome() ,
    );
  }
}

class JCHome extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    //创建一个控制器
    return Scaffold(
      appBar:AppBar(
        title: Text(
          "Flutter Demo",
          style: TextStyle(
            fontSize: 20,
          ),
        ),

      ) ,
      body: JCHomePage(),
    );
  }
}


class JCHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
   //这里可以调用不同的创建方式
    return creatListDefault1();
  }
}

1.3ListView的默认创建方式

定义一个函数,listView默认创建方式

ListView creatListDefault1() {

  return  ListView(
      children: List.generate(100, (index){

        return ListTile(
          leading: Icon(Icons.people),
          trailing: Icon(Icons.delete),
          title: Text(
            "联系人${index + 1}",
          ),
          subtitle: Text(
              "电话:18677768954"
          ),
        );

      })
  );
}

默认创建方式2

ListView getListViewDemo1(){

  ListView(
    children: <Widget>[
      Row(
        children: <Widget>[
          Icon(Icons.face,color: Colors.red,),
          Text(
            "这是一个脸谱",
            style: TextStyle(
              fontSize: 20,
            ),
          ),
        ],
      ),

    ],
  );

}

1.4 builder创建ListView
//创建方式2
class ListViewDemo2 extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return ListView.builder(
       //item个数
        itemCount:100 ,
        //item的高度
        itemExtent:60 ,
        itemBuilder: (BuildContext ctx, int index){
          return Text("Hellow Word -- $index",
            style: TextStyle(
                fontSize: 20,
                color: Colors.red

            ),
          );
        }
    );
  }
}

1.5 separated分割线的创建方式

class ListViewDemo3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ListView.separated(

      itemCount: 100,
      //创建cell
      itemBuilder: (BuildContext ctx, int index){
        return Text("测试--$index",
          style: TextStyle(
            fontSize: 20,

          ),
        );
      },
      //分割线
      separatorBuilder: (BuildContext ctx,int index){

        return Divider(
          color: Colors.red,

        );
      },

    );
  }
}

2-GridView几何视图

import 'dart:math';

import 'package:flutter/material.dart';

main() =>runApp(MyApp());


class MyApp extends StatelessWidget {

  //重写方法
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: JCHome() ,
    );
  }
}

class JCHome extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    //创建一个控制器
    return Scaffold(
      appBar:AppBar(
        title: Text(
          "Flutter Demo",
          style: TextStyle(
            fontSize: 20,
          ),
        ),

      ) ,
      body: JCHomePage(),
    );
  }
}


class JCHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //调用不同的创建方式
    return  creatGridViewThress();
  }
}


2.1 默认创建GridView的方式

SliverGridDelegateWithFixedCrossAxisCount 固定交叉轴的 个数


//默认创建GridView的方式
Padding getGridViewDefault () {

  return   Padding(
    padding: const EdgeInsets.all(8.0),
    child: GridView(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 3,
          crossAxisSpacing: 8,
          mainAxisSpacing: 8,
          //宽度和高度的比例 是0.8
          childAspectRatio: .8,

        ),
        children: List.generate(100, (index){

          return Container(
            color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
          );

        })
    ),
  );
}



2.2 builder创建方式

SliverGridDelegateWithMaxCrossAxisExtent


GridView creatGridViewTwoMethod (){
  return GridView.builder(
      //代理方式
      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        maxCrossAxisExtent: 200,
        crossAxisSpacing: 8,
        mainAxisSpacing: 8,
      ),
      itemBuilder: (BuildContext context,int index){
        return Container(
          color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
        );
      }
  );
}


SliverGridDelegateWithFixedCrossAxisCount

GridView creatGridViewThress() {
  return GridView.builder(
      //固定交叉轴上item的个数
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  
          crossAxisCount: 3,
          crossAxisSpacing: 8,
          mainAxisSpacing: 8,
          //宽度和高度的比例 是0.8
          childAspectRatio: .8,
      ),
      itemBuilder: (BuildContext context,int index){
        return Container(
          color: Color.fromARGB(255, Random().nextInt(256), Random().nextInt(256), Random().nextInt(256)),
        );
      }
  );
}

3. CustomScrollView

上面的ListView和GridView都可以通过 CustomScrollView的上市创建

ListView为例子看一下里面实现的源码

ListView继承BoxScrollView,
BoxScrollView继承 ScrollView
ScrollView继承StatelessWidget

通过查看ScrollView的build方法
在这里插入图片描述

是没有实现的方法(抽象类方法)
@protected List<Widget> buildSlivers(BuildContext context);
他的子类会实现, BoxScrollView

在这里插入图片描述

在BoxScrollView中实现,中我们发现

buildChildLayout 方法 也是一个抽象类方法,需要其子类实现(ListView 和 GridView)

在这里插入图片描述

ListView的实现

在这里插入图片描述

GridView的实现

在这里插入图片描述

3.1 CustomScrollView 中的 Sliver

在这里插入图片描述

CustomScrollView有一个slivers属性,里面让我们放对应的一些Sliver:

  • SliverList:类似于我们之前使用过的ListView;
  • SliverFixedExtentList:类似于SliverList只是可以设置滚动的高度;
  • SliverGrid:类似于我们之前使用过的GridView;
  • SliverPadding:设置Sliver的内边距,因为可能要单独给Sliver设置内边距;
  • SliverAppBar:添加一个AppBar,通常用来作为-CustomScrollView的HeaderView;
  • SliverSafeArea:设置内容显示在安全区域
import 'dart:math';

import 'package:flutter/material.dart';

main() =>runApp(MyApp());


class MyApp extends StatelessWidget {

  //重写方法
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: JCHome() ,
    );
  }
}

class JCHome extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    //创建一个控制器
    return Scaffold(
//      appBar:AppBar(
//        title: Text(
//          "Flutter Demo",
//          style: TextStyle(
//            fontSize: 20,
//          ),
//        ),
//
//      ) ,
      body: JCHomePage(),
    );
  }
}


class JCHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return  creatSliverList();

  }
}


在这里插入图片描述

CustomScrollView creatSliverList (){

  return CustomScrollView(
    slivers: <Widget>[
      SliverAppBar(
        //固定导航条
        pinned: true,
        title: Text(
            "自定义的导航条"
        ),

        // 头部View的高度
        expandedHeight: 300,
        flexibleSpace: FlexibleSpaceBar(
            background: Image(
              image: AssetImage("resource/images/11.jpg"),
              fit: BoxFit.fill,
            ),
            collapseMode: CollapseMode.pin,
            stretchModes:[StretchMode.blurBackground]
        ),

      ),
      //集合视图sliver的Sliver
      SliverGrid(
        delegate: SliverChildBuilderDelegate(
              (BuildContext ctx, int index){

            return  Container(color: Color.fromARGB(255, Random().nextInt(
                256), Random().nextInt(256), Random().nextInt(256)));
          },
          childCount: 60,
        ),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 3,
            crossAxisSpacing: 8,
            mainAxisSpacing: 8
        ),
      ),
      //listView
      SliverList(
        delegate: SliverChildBuilderDelegate(
              (BuildContext ctx, int  index){

            return ListTile(
              leading: Icon(Icons.people),
              title: Text("联系人 ${index}"),
            );
          },
          childCount: 50,
        ),
      ),
    ],
  );
}

在这里插入图片描述

CustomScrollView creatGridViewWithSliver(){

  return CustomScrollView(
    slivers: <Widget>[
      //安全区域
      SliverSafeArea(
        //安全padding
        sliver: SliverPadding(
          padding: EdgeInsets.all(8),
          sliver: SliverGrid(
            delegate:SliverChildBuilderDelegate(
                  (BuildContext context, int index){
                return Container(color: Color.fromARGB(255, Random().nextInt(
                    256), Random().nextInt(256), Random().nextInt(256)));
              },
              childCount: 100,
            ) ,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                crossAxisSpacing: 8,
                mainAxisSpacing: 8
            ),
          ),
        ),
      )

    ],
  );
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值