当前位置:   article > 正文

Flutter-布局_flutter 商品列表

flutter 商品列表

1)ListView

   示意如下:

   主要用于新闻和用户中心

2)GridView

  示意如下:主要用于商品列表,应用列表

GridView.count实现网格布局: 拥有一行配置元素数量参数crossAxisCount: 4,

GridView.extend实现网格布局,与上面差别在于参数不同

GridView.builder实现动态网格布局

1)GridView.count

  1. GridView.count(
  2. crossAxisCount: 4,
  3. children: const <Widget> [
  4. Icon(Icons.pedal_bike),

2)GridView.extend

  

  1. return GridView.extent(
  2. maxCrossAxisExtent: 40,//最大长度
  3. children: const [
  4. Icon(Icons.pedal_bike),

间距

   只想要间距,就用padding,不必用container

return const Padding(  //padding就是实现间距

       padding: EdgeInsets.all(20),

       child: Text("hello"),

Row:让多个元素排列在一行

默认宽度自适应,占满上层组件赋予的整行

    一般其上会有container

    注意占满屏幕的两个方法:

 //width: 4000,//非常大,就占满了整个屏幕
       width: double.infinity,//获取屏幕整个宽度

  1. Widget build(BuildContext context) {
  2. return Container(
  3. //width: 4000,//非常大,就占满了整个屏幕
  4. width: double.infinity,//获取屏幕整个宽度
  5. //height: 7000,
  6. height: double.infinity,
  7. color: Colors.black54,
  8. child: Row(//外部没有container,则是自适应的
  9. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  10. crossAxisAlignment: CrossAxisAlignment.start,
  11. children:[
  12. IconContainer(Icons.holiday_village,color: Colors.blue,),
  13. IconContainer(Icons.account_box,color: Colors.orange,),
  14. IconContainer(Icons.alarm,color: Colors.blue,),
  15. ],
  16. )
  17. );

进入infinity可以看到,这是无穷大,还有maxFinite可以用

  1. abstract class double extends num {
  2. static const double nan = 0.0 / 0.0;
  3. static const double infinity = 1.0 / 0.0;
  4. static const double negativeInfinity = -infinity;
  5. static const double minPositive = 5e-324;
  6. static const double maxFinite = 1.7976931348623157e+308;

Column:让多个元素排列在一列

默认高度自适应  占满上层组件赋予的整列

Flex:

   Row和Column都继承于flex组件

注意如下flex要放在child前,不然第二个expanded 提示修改

flex:决定了占几份,如果给Iconcontainer设置宽度是没有效果的

  1. return Row(
  2. children:[
  3. Expanded(
  4. flex: 1,
  5. child: IconContainer(Icons.holiday_village,color: Colors.blue,),//占一份
  6. ),
  7. Expanded(
  8. child: IconContainer(Icons.account_box,color: Colors.orange,),
  9. flex: 2,//占2份
  10. ),

也可以将return row改成:

    

  1. return Flex(//这里也可以用cloumn或者row,用了flex,就要指定direction
  2. //direction: Axis.horizontal,//水平分配
  3. direction: Axis.vertical,

比如要实现右边固定宽度,左边自适应

那么对于右边元素,不要设置flex,就会采用其本身宽度

Stack &Positioned:绝对定位

stack:可以堆在一起

positioned:指定两个坐标,相对外层容器

如果position里面是row,还需要制定宽度高度,否则报错,控制台无限循环

  1. return Container(
  2.       height: 400,
  3.       width: 300,
  4.       color: Colors.blue,
  5.           child: Stack(
  6.             children: [
  7.               Positioned(
  8.                 left: 10,
  9.                 bottom: 10, //代表底部左侧
  10.                 child: Container(
  11.                  width: 100,
  12.                 height: 100,
  13.                  color: Colors.yellow,
  14.               ),
  15.               ),
  16.               const Positioned(
  17.                 right: 0,
  18.                 top: 190,
  19.                 child:  Text("hello 1116"),
  20.               ),
  21.              

获取设备高度宽度

  1. Widget build(BuildContext context) {
  2. final size=MediaQuery.of(context).size;//不能用infinite,获取设备宽度和高度
  3. return Stack(
  4. children: [
  5. ListView(
  6. padding: const EdgeInsets.only(top: 50),//避免顶部被下面的导航遮盖
  7. children: const [
  8. ListTile(title:Text("i am liebiao1") ),
  9. ListTile(title:Text("i am liebiao2")) ,
  10. ListTile(title:Text("i am liebiao3") ),
  11. ListTile(title:Text("i am liebiao4") , ),
  12. ListTile(title:Text("i am liebiao5") , ),
  13. ListTile(title:Text("i am liebiao6") , ),
  14. ListTile(title:Text("i am liebiao7") , ),
  15. ListTile(title:Text("i am liebiao8") , ),
  16. ListTile(title:Text("i am liebiao9") , ),
  17. ListTile(title:Text("i am liebiao10") , ),
  18. ListTile(title:Text("i am liebiao11") , ),
  19. ListTile(title:Text("i am liebiao12") , ),
  20. ListTile(title:Text("i am liebiao13") , ),
  21. ListTile(title:Text("i am liebiao14") , ),
  22. ListTile(title:Text("i am liebiao15") , ),
  23. ListTile(title:Text("i am liebiao16") , ),
  24. ListTile(title:Text("i am liebiao17") , ),
  25. ],
  26. ),
  27. Positioned(
  28. left: 0,
  29. top:0,
  30. width: size.width,//获取设备宽度
  31. height: 44,
  32. child:Container(
  33. alignment: Alignment.topLeft,
  34. height: 44,
  35. color: Colors.black,
  36. child: const Text("二级导航",
  37. style:TextStyle(color: Colors.white) ,),
  38. ),
  39. ),
  40. ],
  41. );
  42. }

Stack&Align

Align也可以作为元素

  1. return Container(
  2. width: 300,
  3. height: 300,
  4. color: Colors.red,
  5. child: const Align( //Align 如果要居中也可以直接用center
  6. alignment: Alignment.bottomRight,
  7. child:Text("你好,i7i8i9 "),
  8. )

    alignment: Alignment(-1, 1),也可以这样设置()里面的是x,y单位不是像素

-1,1左侧底部

1,1 右侧底部

    

 实现单行居左居右,

row+align无效果,只能用stack+align

  1. return Stack(
  2. children: const [
  3. Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
  4. Align(alignment: Alignment.topRight,child: Text("购买") ,),
  5. ],
  6. );

实现方法2:

cloumn+container+stack+Align

因为只用了宽度高度,container可以改为sizedbox

  1. return Column(
  2. children: [
  3. Container(
  4. width: double.infinity,
  5. height: 40,
  6. child: Stack(
  7. children: const [
  8. Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
  9. Align(alignment: Alignment.topRight,child: Text("购买") ,),
  10. ],
  11. ),
  12. )
  13. ],
  14. )

实现方法3:更容易定位到具体位置

cloumn+sizedbox+stack+positioned

stack上层套包裹一层,要么是有宽高的box或最外层,不能直接是column

  1. return Column(
  2. children: [
  3. SizedBox(
  4. width: double.infinity,
  5. height: 40,
  6. child: Stack(
  7. children: const [
  8. Align(alignment: Alignment.topLeft,child: Text("收藏") ,),
  9. Align(alignment: Alignment.topRight,child: Text("购买") ,),
  10. ],
  11. ),
  12. ),
  13. SizedBox(
  14. width: double.infinity,
  15. height: 40,
  16. child: Stack(
  17. children: const [
  18. Positioned(
  19. left: 10,
  20. child: Text("收藏")),
  21. Positioned(
  22. right: 10,
  23. child: Text("购买")),
  24. ],
  25. ),
  26. )
  27. ],
  28. )

宽高比

  1. return AspectRatio(
  2. aspectRatio: 3/1,//宽度是屏幕宽度,高度是容器一半,用在图片上较多
  3. child: Container(
  4. color: Colors.red,
  5. ),

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/242601
推荐阅读
相关标签
  

闽ICP备14008679号