Flutter列表控件ListView與GridView


代碼如下:

import 'package:flutter/material.dart';
import 'ListViewTest.dart';
void main(){

  runApp(
    MaterialApp(
      title: "title",
      home: new Scaffold(
        appBar: new AppBar(title: Text("appBar")),
        body:Container(
          child: new ListViewTest(),
        )
      )
    ),
  );

}
import 'package:flutter/material.dart';

class ListViewTest extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return new _ListViewTest();
  }

}

class _ListViewTest extends State<ListViewTest>{

  List<String> _list = new List();

  @override
  void initState() {
    super.initState();
    for(int i = 0; i < 30; i++){
      _list.add("第$i條數據");
    }
  }

  @override
  Widget build(BuildContext context) {
    return getListView();//效果如下
  }

}

SingleChildScrollView的使用:

Widget getListView(){
    List<Widget> widget = new List();
    for (var value in _list) {
      widget.add(
          Text(
            value,
            style: TextStyle(
                fontSize: 20.0,
                color: Colors.red
            ),
          )
      );
    }

    //類似android中的ScrollView   這里SingleChildScrollView的寬度是包裹內容的寬度
    return SingleChildScrollView(
      child: Column(
        children: widget,
      ),
    );

}

效果圖:

ListView的使用:

Widget getListView2(){
    List<Widget> widget = new List();
    for (var value in _list) {
      widget.add(
          Text(
            value,
            style: TextStyle(
                fontSize: 20.0,
                color: Colors.red
            ),
          )
      );
    }

    //與android不同的是,可以把ListView當做ScrollView來使用
    return ListView(
      children: widget,
    );

  }

效果圖同上,但ListView的寬度是整個屏幕寬度

另一種用法:

ListView getListView(){
    return ListView.builder(
      scrollDirection: Axis.vertical,//設置列表的 滑動方向
      
      //設置item
      itemBuilder: (BuildContext context, int index){
        return InkWell(//InkWell是有水波紋效果的Widget,  需要有個父布局為Material
          onTap: (){
            //寫了點擊事件  才會有水波紋效果
            print("點擊事件");
          },
          onLongPress: (){
            print("長按事件");
          },
          splashColor: Colors.blue,
          child: Container(
              alignment: Alignment.center,
              padding: EdgeInsets.all(15.0),
              decoration: BoxDecoration(
                //設置背景色 與 分割線
                border: Border(
                    bottom: BorderSide(
                        color: Colors.red,
                        width: 5.0
                    )
                ),
                //color: index % 2 == 0 ? Colors.grey : Colors.yellow,//背景顏色
              ),
              child: Text(
                _list[index],
                style: TextStyle(
                    fontSize: 20.0,
                    color: Colors.red
                ),
              )
          ),
        );
      },
      
      //確定個數
      itemCount: _list.length,
    );
  }

效果圖:

GridView的使用:

第一種使用方法:

GridView getGridView(){
    return GridView.count(
      crossAxisCount: 3,//每行的個數
      //padding: EdgeInsets.all(20.0),
      crossAxisSpacing: 10.0,//交叉軸間距
      mainAxisSpacing: 10.0,//主軸間距
      childAspectRatio: 1.0,//縱橫軸的比例(寬:高 = childAspectRatio)
      children: <Widget>[
        new Container(
          color: Colors.red,
          alignment: Alignment.center,
          child: Text("第1個"),
        ),
        new Container(
          color: Colors.blue,
          alignment: Alignment.center,
          child: Text("第2個"),
        ),
        new Container(
          color: Colors.red,
          alignment: Alignment.center,
          child: Text("第3個"),
        ),
        new Container(
          color: Colors.blue,
          alignment: Alignment.center,
          child: Text("第4個"),
        ),
        new Container(
          color: Colors.red,
          alignment: Alignment.center,
          child: Text("第5個"),
        ),
        new Container(
          color: Colors.blue,
          alignment: Alignment.center,
          child: Text("第6個"),
        ),
        new Container(
          color: Colors.red,
          alignment: Alignment.center,
          child: Text("第7個"),
        ),
        new Container(
          color: Colors.blue,
          alignment: Alignment.center,
          child: Text("第8個"),
        ),
      ],
    );
  }

效果圖:

第二種使用方法,根據index創建item:

GridView getGridView(){
    return GridView.builder(
      //設置滑動方向
      scrollDirection:Axis.horizontal,

      //設置屬性
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 3,//每行的個數
        crossAxisSpacing: 10.0,//交叉軸間距
        mainAxisSpacing: 10.0,//主軸間距
        childAspectRatio: 1.0,//縱橫軸的比例(寬:高 = childAspectRatio)
      ),

      //創建item
      itemBuilder:(BuildContext context, int index){
        return new FlatButton(
          onPressed: (){
            Scaffold.of(context).showSnackBar(
                new SnackBar(content: Text("點擊了$index"))
            );
          },
          color: Colors.red,
          child: Text("${_list[index]}"),
        );
      },

      //確定個數
      itemCount: _list.length,
    );
  }

效果圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM