当前位置:   article > 正文

Flutter 基础组件之 Row、Column_flutter row 底部对齐

flutter row 底部对齐

1 Row

Row 是一个可以沿水平方向展示它的子组件的组件。

它还可以灵活布局,如果要让某个子组件填充满剩余剩余空间,请使用 Expanded 组件包裹该组件即可。

Row 组件是不可以滚动的,所以在 Row 组件中一般不会放置过多子组件,如果需要滚动的话应该考虑使用 ListView。

如果需要垂直展示,应该考虑 Column 组件。

如果只有一个子组件的话,应该考虑使用使用 Align 或者 Container 组件来定位这个子组件。

说了这么多,对我来说,Row 就是一个 orientation 为 horizontal 的 LinearLayout。

 

1.1 构造方法

Row({Key key, MainAxisAlignment mainAxisAlignment: MainAxisAlignment.start, MainAxisSize mainAxisSize: MainAxisSize.max, CrossAxisAlignment crossAxisAlignment: CrossAxisAlignment.center, TextDirection textDirection, VerticalDirection verticalDirection: VerticalDirection.down, TextBaseline textBaseline, List<Widget> children: const [] })

Row 组件只有这一个构造方法,并且也没有什么必传参数,所以说 Row 组件其实是很简单的。

 

1.2 常用属性

crossAxisAlignment:子组件沿着 Cross 轴(在 Row 中是纵轴)如何摆放,其实就是子组件对齐方式,可选值有:
    CrossAxisAlignment.start:子组件在 Row 中顶部对齐。
    CrossAxisAlignment.end:子组件在 Row 中底部对齐。
    CrossAxisAlignment.center:子组件在 Row 中居中对齐。
    CrossAxisAlignment.stretch:拉伸填充满父布局。
    CrossAxisAlignment.baseline:在 Row 组件中会报错。

mainAxisAlignment:子组件沿着 Main 轴(在 Row 中是横轴)如何摆放,其实就是子组件排列方式,可选值有:
    MainAxisAlignment.start:靠左排列。
    MainAxisAlignment.end:靠右排列。
    MainAxisAlignment.center:居中排列。
    MainAxisAlignment.spaceAround:每个子组件左右间隔相等,也就是 margin 相等。
    MainAxisAlignment.spaceBetween:两端对齐,也就是第一个子组件靠左,最后一个子组件靠右,剩余组件在中间平均分散排列。
    MainAxisAlignment.spaceEvenly:每个子组件平均分散排列,也就是宽度相等。

mainAxisSize:Main 轴大小,可选值有:
    MainAxisSize.max:相当于 Android 的 match_parent。
    MainAxisSize.min:相当于 Android 的 wrap_content。

textBaseline:不太理解。

textDirection:子组件排列顺序,可选值有:
    TextDirection.ltr:从左往右开始排列。
    TextDirection.rtl:从右往左开始排列。

verticalDirection:确定如何在垂直方向摆放子组件,以及如何解释 start 和 end,指定 height 可以看到效果,可选值有:
    VerticalDirection.up:Row 从下至上开始摆放子组件,此时我们看到的底部其实是顶部。
    VerticalDirection.down:Row 从上至下开始摆放子组件,此时我们看到的顶部就是顶部。

children:子组件,值是一个 Widget 数组。

 

下面是一个设置了上述属性的 Demo:

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(MyApp());
  3. class MyApp extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. // TODO: implement build
  7. return MaterialApp(
  8. title: "Row",
  9. debugShowCheckedModeBanner: false,
  10. home: Scaffold(
  11. appBar: AppBar(
  12. title: Text("Row"),
  13. ),
  14. body: Container(
  15. height: 300,
  16. child: Row(
  17. //子组件沿着 Cross 轴(在 Row 中是纵轴)如何摆放,其实就是子组件对齐方式,可选值有:
  18. //CrossAxisAlignment.start:子组件在 Row 中顶部对齐
  19. //CrossAxisAlignment.end:子组件在 Row 中底部对齐
  20. //CrossAxisAlignment.center:子组件在 Row 中居中对齐
  21. //CrossAxisAlignment.stretch:拉伸填充满父布局
  22. //CrossAxisAlignment.baseline:在 Row 组件中会报错
  23. crossAxisAlignment: CrossAxisAlignment.start,
  24. //子组件沿着 Main 轴(在 Row 中是横轴)如何摆放,其实就是子组件排列方式,可选值有:
  25. //MainAxisAlignment.start:靠左排列
  26. //MainAxisAlignment.end:靠右排列
  27. //MainAxisAlignment.center:居中排列
  28. //MainAxisAlignment.spaceAround:每个子组件左右间隔相等,也就是 margin 相等
  29. //MainAxisAlignment.spaceBetween:两端对齐,也就是第一个子组件靠左,最后一个子组件靠右,剩余组件在中间平均分散排列
  30. //MainAxisAlignment.spaceEvenly:每个子组件平均分散排列,也就是宽度相等
  31. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  32. //Main 轴大小,可选值有:
  33. //MainAxisSize.max:相当于 Android 的 match_parent
  34. //MainAxisSize.min:相当于 Android 的 wrap_content
  35. mainAxisSize: MainAxisSize.max,
  36. //不太理解
  37. // textBaseline: TextBaseline.alphabetic,
  38. //子组件排列顺序,可选值有:
  39. //TextDirection.ltr:从左往右开始排列
  40. //TextDirection.rtl:从右往左开始排列
  41. textDirection: TextDirection.ltr,
  42. //确定如何在垂直方向摆放子组件,以及如何解释 startend,指定 height 可以看到效果,可选值有:
  43. //VerticalDirection.up:Row 从下至上开始摆放子组件,此时我们看到的底部其实是顶部
  44. //VerticalDirection.down:Row 从上至下开始摆放子组件,此时我们看到的顶部就是顶部
  45. verticalDirection: VerticalDirection.down,
  46. children: <Widget>[
  47. Container(
  48. color: Color(0xFFFF0000),
  49. child: Text(
  50. "Text1",
  51. style: TextStyle(fontSize: 30.0),
  52. ),
  53. ),
  54. Container(
  55. color: Color(0xFFFFFF00),
  56. child: Text(
  57. "Text2",
  58. style: TextStyle(fontSize: 30.0),
  59. ),
  60. ),
  61. Container(
  62. color: Color(0xFF00FF00),
  63. child: Text(
  64. "Text3",
  65. style: TextStyle(fontSize: 30.0),
  66. ),
  67. ),
  68. Container(
  69. color: Color(0xFF0000FF),
  70. child: Text(
  71. "Text4",
  72. style: TextStyle(fontSize: 30.0),
  73. ),
  74. ),
  75. ],
  76. ),
  77. ),
  78. ),
  79. );
  80. }
  81. }

 

运行效果如下:

 

可以看到的是 4 个子组件的宽度是包裹了文字,有时候我们希望它们能够平分 Row 的宽度,这时候只需要用 Expanded 组件包裹一下子组件就行了:

  1. children: <Widget>[
  2. Expanded(
  3. child: Container(
  4. color: Color(0xFFFF0000),
  5. child: Text(
  6. "Text1",
  7. style: TextStyle(fontSize: 30.0),
  8. ),
  9. )),
  10. Expanded(
  11. child: Container(
  12. color: Color(0xFFFFFF00),
  13. child: Text(
  14. "Text2",
  15. style: TextStyle(fontSize: 30.0),
  16. ),
  17. )),
  18. Expanded(
  19. child: Container(
  20. color: Color(0xFF00FF00),
  21. child: Text(
  22. "Text3",
  23. style: TextStyle(fontSize: 30.0),
  24. ),
  25. )),
  26. Expanded(
  27. child: Container(
  28. color: Color(0xFF0000FF),
  29. child: Text(
  30. "Text4",
  31. style: TextStyle(fontSize: 30.0),
  32. ),
  33. )),

 

运行效果如下:

 

Expanded 组件的使用很简单,除了一个必传的参数 child 以为,还有一个 flex 属性,它就相当于 LinearLayout 中的 weight,默认是 1,如果指定为 2 就表示它包裹的子组件占据的空间为总数的两份,如:

  1. children: <Widget>[
  2. Expanded(
  3. child: Container(
  4. color: Color(0xFFFF0000),
  5. child: Text(
  6. "Text1",
  7. style: TextStyle(fontSize: 30.0),
  8. ),
  9. )),
  10. Expanded(
  11. child: Container(
  12. color: Color(0xFFFFFF00),
  13. child: Text(
  14. "Text2",
  15. style: TextStyle(fontSize: 30.0),
  16. ),
  17. )),
  18. Expanded(
  19. child: Container(
  20. color: Color(0xFF00FF00),
  21. child: Text(
  22. "Text3",
  23. style: TextStyle(fontSize: 30.0),
  24. ),
  25. )),
  26. Expanded(
  27. flex: 2,
  28. child: Container(
  29. color: Color(0xFF0000FF),
  30. child: Text(
  31. "Text4",
  32. style: TextStyle(fontSize: 30.0),
  33. ),
  34. )),
  35. ],

一共是 4 个子组件,最后一个子组件指定了 flex 为 2,其他没有指定 flex 属性的子组件默认 flex 为 1,1+1+1+2 = 5,总共把 Row 组件的宽度分为 5 份,最后一个子组件的宽度占 5 份中的 2 份,其余子组件各占 5 份中的 1 份:

 

2 Column

Column 就相当于一个 orientation 为 vertical 的 LinearLayout。它的用法完全与 Row 一样,可以说会了 Row 组件就会了 Column 组件,所以不详细介绍,将上面 Demo 中的 Row 改为 Column 看看效果:

  1. import 'package:flutter/material.dart';
  2. void main() => runApp(MyApp());
  3. class MyApp extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. // TODO: implement build
  7. return MaterialApp(
  8. title: "Row",
  9. debugShowCheckedModeBanner: false,
  10. home: Scaffold(
  11. appBar: AppBar(
  12. title: Text("Row"),
  13. ),
  14. body: Container(
  15. child: Column(
  16. //子组件沿着 Cross 轴(在 Row 中是纵轴)如何摆放,其实就是子组件对齐方式,可选值有:
  17. //CrossAxisAlignment.start:子组件在 Row 中顶部对齐
  18. //CrossAxisAlignment.end:子组件在 Row 中底部对齐
  19. //CrossAxisAlignment.center:子组件在 Row 中居中对齐
  20. //CrossAxisAlignment.stretch:拉伸填充满父布局
  21. //CrossAxisAlignment.baseline:在 Row 组件中会报错
  22. crossAxisAlignment: CrossAxisAlignment.start,
  23. //子组件沿着 Main 轴(在 Row 中是横轴)如何摆放,其实就是子组件排列方式,可选值有:
  24. //MainAxisAlignment.start:靠左排列
  25. //MainAxisAlignment.end:靠右排列
  26. //MainAxisAlignment.center:居中排列
  27. //MainAxisAlignment.spaceAround:每个子组件左右间隔相等,也就是 margin 相等
  28. //MainAxisAlignment.spaceBetween:两端对齐,也就是第一个子组件靠左,最后一个子组件靠右,剩余组件在中间平均分散排列
  29. //MainAxisAlignment.spaceEvenly:每个子组件平均分散排列,也就是宽度相等
  30. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  31. //Main 轴大小,可选值有:
  32. //MainAxisSize.max:相当于 Android 的 match_parent
  33. //MainAxisSize.min:相当于 Android 的 wrap_content
  34. mainAxisSize: MainAxisSize.max,
  35. //不太理解
  36. // textBaseline: TextBaseline.alphabetic,
  37. //子组件排列顺序,可选值有:
  38. //TextDirection.ltr:从左往右开始排列
  39. //TextDirection.rtl:从右往左开始排列
  40. textDirection: TextDirection.ltr,
  41. //确定如何在垂直方向摆放子组件,以及如何解释 startend,指定 height 可以看到效果,可选值有:
  42. //VerticalDirection.up:Row 从下至上开始摆放子组件,此时我们看到的底部其实是顶部
  43. //VerticalDirection.down:Row 从上至下开始摆放子组件,此时我们看到的顶部就是顶部
  44. verticalDirection: VerticalDirection.down,
  45. children: <Widget>[
  46. Expanded(
  47. child: Container(
  48. width: double.infinity,
  49. color: Color(0xFFFF0000),
  50. child: Text(
  51. "Text1",
  52. style: TextStyle(fontSize: 30.0),
  53. ),
  54. )),
  55. Expanded(
  56. child: Container(
  57. width: double.infinity,
  58. color: Color(0xFFFFFF00),
  59. child: Text(
  60. "Text2",
  61. style: TextStyle(fontSize: 30.0),
  62. ),
  63. )),
  64. Expanded(
  65. child: Container(
  66. width: double.infinity,
  67. color: Color(0xFF00FF00),
  68. child: Text(
  69. "Text3",
  70. style: TextStyle(fontSize: 30.0),
  71. ),
  72. )),
  73. Expanded(
  74. flex: 2,
  75. child: Container(
  76. width: double.infinity,
  77. color: Color(0xFF0000FF),
  78. child: Text(
  79. "Text4",
  80. style: TextStyle(fontSize: 30.0),
  81. ),
  82. )),
  83. ],
  84. ),
  85. ),
  86. ),
  87. );
  88. }
  89. }

 

运行效果如下:

 

3 总结

Flutter 将 Android 中一个 LinearLayout 横纵向拆成了两个组件,还是觉得怪麻烦的,还好两个组件的属性没有上面区别,我忍了。Row 和 Column 是最基本的布局组件,算是基础中的基础呀。

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

闽ICP备14008679号