Flutter速来系列17、Padding,保持距离:元素与元素,元素与容器的距离

507 阅读3分钟

1. Padding简介

在界面设计中,我们经常需要设置元素之间的空隙,或者是元素与其容器之间的空隙。这就是Padding发挥作用的地方。Padding是一个用于封装其子元素,并围绕子元素创建空白空间的小部件。

Padding(
  padding: EdgeInsets.all(8.0),
  child: Text('Hello, Flutter!'),
);

在这个例子中,Text小部件被Padding小部件包裹,周围有8.0像素的空白。

2. Padding的属性

Padding小部件只有一个主要属性,即padding,用于定义空白的大小。这是通过EdgeInsets类进行设置的,包含以下属性:

EdgeInsets的属性:

属性作用示例代码
all设置所有方向的空白EdgeInsets.all(8.0)
symmetric设置对称方向的空白,包括垂直和水平方向EdgeInsets.symmetric(vertical: 10.0, horizontal: 5.0)
fromLTRB分别设置左、上、右、下四个方向的空白EdgeInsets.fromLTRB(5.0, 10.0, 15.0, 20.0)
only设置某个方向的空白,其他方向默认为0EdgeInsets.only(left: 10.0)

all

all用于设置所有方向的空白,即左、上、右、下。例如,EdgeInsets.all(8.0)表示所有方向的空白都是8.0像素。

dartCopy code
Padding(
  padding: EdgeInsets.all(8.0),
  child: Text('全方向的空白'),
);

symmetric

symmetric用于设置对称方向的空白,可以分别设置垂直(vertical)和水平(horizontal)方向的空白。

Padding(
  padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: 5.0),
  child: Text('垂直和水平的空白'),
);

fromLTRB

fromLTRB用于分别设置左、上、右、下四个方向的空白,L代表Left,T代表Top,R代表Right,B代表Bottom。

Padding(
  padding: EdgeInsets.fromLTRB(5.0, 10.0, 15.0, 20.0),
  child: Text('各方向不同的空白'),
);

only

only用于设置某个方向的空白,其他方向默认为0。

Padding(
  padding: EdgeInsets.only(left: 10.0),
  child: Text('只有左边的空白'),
);

3. Padding的使用

以下是一个使用Padding的例子,其中使用了多种方式来设置padding属性:

import 'package:flutter/material.dart';

void main() {
  runApp(PaddingExample());
}

class PaddingExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Padding示例')),
        body: ListView(
          children: <Widget>[
            Container(
              color: Colors.grey[300],
              child: Padding(
                padding: EdgeInsets.all(20.0),
                child: Column(
                  children: [
                    Container(color: Colors.red, height: 50, width: double.infinity),
                    Text('EdgeInsets.all(20.0): 在所有方向添加20像素的填充'),
                  ],
                ),
              ),
            ),
            Container(
              color: Colors.grey[400],
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 40.0),
                child: Column(
                  children: [
                    Container(color: Colors.green, height: 50, width: double.infinity),
                    Text('EdgeInsets.symmetric(vertical: 20.0, horizontal: 40.0): 垂直方向添加20像素的填充,水平方向添加40像素的填充'),
                  ],
                ),
              ),
            ),
            Container(
              color: Colors.grey[500],
              child: Padding(
                padding: EdgeInsets.fromLTRB(60.0, 20.0, 40.0, 20.0),
                child: Column(
                  children: [
                    Container(color: Colors.blue, height: 50, width: double.infinity),
                    Text('EdgeInsets.fromLTRB(60.0, 20.0, 40.0, 20.0): 左边添加60像素的填充,上边和下边添加20像素的填充,右边添加40像素的填充'),
                  ],
                ),
              ),
            ),
            Container(
              color: Colors.grey[600],
              child: Padding(
                padding: EdgeInsets.only(left: 80.0),
                child: Column(
                  children: [
                    Container(color: Colors.yellow, height: 50, width: double.infinity),
                    Text('EdgeInsets.only(left: 80.0): 只在左边添加80像素的填充'),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

image.png

4. 使用Padding的注意事项

Padding小部件非常直观易用,但是在使用的时候还需要注意以下几点:

  • 当多个小部件嵌套使用Padding时,Padding值会叠加,所以需要注意不要造成过大的空白。
  • 如果需要设置某一方向的空白,可以使用EdgeInsets.only,其他方向默认为0,这样可以更加灵活地控制空白的大小。
  • 在Flutter中,类似的功能还有MarginMargin用于设置小部件与其相邻小部件之间的空白,而Padding则是设置小部件与其内部子小部件之间的空白。