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