flutter 按钮封装 带图片的按钮,带边框的按钮,纯文字的按钮

在项目中使用的时候,发现系统按钮并不符合我的需求,所以我把常用的按钮,按照我自己的理解,封装了一个! 供大家参考,如果有建议,可以评论提出! 十分感谢!

只有文字的button

/*
 *只有文字的button
 */

class XXTextButton extends StatelessWidget {
  const XXTextButton({
    Key key,
    this.onTap,
    this.textColor,
    this.title,
    this.width,
    this.height,
    this.backColor = Colors.transparent,
    this.fontsize = 15.0,
    this.borderColor = Colors.transparent,
    this.circular = 0.0,
    this.padding,
    this.borderWidth,
  }) : super(key: key);
  final onTap;
  final width; //整体宽
  final height; //整体高
  final backColor; //背景颜色
  final circular; //弧度
  final double borderWidth;
  final Color borderColor;
  final Color textColor;
  final String title;
  final double fontsize;
  final EdgeInsetsGeometry padding;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        padding: padding,
        decoration: BoxDecoration(
          color: backColor,
          border: Border.all(width: 1, color: borderColor),
          borderRadius: BorderRadius.circular(circular),
        ),
        child: Text(
          title,
          style: TextStyle(
            fontSize: ScreenAdapt.sizeX2(fontsize),
            color: textColor,
            fontWeight: FontWeight.normal,
          ),
        ),
      ),
    );
  }
}

点击带边框按钮

/*
 *点击带边框按钮
 */
class XXClickLineBtn extends StatelessWidget {
  const XXClickLineBtn(
      {Key key,
      this.color,
      this.title,
      this.onTap,
      this.circular,
      this.width,
      this.backColor,
      this.height})
      : super(key: key);

  final Color color; //颜色
  final String title; //文字
  final onTap; //点击方法
  final circular; //弧度
  final width; //整体宽
  final backColor; //背景颜色
  final height; //整体高

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        alignment: Alignment.center,
        width: width,
        height: height,
        child: Text(
          title,
          style: TextStyle(
            fontSize: ScreenAdapt.size(24),
            color: color,
          ),
        ),
        decoration: BoxDecoration(
          color: backColor,
          border: Border.all(width: 1, color: color),
          borderRadius: BorderRadius.circular(circular),
        ),
      ),
    );
  }
}

图片的点击按钮 iconBtn

/*
 *图片的点击按钮  iconBtn
 */
class XXMyIconBtn extends StatelessWidget {
  const XXMyIconBtn({
    Key key,
    this.iconSting,
    this.onPressed,
    this.width,
    this.height,
  }) : super(key: key);

  final iconSting; //图片的地址
  final onPressed; //执行的方法
  final width; //宽
  final height; //高

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onPressed,
      child: Container(
        width: width,
        height: height,
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage(iconSting),
            fit: BoxFit.fill,
          ),
        ),
      ),
    );
  }
}

图片 + 文字按钮 icon在左 tiitle在右

/*
 *图片 + 文字按钮  icon在左 tiitle在右
 */

class XXClickImageAndTitleBtn extends StatelessWidget {
  const XXClickImageAndTitleBtn(
      {Key key,
      this.image,
      this.imageSize,
      this.title,
      this.padding,
      this.fontSize,
      this.textColor,
      this.onTap})
      : super(key: key);
  final Widget image; //image
  final Size imageSize; //image的宽高
  final String title; //文字
  final double padding; //图片和文字之间的间距
  final double fontSize; //文字的大小
  final Color textColor; //文字的颜色
  final onTap; //执行的方法
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        // width: ScreenAdapt.widthX2(widget.width),
        // height: ScreenAdapt.widthX2(widget.height),
        alignment: Alignment.center,
        child: Row(
          children: [
            Container(
              width: ScreenAdapt.widthX2(imageSize.width),
              height: ScreenAdapt.heightX2(imageSize.height),
              child: image,
            ),
            SizedBox(
              width: ScreenAdapt.heightX2(padding),
            ),
            Container(
              child: Text(
                title,
                style: TextStyle(
                  fontSize: ScreenAdapt.sizeX2(fontSize),
                  color: textColor,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

图片 + 文字按钮 icon在上 文字在下

/*
 * iconbutton  icon在上  文字在下
 */
class ExamIndexIconButton extends StatelessWidget {
  const ExamIndexIconButton({Key key, this.action, this.icon, this.title})
      : super(key: key);
  final action;
  final String icon;
  final String title;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: Container(
        color: Colors.white.withAlpha(0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Container(
              width: ScreenAdapt.widthX2(30),
              height: ScreenAdapt.widthX2(30),
              // color: Colors.green,
              child: Image.asset(
                icon,
                fit: BoxFit.fill,
              ),
            ),
            Container(
              padding: EdgeInsets.only(top: 12, bottom: 12),
              child: Text(
                title,
                style: TextStyle(
                  fontSize: ScreenAdapt.size(28),
                  color: Color(0xFF3B3B3B),
                ),
              ),
            ),
          ],
        ),
      ),
      onTap: action,
    );
  }
}

图片 + 文字按钮 tiitle在左 icon在右

/*
*图片 + 文字按钮 tiitle在左 icon在右
*/

class XXClickTitleAndImageBtn extends StatelessWidget {
 const XXClickTitleAndImageBtn(
     {Key key,
     this.image,
     this.imageSize,
     this.title,
     this.padding = 0,
     this.fontSize,
     this.textColor,
     this.onTap})
     : super(key: key);
 final Widget image; //image
 final Size imageSize; //image的宽高
 final String title; //文字
 final double padding; //图片和文字之间的间距
 final double fontSize; //文字的大小
 final Color textColor; //文字的颜色
 final onTap; //执行的方法
 @override
 Widget build(BuildContext context) {
   return GestureDetector(
     onTap: onTap,
     child: Container(
       // width: ScreenAdapt.widthX2(widget.width),
       // height: ScreenAdapt.widthX2(widget.height),
       alignment: Alignment.center,
       child: Row(
         children: [
           Container(
             child: Text(
               title,
               style: TextStyle(
                 fontSize: ScreenAdapt.sizeX2(fontSize),
                 color: textColor,
               ),
             ),
           ),
           SizedBox(
             width: ScreenAdapt.heightX2(padding),
           ),
           Container(
             width: ScreenAdapt.widthX2(imageSize.width),
             height: ScreenAdapt.heightX2(imageSize.height),
             child: image,
           ),
         ],
       ),
     ),
   );
 }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,527评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,687评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,640评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,957评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,682评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,011评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,009评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,183评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,714评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,435评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,665评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,148评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,838评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,251评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,588评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,379评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,627评论 2 380