4.1 容器类Widget-Padding

原文在此,这里只为学习

容器类Widget和布局类Widget区别

  • 共同点
    容器类Widget和布局类Widget都作用于其子Widget,不同的是:

  • 异同点
    1 布局类widget一般都需要接收一个widget数组(children),他们直接或间接继承自(或包含)MultiChildRenderObjectWidget ;而容器类Widget一般只需要接受一个子Widget(child),他们直接或间接继承自(或包含)SingleChildRenderObjectWidget。
    2 布局类Widget是按照一定的排列方式来对其子widget进行排列;而容器类Widget一般只是包装其子Widget,对其添加一些修饰(补白或背景色等)、变换(旋转或剪裁等)、或限制(大小等)。

Padding

Padding给其子节点添加内边距

class Padding extends SingleChildRenderObjectWidget {
  ......
  const Padding({
    Key key,
    @required this.padding,
    Widget child,
  }) : assert(padding != null),
       super(key: key, child: child);
  ......
}

EdgeInsets

我们看看EdgeInsets提供的便捷方法:

  • fromLTRB(double left, double top, double right, double bottom):分别指定四个方向的补白。
  • all(double value) : 所有方向均使用相同数值的补白。
  • only({left, top, right ,bottom }):可以设置具体某个方向的补白(可以同时指定多个方向)。
  • symmetric({ vertical, horizontal }):用于设置对称方向的补白,vertical指top和bottom,horizontal指left和right。

示例:


import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
      
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatelessWidget{

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text("测试Padding"),
      ),
     
      body: Align(
        alignment: Alignment.centerLeft,
        child: PaddingTestRoute()
      ),
    );
  }
}

class PaddingTestRoute extends StatelessWidget{

    @override
    Widget build(BuildContext context){

      return Padding(
        padding: EdgeInsets.all(15.0),
        child: Column(
          
            mainAxisAlignment:MainAxisAlignment.start ,

            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(left: 8),
              
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.red,
                ),
              ),
              Container(
                  width: 100,
                  height: 100,
                  color: Colors.green,
                ),
            ],
        ),
      );
    }
}


其中:

    选用Align 为了方便定义alignment的起始位置
    如果用center则子Widget使用Column 即使设置了
    crossAxisAlignment: CrossAxisAlignment.start,
    也无法让Column从左侧开始布局
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 颜色: 1.color: 设置对象的文本颜色。无默认值。2.opacity:<number>默认值:1。设置对象...
    nothing_c阅读 433评论 0 0
  • 前言 本文的目的是为了让读者掌握不同布局类Widget的布局特点,分享一些在实际使用过程遇到的一些问题,在《Flu...
    xqqlv阅读 5,292评论 0 18
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,796评论 1 92
  • 在前面一篇文章中,我们分析了Android应用程序窗口的绘图表面的创建过程。Android应用程序窗口的绘图表面在...
    一个不掉头发的开发阅读 4,638评论 0 14
  • 时间过得非常快,再过几个小时就过年了,现在和大家说声新年快乐! 天气温度挺高的,我还是觉得有点冷,最近总...
    林清彧阅读 180评论 0 1