Center 中的 widthFactor 与 heightFactor 属性

960 阅读2分钟

flutter 的 center 组件大家都不陌生,有居中 child 的作用,但其中 的widthFactor 和 heightFactor 可能鲜有人用。下面我们一起来看下 这两个属性的作用。

没有加 heightFactor 的时候 center 的高度是尽量高,可以充满屏幕。

image.png

把下面的代码 copy 到 main.dart 执行查看效果

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
        child: Container(
            color: Colors.blue,
            child: Center(
              child: Container(
                width: 100,
                height: 100,
                color: Colors.green,
              ),
            )));
  }
}

增加了 heightFactor: 2 后,里面的center的高度变为 200。

image.png

 @override
  Widget build(BuildContext context) { 
    return Center(   //1
        child: Container(  //2
            color: Colors.blue,
            child: Center(  //3
              //增加
              heightFactor: 2,
              child: Container( //4
                width: 100,
                height: 100,
                color: Colors.green,
              ),
            )));
  }

widthFactor 效果也是一样的。

center widget 的特性: 如果没有 heightFactor与widthFactor的话,会尽量大。 上面的代码完整解释 一下

  1. 屏幕告诉 center ,你可以尽量大。于是center 充满屏幕

  2. center 告诉 container 你可以 小到0 也可以大到整个屏幕。 container 想,我自己没有定宽度,所以我要和我的孩子一样大。

  3. container 告诉 center ,你可以 大到充满屏幕。center 如果没有 heightFactor 就和屏幕一样高了。如果有 heightFactor,就只能是 孩子 高度的 2 倍。

  4. center 告诉 container 你可以任意大小,只要别超过屏幕。于是 Container 显示 100 * 100

绿色container的高度定下来后,center 的高度也定下来了 ,是 200, 于是蓝色 contaier的高度也定下来了 也是 200.

应用场景

那么,这两个属性有什么应用场景呢?

widthFactor 就直接的效果就把 center 定高宽,相当于 在 center 外加了一个 SizedBox。

下面的两段代码是等效的 ,明显第一段更简洁,少了一层。

Center(
   heightFactor: 2,
   child: Container(
     width: 100,
     height: 100,
     color: Colors.green,
   ),
 )));
SizedBox(
  height: 200,
  child: Center(
    heightFactor: 2,
    child: Container(
      width: 100,
      height: 100,
      color: Colors.green,
    ),
  ))));

有明确高宽需求的场景,都是 widthFactor 与 heightFactor应用场景。

最后补充一下,如果 Center受到父 widget 的 tight 约束 widthFactor 与 heightFactor 无效。

相关

  1. Align 也有 widthFactor 与 heightFactor 属性效果和 Center 一样,Center 继承自 Align。
  2. FractionallySizedBox widthFactor 与 heightFactor 属性效果和 Center 一样