美文网首页Flutter
04.ListView列表组件

04.ListView列表组件

作者: A君小红红 | 来源:发表于2020-05-31 21:37 被阅读0次

    ListView的声明

    重新熟悉一下一个Flutter页面的基本写法,代码如下:

    import 'package:flutter/material.dart';
    
    void main () => runApp(MyApp());
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context){
        return MaterialApp(
          title:'JSPang Flutter Demo',
          home:Scaffold(
            appBar:new AppBar(
              title:new Text('ListView Widget')
            ),
            body: new Text('ListView Text')
          ),
        );
      }
    }
    

    有了最基本的结构后,就可以加入ListView组件,在body代码处加入下面的代码:

    body: new ListView(
      children:<Widget>[
        new ListTile(
          leading:new Icon(Icons.access_time),
          title:new Text('access_time')
        )
      ]
    ),
    

    我们使用了ListView,然后在他的内部children中,使用了widget数组,因为是一个列表,所以它接受一个数组,然后有使用了listTite组件(列表瓦片),在组件中放置了图标和文字。

    当然我们还可以多加入几行列表,比如我们再加入一行,代码如下。

    body: new ListView(
      children:<Widget>[
        new ListTile(
          leading:new Icon(Icons.access_time),
          title:new Text('access_time')
        ),
        new ListTile(
          leading:new Icon(Icons.account_balance),
          title:new Text('account_balance')
        ),
      ]
    ),
    

    图片列表的使用

    上节课学习了Image Widget,在这里我们就在列表中加入图片来试一下。我们插入4幅图片,然后看一下效果,代码如下:

    body: new ListView(
      children:<Widget>[
       new Image.network(
          'http://jspang.com/static/upload/20181111/G-wj-ZQuocWlYOHM6MT2Hbh5.jpg'
        ),
         new Image.network(
          'http://jspang.com/static/upload/20181109/1bHNoNGpZjyriCNcvqdKo3s6.jpg'
        ),
         new Image.network(
          'http://jspang.com/static/myimg/typescript_banner.jpg'
        ),new Image.network(
          'http://jspang.com/static/myimg/smile-vue.jpg'
        )
      ]
    ),
    

    上面使用了网络的方式,插入了4张图片,并且这4张图片形成了一个列表。

    横向列表

    已经对ListView有了清楚的认识,也做出了普通的纵向(竖向列表)。这节课我们看看横向列表如何使用。其实还是使用我们的ListView组件,只是在ListView组件里加一个ScrollDirection属性。

    import 'package:flutter/material.dart';
    void main () => runApp(MyApp());
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context ){
          return MaterialApp(
            title:'Text widget',
            home:Scaffold(
              body:Center(
              child:Container(
                height:200.0,
                child:new ListView(
                  scrollDirection: Axis.horizontal,
                  children: <Widget>[
                    new Container(
                      width:180.0,
                      color: Colors.lightBlue,
                    ), new Container(
                      width:180.0,
                      color: Colors.amber,
                    ), new Container(
                      width:180.0,
                      color: Colors.deepOrange,
                    ),new Container(
                      width:180.0,
                      color: Colors.deepPurpleAccent,
                    ),
                  ],
                )
              ),
              ),
            ),
          );
      }
    }
    

    上面先是加入了Center组件,作用是让我们的横向列表可以居中到屏幕的中间位置,然后在center组件的下面加入了Container容器组件,并设置了容器组件的高是200,在容器组件里我们加入了ListView组件,然后设置了组件的scrollDirection属性。然后再ListView的子组件里加入了Container容器组件,然后设置了不同颜色。

    scrollDirection属性

    ListView组件的scrollDirection属性只有两个值,一个是横向滚动,一个是纵向滚动。默认的就是垂直滚动,所以如果是垂直滚动,我们一般都不进行设置。

    • Axis.horizontal:横向滚动或者叫水平方向滚动。
    • Axis.vertical:纵向滚动或者叫垂直方向滚动。

    代码优化

    声明一个MyList的类,然后把嵌套的代码放到这个类里,代码如下。

    class MyList extends StatelessWidget{
      @override
      Widget build(BuildContext context){
        return ListView(
            scrollDirection: Axis.horizontal,
            children: <Widget>[
              new Container(
                width:180.0,
                color: Colors.lightBlue,
              ), new Container(
                width:180.0,
                color: Colors.amber,
              ), new Container(
                width:180.0,
                color: Colors.deepOrange,
              ),new Container(
                width:180.0,
                color: Colors.deepPurpleAccent,
              ),
            ],
        );
      }
    }
    

    然后再MyAPP类里直接使用这个类,这样就减少了嵌套

    import 'package:flutter/material.dart';
    void main () => runApp(MyApp());
    
    class MyApp extends StatelessWidget{
      @override
      Widget build(BuildContext context ){
          return MaterialApp(
            title:'ListView widget',
            home:Scaffold(
              body:Center(
              child:Container(
                height:200.0,
                child:MyList()
                ),
              ),
            ),
          );
      }
    }
    class MyList extends StatelessWidget{
      @override
      Widget build(BuildContext context){
        return ListView(
            scrollDirection: Axis.horizontal,
            children: <Widget>[
              new Container(
                width:180.0,
                color: Colors.lightBlue,
              ), new Container(
                width:180.0,
                color: Colors.amber,
              ), new Container(
                width:180.0,
                color: Colors.deepOrange,
              ),new Container(
                width:180.0,
                color: Colors.deepPurpleAccent,
              ),
            ],
        );
      }
    }
    

    动态列表

    List类型的使用

    List是Dart的集合类型之一,其实你可以把它简单理解为数组(反正我是这么认为的),其他语言也都有这个类型。它的声明有几种方式:

    • var myList = List(): 非固定长度的声明。
    • var myList = List(2): 固定长度的声明。
    • var myList= List<String>():固定类型的声明方式。
    • var myList = [1,2,3]: 对List直接赋值。

    那我们这里使用的是一个List传递,然后直接用List中的generate方法进行生产List里的元素。最后的结果是生产了一个带值的List变量。代码如下:

    void main () => runApp(MyApp(
      items: new List<String>.generate(1000, (i)=> "Item $i")
    ));
    

    说明:再main函数的runApp中调用了MyApp类,再使用类的使用传递了一个items参数,并使用generate生成器对items进行赋值。
    generate方法传递两个参数,第一个参数是生成的个数,第二个是方法。

    接收参数

    那MyApp这个类是需要接收的。

    final List<String> items;
     MyApp({Key key, @required this.items}):super(key:key);
    

    这是一个构造函数,除了Key,我们增加了一个必传参数,这里的@required意思就必传。:super如果父类没有无名无参数的默认构造函数,则子类必须手动调用一个父类构造函数。
    这样我们就可以接收一个传递过来的参数了,当然我们要事先进行声明。

    动态列表 ListView.builder()

    接受了值之后,就可以直接调用动态列表进行生成了。具体代码如下:

    import 'package:flutter/material.dart';
    void main () => runApp(MyApp(
      items: new List<String>.generate(1000, (i)=> "Item $i")
    ));
    class MyApp extends StatelessWidget{
      final List<String> items;
      MyApp({Key key, @required this.items}):super(key:key);
      @override
      Widget build(BuildContext context ){
          return MaterialApp(
            title:'ListView widget',
            home:Scaffold(
              body:new ListView.builder(
                itemCount:items.length,
                itemBuilder:(context,index){
                  return new ListTile(
                    title:new Text('${items[index]}'),
                  );
                }
              )
            ),
          );
      }
    }
    

    相关文章

      网友评论

        本文标题:04.ListView列表组件

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