Card

一、源码解读

/// 生成一个圆角卡片并带有阴影
/// 常用于,电话、地理位置、卡片等
class Card extends StatelessWidget {
  const Card({
    Key? key,
    this.color, 
    this.shadowColor, 
    this.elevation, 
    this.shape,
    this.borderOnForeground = true,
    this.margin,
    this.clipBehavior,
    this.child,
    this.semanticContainer = true,
  }) : assert(elevation == null || elevation >= 0.0),
       assert(borderOnForeground != null),
       super(key: key);

  /// 卡片背景色
  final Color? color;

  /// 卡片的阴影色
  final Color? shadowColor;

  /// Z 坐标控制阴影大小
  final double? elevation;

  /// 设置卡片的样式,默认圆角为 4
  /// RoundedRectangleBorder 圆角矩形的矩形边框
  /// BeveledRectangleBorder   有倾斜面的矩形边框
  /// ContinuousRectangleBorder  连续的矩形边框  
  /// CircleBorder 圆角边框
  final ShapeBorder? shape;

  ///  设置边框在子组件的位置
  ///  true: 边框在前;否则反之
  final bool borderOnForeground;

  /// 剪辑小部件的方法
  /// none: 没有裁剪
  /// hardEdge: 裁剪,但不抗锯齿
  /// antiAlias: 带抗锯齿裁剪
  /// antiAliasWithSaveLayer: 在剪辑之后立即使用抗锯齿和 saveLayer 剪辑
  final Clip? clipBehavior;

  ///  卡片周围的空白区域,默认 4 .
  final EdgeInsetsGeometry? margin;

  /// 将所有的语义标签汇聚到此小部件
  final bool semanticContainer;

  /// 卡片组件的子组件
  final Widget? child;
  
  /// 控制阴影 z 轴大小,参数默认值
  static const double _defaultElevation = 1.0;

  @override
  Widget build(BuildContext context) {
    /// 获取主题
    final ThemeData theme = Theme.of(context);
    /// 获取卡片主题
    final CardTheme cardTheme = CardTheme.of(context);
    /// 创建语义注释
    return Semantics(
      // 是否集合语义标签
      container: semanticContainer,
      child: Container(
        // 卡片外空白,如果 margin 没有值,则使用卡片主题的 margin ,如果卡片主题的 margin 也不存在,则默认为 4 的边距
        margin: margin ?? cardTheme.margin ?? const EdgeInsets.all(4.0),
        child: Material(
          // 卡片类型
          type: MaterialType.card, 
          // 阴影颜色,如果没有,则使用卡片主题的阴影颜色;如果卡片主题阴影颜色也没有,则使用系统主题阴影色
          shadowColor: shadowColor ?? cardTheme.shadowColor ?? theme.shadowColor,
          // 背景颜色,如果没有,则使用卡片主题的背景颜色;如果卡片主题背景颜色也没有,则使用系统主题背景色
          color: color ?? cardTheme.color ?? theme.cardColor,
          // 卡片 Z 轴阴影大小
          elevation: elevation ?? cardTheme.elevation ?? _defaultElevation,
          // 卡片的形状,如果没设置,就取卡片主题的形状;如果卡片主题形状也没设置,则使用默认为 4 的圆角矩形形状
          shape: shape ?? cardTheme.shape ?? const RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(4.0)),
          ),
          // 控制形状是在子组件前还是在后,默认在前(true)
          borderOnForeground: borderOnForeground,
          // 卡片的裁剪模式,如果没有设置,就取卡片主题的裁剪模式;如果卡片主题裁剪样式没有设置,则使用不做任何裁剪
          clipBehavior: clipBehavior ?? cardTheme.clipBehavior ?? Clip.none,
          child: Semantics(
            /// 是否允许该widget的后代向该widget注解的[SemanticsNode]添加语义信息。
            explicitChildNodes: !semanticContainer,
            child: child,
          ),
        ),
      ),
    );
  }
}

二、总结

  • Card 是继承于 StatelessWidget
  • Card 样式设置,首先获取当前的设置,如果当前没有设置,则获取卡片主题的样式;如果卡片主题的样式也没设置,则使用默认的或者系统的样式
  • Card的层级是: Semantics -> Container -> Material -> Semantics -> child

三、实例

Card(
  elevation: 1,
  shape: RoundedRectangleBorder(
    side: BorderSide(
      color: Colors.green,
      width: 3,
    ),
  ),
  borderOnForeground: false,
  clipBehavior: Clip.antiAlias,
  margin: EdgeInsets.all(20),
  shadowColor: Colors.green,
  child: Padding(
    padding: const EdgeInsets.all(20.0),
    child: Text('Card  测试'),
  ),
)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容