Flutter常用控件(二)

05:ListView列表組件
這是一個(gè)最基本的listview結(jié)構(gòu)

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget{
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      title:'QGS Flutter',
      home:Scaffold(
        appBar:new AppBar(
          title:new Text('ListView Widget')
        ),
        body: new Text('ListView Text')
      ),
    );
  }
}
body: new ListView(
  children:<Widget>[
    new ListTile(
      leading:new Icon(Icons.access_time),
      title:new Text('access_time')
    )
  ]
),

我們使用了ListView,然后在他的內(nèi)部children中,使用了widget數(shù)組,因?yàn)槭且粋€(gè)列表,所以它接受一個(gè)數(shù)組,然后有使用了listTite組件(列表瓦片),在組件中放置了圖標(biāo)和文字。
當(dāng)然我們還可以多加入幾行列表

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')
    ),
  ]
),

圖片列表的使用

body: new ListView(
  children:<Widget>[
   new Image.network(
      'https://upload.jianshu.io/users/upload_avatars/15042138/9bf619dc-b8b0-4581-9f48-f0080478dd42.jpg'
    ),
     new Image.network(
      'https://upload.jianshu.io/users/upload_avatars/15042138/9bf619dc-b8b0-4581-9f48-f0080478dd42.jpg'
    ),
     new Image.network(
      'https://upload.jianshu.io/users/upload_avatars/15042138/9bf619dc-b8b0-4581-9f48-f0080478dd42.jpg'
    ),new Image.network(
      'https://upload.jianshu.io/users/upload_avatars/15042138/9bf619dc-b8b0-4581-9f48-f0080478dd42.jpg'
    )
  ]
),

我們使用了網(wǎng)絡(luò)的方式,插入了4張圖片,并且這4張圖片形成了一個(gè)列表

06:橫向列表

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容器組件,并設(shè)置了容器組件的高是200,在容器組件里我們加入了ListView組件,然后設(shè)置了組件的scrollDirection屬性。然后再ListView的子組件里加入了Container容器組件,然后設(shè)置了不同顏色

scrollDirection屬性
ListView組件的scrollDirection屬性只有兩個(gè)值,一個(gè)是橫向滾動(dòng),一個(gè)是縱向滾動(dòng)。默認(rèn)的就是垂直滾動(dòng),所以如果是垂直滾動(dòng),我們一般都不進(jìn)行設(shè)置。
Axis.horizontal:橫向滾動(dòng)或者叫水平方向滾動(dòng)。
Axis.vertical:縱向滾動(dòng)或者叫垂直方向滾動(dòng)。

07:動(dòng)態(tài)列表
01)List類型
List是Dart的集合類型之一,它的聲明有幾種方式:
var myList = List(): 非固定長度的聲明。
var myList = List(2): 固定長度的聲明。
var myList= List<String>():固定類型的聲明方式。
var myList = [1,2,3]: 對(duì)List直接賦值。

那我們這里使用的是一個(gè)List傳遞,然后直接用List中的generate方法進(jìn)行生產(chǎn)List里的元素。最后的結(jié)果是生產(chǎn)了一個(gè)帶值的List變量。代碼如下:

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

在main函數(shù)的runApp中調(diào)用了MyApp類,再使用類的使用傳遞了一個(gè)items參數(shù),并使用generate生成器對(duì)items進(jìn)行賦值。
generate方法傳遞兩個(gè)參數(shù),第一個(gè)參數(shù)是生成的個(gè)數(shù),第二個(gè)是方法。

02)接收參數(shù)
我們已經(jīng)傳遞了參數(shù),那MyApp這個(gè)類是需要接收的。

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

final List<String> items;
MyApp({Key key, @required this.items}):super(key:key);
這是一個(gè)構(gòu)造函數(shù),除了Key,我們?cè)黾恿艘粋€(gè)必傳參數(shù),這里的@required意思就必傳。:super如果父類沒有無名無參數(shù)的默認(rèn)構(gòu)造函數(shù),則子類必須手動(dòng)調(diào)用一個(gè)父類構(gòu)造函數(shù)。

這樣我們就可以接收一個(gè)傳遞過來的參數(shù)了,當(dāng)然我們要事先進(jìn)行聲明。

03)動(dòng)態(tài)列表Listview.builder()
接受了值之后,就可以直接調(diào)用動(dòng)態(tài)列表進(jìn)行生成了。具體代碼如下:

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]}'),
              );
            }
          )
        ),
      );
  }
}

08:GridView網(wǎng)格列表
最簡(jiǎn)單的網(wǎng)格列表

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:GridView.count(
            padding:const EdgeInsets.all(20.0),
            crossAxisSpacing: 10.0,
            crossAxisCount: 3,
            children: <Widget>[
              const Text('I am QGS'),
              const Text('I love Android'),
              const Text('I love ios'),
              const Text('I like playing games'),
              const Text('I like reading'),
              const Text('I like eating')
            ],
          )
        ),
      );
  }
}

在body屬性中加入網(wǎng)格組件,然后給了一些常用屬性:
padding:表示內(nèi)邊距,這個(gè)小伙伴們應(yīng)該很熟悉。
crossAxisSpacing:網(wǎng)格間的空當(dāng),相當(dāng)于每個(gè)網(wǎng)格之間的間距。
crossAxisCount:網(wǎng)格的列數(shù),相當(dāng)于一行放置的網(wǎng)格數(shù)量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容