Checkbox 如何在颤振中创建圆形复选框?或者更改复选框';s样式,例如在颤振中选择的图像?

Checkbox 如何在颤振中创建圆形复选框?或者更改复选框';s样式,例如在颤振中选择的图像?,checkbox,flutter,Checkbox,Flutter,我想创建一个像这样的圆形复选框 我尝试过多种不同的方法,但似乎都不管用。包括我尝试使用ClipRRect 因为有更多的代码,我只选择其中的一部分显示在这里 new Row( children: <Widget>[ //new ClipRRect( // borderRadius: BorderRadius.all(Radius.circular(90.0)), // child: new Checkb

我想创建一个像这样的圆形复选框

我尝试过多种不同的方法,但似乎都不管用。包括我尝试使用ClipRRect

因为有更多的代码,我只选择其中的一部分显示在这里

new Row(
      children: <Widget>[
        //new ClipRRect(
        // borderRadius: BorderRadius.all(Radius.circular(90.0)),
        //  child:
          new Checkbox(
              tristate: true,
              value: true,
              onChanged: (bool newValue){
                setState(() {

                });
              },
            activeColor: Color(0xff06bbfb),
          ),
       // ),

        new Expanded(
            child: new Text('将此手机号码和QQ号绑定,提高账号安全性。',
              style: new TextStyle(
                  color: Color(0xff797979)
              ),
            )
        ),

      ],
    ),
新行(
儿童:[
//新ClipRRect(
//borderRadius:borderRadius.all(半径圆形(90.0)),
//儿童:
新复选框(
三态:对,
价值观:正确,
一旦更改:(bool newValue){
设置状态(){
});
},
activeColor:Color(0xff06bbfb),
),
// ),
新扩展(
子:新文本('将此手机号码和QQ号绑定,提高账号安全性。',
样式:新文本样式(
颜色:颜色(0xFF7979)
),
)
),
],
),

我是新手,先谢谢你

为什么要用
ClipRect
使它复杂化?只需使用官方密码。

您可以尝试使用以下代码:圆形复选框

 bool _value = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Circle CheckBox"),
      ),
      body: Center(
          child: InkWell(
        onTap: () {
          setState(() {
            _value = !_value;
          });
        },
        child: Container(
          decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.blue),
          child: Padding(
            padding: const EdgeInsets.all(10.0),
            child: _value
                ? Icon(
                    Icons.check,
                    size: 30.0,
                    color: Colors.white,
                  )
                : Icon(
                    Icons.check_box_outline_blank,
                    size: 30.0,
                    color: Colors.blue,
                  ),
          ),
        ),
      )),
    );
  }
试试这个:

import 'package:flutter/material.dart';

class CircleCheckbox extends StatelessWidget {
  final bool value;
  final ValueChanged<bool> onChanged;
  final Color activeColor;
  final Color checkColor;
  final bool tristate;
  final MaterialTapTargetSize materialTapTargetSize;

  CircleCheckbox({
    Key key,
    @required this.value,
    this.tristate = false,
    @required this.onChanged,
    this.activeColor,
    this.checkColor,
    this.materialTapTargetSize,
  })  : assert(tristate != null),
        assert(tristate || value != null),
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return ClipOval(
      child: SizedBox(
        width: Checkbox.width,
        height: Checkbox.width,
        child: Container(
          decoration: new BoxDecoration(
            border: Border.all(
                width: 2,
                color: Theme.of(context).unselectedWidgetColor ??
                    Theme.of(context).disabledColor),
            borderRadius: new BorderRadius.circular(100),
          ),
          child: Checkbox(
            value: value,
            tristate: tristate,
            onChanged: onChanged,
            activeColor: activeColor,
            checkColor: checkColor,
            materialTapTargetSize: materialTapTargetSize,
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类CircleCheckbox扩展了无状态小部件{
最终布尔值;
变更后的最终价值;
最终颜色-活性色;
最终颜色检查颜色;
最终布尔三态;
最终材料目标尺寸材料目标尺寸;
圆环盒({
关键点,
@需要这个值,
this.tristate=false,
@需要这个。一旦更改,
这个.activeColor,
这个,格子色,
此.materialTarget大小,
}):assert(三态!=null),
断言(三态| |值!=null),
超级(键:键);
@凌驾
小部件构建(构建上下文){
返回斜坡(
孩子:大小盒子(
宽度:Checkbox.width,
高度:复选框。宽度,
子:容器(
装饰:新盒子装饰(
边界:边界(
宽度:2,
颜色:主题.of(上下文).未选择WidgetColor??
主题.of(上下文).disabledColor),
边界半径:新边界半径。圆形(100),
),
子项:复选框(
价值:价值,
三态:三态,
一旦改变:一旦改变,
activeColor:activeColor,
checkColor:checkColor,
MaterialTargetSize:MaterialTargetSize,
),
),
),
);
}
}

复制材质复选框的代码并创建新的复选框小部件

在此小部件中,将变量
const Radius\u kEdgeRadius=Radius.circular(1.0)
更改为
Radius.circular(100)


请注意:此软件包已停止使用

您可以添加一个简单的包,该包保留复选框的功能和动画:

安装和导入包后的实现:

CircularCheckBox(
          value: someBooleanValue,
          materialTapTargetSize: MaterialTapTargetSize.padded,
          onChanged: (bool x) {
          someBooleanValue = !someBooleanValue;
          }
        ),

我花了很长时间来构建它,并提出了这个解决方案。我以为有一天像我这样的人会需要它。就是这样

ClipRRect(
      clipBehavior: Clip.hardEdge,
      borderRadius: BorderRadius.all(Radius.circular(5)),
      child: SizedBox(
        width: Checkbox.width,
        height: Checkbox.width,
        child: Container(
          decoration: new BoxDecoration(
            border: Border.all(
              width: 1,
            ),
            borderRadius: new BorderRadius.circular(5),
          ),
          child: Theme(
            data: ThemeData(
              unselectedWidgetColor: Colors.transparent,
            ),
            child: Checkbox(
              value: isWinnerTakesAll,
              onChanged: (state) =>
                  setState(() => isWinnerTakesAll = !isWinnerTakesAll),
              activeColor: Colors.transparent,
              checkColor: CommonColors.checkBoxColor,
              materialTapTargetSize: MaterialTapTargetSize.padded,
            ),
          ),
        ),
      ),
    ),
InkWell(
    onTap: () {
        setState(() {
            selected = !selected;
        });
    },
    child: Container(
        height: 28,
        width: 28,
        decoration: BoxDecoration(
            shape: BoxShape.circle, color: selected ? Colors.green : Colors.white,
            border: Border.all(width: 2, color: Colors.green)
        ),
        child: Padding(
            padding: const EdgeInsets.all(3.0),
            child: selected ? Icon(
                Icons.check,
                size: 18.0,
                color: Colors.white,
            ) : Container()
        ),
    ),
),
我希望这能解决你的问题!欢迎提出任何问题

使用主题小部件的原因
在没有主题小部件的情况下,复选框的原始方形框处于未选中状态,我通过使其透明将其删除。

我们只能使用材质图标来实现此目的,如下所示:

Container(
        decoration: BoxDecoration(
            border: Border.all(
              color: (checkedValue) ? Colors.red : Colors.blue,
              width: 1,
            ),
            borderRadius: BorderRadius.all(
              Radius.circular(5),
            )),
        width: 24,
        height: 24,
        child: Theme(
          data: ThemeData(
            unselectedWidgetColor: Colors.transparent,
          ),
          child: Checkbox(
            activeColor: Colors.transparent,
            checkColor: Colors.red,
            value: checkedValue,
            tristate: false,
            onChanged: (bool isChecked) {
              setState(() {
                checkedValue = isChecked;
              });
            },
          ),
        ),
      ),
bool checkboxValue = false;

Row(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
        GestureDetector(
        onTap: () {
            setState(() {
            checkboxValue = !checkboxValue;
            });
        },
        child: checkboxValue
            ? Icon(
                Icons.radio_button_checked,
                color: Colors.blue,
                size: 20,
                )
            : Icon(
                Icons.radio_button_unchecked,
                color: Colors.grey,
                size: 20,
                ),
        ),
        SizedBox(width: 5),
        Text("Accept Terms and Conditions"),
    ],
),

我花了很长时间来构建它,并提出了这个解决方案。我以为有一天像我这样的人会需要它。就是这样

ClipRRect(
      clipBehavior: Clip.hardEdge,
      borderRadius: BorderRadius.all(Radius.circular(5)),
      child: SizedBox(
        width: Checkbox.width,
        height: Checkbox.width,
        child: Container(
          decoration: new BoxDecoration(
            border: Border.all(
              width: 1,
            ),
            borderRadius: new BorderRadius.circular(5),
          ),
          child: Theme(
            data: ThemeData(
              unselectedWidgetColor: Colors.transparent,
            ),
            child: Checkbox(
              value: isWinnerTakesAll,
              onChanged: (state) =>
                  setState(() => isWinnerTakesAll = !isWinnerTakesAll),
              activeColor: Colors.transparent,
              checkColor: CommonColors.checkBoxColor,
              materialTapTargetSize: MaterialTapTargetSize.padded,
            ),
          ),
        ),
      ),
    ),
InkWell(
    onTap: () {
        setState(() {
            selected = !selected;
        });
    },
    child: Container(
        height: 28,
        width: 28,
        decoration: BoxDecoration(
            shape: BoxShape.circle, color: selected ? Colors.green : Colors.white,
            border: Border.all(width: 2, color: Colors.green)
        ),
        child: Padding(
            padding: const EdgeInsets.all(3.0),
            child: selected ? Icon(
                Icons.check,
                size: 18.0,
                color: Colors.white,
            ) : Container()
        ),
    ),
),

您可以简单地设置复选框的形状,如下所示

复选框(
形状:圆形矩形边框(
边界半径:边界半径。圆形(15)),
})

颤振2.2.0以来,在中引入了形状特性

将圆角添加到复选框的示例:

Checkbox(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(10)),
)

“材质设计”复选框有一个形状属性,您可以将CircleBorder()设置为该属性,它将是圆形的

Checkbox(
      checkColor: Colors.white,
      fillColor: MaterialStateProperty.resolveWith(getColor),
      value: isChecked,
      shape: CircleBorder(),
      onChanged: (bool? value) {
        setState(() {
          isChecked = value!;
        });
      },
    );

添加了颤振2.2.1形状属性。所以它很容易添加改变形状的复选框

在这里,我创建了一个循环复选框小部件:

import 'package:flutter/material.dart';

class CircularCheckbox extends StatelessWidget {
  final bool? value;
  final ValueChanged<bool?>? onChanged;
  const CircularCheckbox({Key? key, required this.value, required this.onChanged}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Transform.scale(
      scale: 1.3,
      child: Checkbox(
        value: value,
        onChanged: onChanged,
      ),
    );
  }
}
通过应用主题,您有一个很好的循环复选框:

Checkbox(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(10)),
)

是的,但事实上,我想保留复选框的原始动画效果。当然,我以前没有表达过这个意思。有没有其他方法可以保留复选框的原始动画?您的示例没有实现可访问性,不应该在生产应用程序中使用。如果有人需要现有的,只需复制它或将其添加为插件即可。我不是作者,但我发现如果你直接复制的话,工作量会多一点。这应该作为一个属性公开。很好的解决方案,很好,但是没有动画。但解决这个问题也很容易,使用AnimatedContainer而不是Container,具有颜色和持续时间。颤振将使它工作得很好这个解决方案工作得很好。但是添加AnimatedContainer并不能提供预期的动画。因为复选框正在处理点击。用最简单的方法回答最好!哪个版本的复选框中有shape属性?我正在使用dev频道,请参见下面的
flatter-doctor-v
输出
[✓] 颤振(Channel dev,2.1.0-12.1.pre,Linux上,locale en_US.UTF-8)•颤振版本2.1.0-12.1.pre在/home/../snap/flifter/common/flifter•框架版本8264cb3e8a(2周前),2021-03-10 12:37:57-0800•引擎版本711ab3fda0•Dart版本2.13.0(build 2.13.0-116.0.dev)
这是最简单的方法,谢谢!