Flutter Column详解

440 阅读1分钟
//默认情况下column的样式
body: Container(
  color: Colors.orange,
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.center,
    verticalDirection: VerticalDirection.down,
    mainAxisAlignment: MainAxisAlignment.start,
    mainAxisSize: MainAxisSize.max,
    children: const [
      FlutterLogo(size: 100,),
      FlutterLogo(size: 200,),
      FlutterLogo(size: 50,),
    ],
  ),
),
simulator_screenshot_79934653-5F45-4D81-B333-57C48A9396F0.png
mainAxisAlignment: MainAxisAlignment.center,
simulator_screenshot_FAF3DB44-2E19-4895-8F12-7F6BF1134D9D.png
mainAxisSize: MainAxisSize.min,//各种效果都没有了
simulator_screenshot_3AF653F9-EA5F-4A90-8EF0-8B09FF5BC30C.png
mainAxisAlignment: MainAxisAlignment.spaceAround,//将每个组件间的间隔平均分配成n份,然后放在每个组件两遍
simulator_screenshot_9E4E8B9C-2954-4D09-85AD-DA73A5F40805.png
mainAxisAlignment: MainAxisAlignment.spaceBetween,//组件中间填充等分的距离
simulator_screenshot_BD488735-9E0B-4881-80B3-6C03E899ADAF.png
mainAxisAlignment: MainAxisAlignment.spaceEvenly,//将剩余距离等分为n+1份。然后填充在组件之间,每个组件与组件之间距离相等,组件与上下的边框之间距离相等
simulator_screenshot_95FFD6F8-DD6E-4A1D-8588-765B95D033A8.png
Directionality(
  //设置字体的书写方向。从左到右
  textDirection: TextDirection.ltr,
child: Container(
  color: Colors.orange,
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,//拉伸。将column填充满父组件,子组件也在交错轴方向上拉伸
    verticalDirection: VerticalDirection.down,
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,//将剩余距离等分为n+1份。然后填充在组件之间
    mainAxisSize: MainAxisSize.max,
    children: const [
      FlutterLogo(size: 100,),
      FlutterLogo(size: 200,),
      FlutterLogo(size: 50,),
    ],
  ),
),
simulator_screenshot_AD3BEE90-4A87-4ECE-9305-E3B6C76C4A56.png
Expanded(child: FlutterLogo(size: 50,)),
//添加expanded之后,会让子组件填充满没有添加expanded的组件也就是固定高度后剩余的空间。
simulator_screenshot_DF1FA205-FDFF-461E-842A-1FB9FEFE4042.png
child: Column(
  crossAxisAlignment: CrossAxisAlignment.stretch,//拉伸。将column填充满父组件,子组件也在交错轴方向上拉伸
  verticalDirection: VerticalDirection.down,
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,//将剩余距离等分为n+1份。然后填充在组件之间
  mainAxisSize: MainAxisSize.max,
  children:  [
    FlutterLogo(size: 100,),
    FlutterLogo(size: 200,),
    ListView(
      children: List.generate(
          100,
          (index) => Container(
                color: Colors.red,
                height: 20,
                child: Text("${index}"),
              )),
    ),
    FlutterLogo(size: 50,),
  ],
),

======== Exception caught by scheduler library ===================================================== The following _CastError was thrown during a scheduler callback: Null check operator used on a null value

这是因为column中,会对有固定高度的先布局,给一个约束。因为listView是高度是无限的。column高度也是无限的所以有冲突。

child: Container(
  color: Colors.orange,
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,//拉伸。将column填充满父组件,子组件也在交错轴方向上拉伸
    verticalDirection: VerticalDirection.down,
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,//将剩余距离等分为n+1份。然后填充在组件之间
    mainAxisSize: MainAxisSize.max,
    children:  [
      FlutterLogo(size: 100,),
      FlutterLogo(size: 200,),
      Expanded(
        child: ListView(
          children: List.generate(
              100,
              (index) => Container(
                    color: Colors.red,
                    height: 20,
                    child: Text("${index}"),
                  )),
        ),
      ),
      FlutterLogo(size: 50,),
    ],
  ),
),

包裹一层expanded后,会先给固定高度的约束,剩下的再给listView高度。

simulator_screenshot_363373F9-8F99-4072-950A-B2CB2F575A82.png