Flutter 自定义单选按钮和自定义复选框

Flutter 自定义单选按钮和自定义复选框


前言

在日常开发中,很多时候系统自带的单选按钮,复选框无法满足我们的需求,那么就需要自定义样式的按钮,本篇文章将记录如何自定义单选按钮,复选框。


一、自定义单选按钮

  1. 在自定义单选按钮之前,我们先初始化数据
  List radioList = [
    {"title": "单选1", "isSelect": false},
    {"title": "单选2", "isSelect": false},
    {"title": "单选3", "isSelect": false},
    {"title": "单选4", "isSelect": false},
  ];

  1. 开始布局,我这里使用List.generate 自动循环生成组件
  static Widget bodyWidget(HomePageViewModel model) {
    return Padding(
      padding: const EdgeInsets.all(30),
      child: Column(
        children: List<Widget>.generate(model.radioList.length,
            (index) => radioWidget(model.radioList[index], index, model)),
      ),
    );
  }
  1. 单选按钮的样式属性,并且在每次触发点击事件的时候,使用循环遍历的方式,将状态初始化成未选中,再根据当前选中的下标index 实现按钮选中功能。
  static Widget radioWidget(item, int index, HomePageViewModel model) {
    return GestureDetector(
      onTap: () {
        for (var radio in model.radioList) {
          radio["isSelect"] = false;
        }
        model.radioList[index]["isSelect"] = true;
        model.notifyListeners();
      },
      child: Row(
        children: [
          Container(
            width: 30,
            height: 30,
            alignment: Alignment.center,
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.all(
                Radius.circular(15),
              ),
              border: Border.all(
                width: 1,
                color: Colors.grey.shade300,
              ),
            ),
            child: Container(
              width: 15,
              height: 15,
              decoration: BoxDecoration(
                color: item["isSelect"] ? Colors.green : Colors.transparent,
                borderRadius: BorderRadius.all(
                  Radius.circular(7.5),
                ),
              ),
            ),
          ),
          const SizedBox(
            width: 10,
          ),
          Text(item["title"]),
        ],
      ),
    );
  }

接下来我们来看一下运行效果:

在这里插入图片描述

二、自定义复选框

关于复选框,还是单选框,其实最主要的不同就是,在选择之后,数据的操作,我们修改上面单选按钮中点击事件中的代码

        model.radioList[index]["isSelect"] = !item["isSelect"];
        model.notifyListeners();

改动很简单,不多赘述,看一下完整代码

  static Widget checkWidget(item, int index, HomePageViewModel model) {
    return GestureDetector(
      onTap: () {
        model.radioList[index]["isSelect"] = !item["isSelect"];
        model.notifyListeners();
      },
      child: Row(
        children: [
          Container(
            width: 30,
            height: 30,
            alignment: Alignment.center,
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.all(
                Radius.circular(6),
              ),
              border: Border.all(
                width: 1,
                color: Colors.grey.shade300,
              ),
            ),
            child: item["isSelect"]
                ? Icon(
                    Icons.call_missed_outgoing_rounded,
                    color: Colors.red,
                    size: 24,
                  )
                : Container(),
          ),
          const SizedBox(
            width: 10,
          ),
          Text(item["title"]),
        ],
      ),
    );
  }

运行效果:

在这里插入图片描述


总结

本篇文章的记录就到这里了,很多时候我们不知道,在一门语言中的单选或者复选框的自定义样式该怎么做,只是我们的思路的没有转变过来,其实重要的不是样式,而是数据的改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半身风雪

感谢打赏,你的鼓励,是我创作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值