Flutter 颤振中的多个复选框有3个值
Dart中的Flutter 颤振中的多个复选框有3个值,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,Dart中的bool可以具有这些值中的任何一个 空的 真的 假的 我想要一个复选框,其工作原理如下: 第一次,我有bool值null,所以显示空框,然后我的值将是true或false,所以显示相应的小部件 创建此小部件(可从外部自定义): 我认为您可以通过单独使用\u checked来改进这一点,并去掉CheckStatus变量,或者反过来。它们当前表示的是完全相同的东西,并且是冗余的,因此容易出错并且代码很臭。小部件的好主意-我可以看出这可能会很有用。@Eiko我也这么认为,但后来我决定
bool
可以具有这些值中的任何一个
- 空的
- 真的
- 假的
复选框
,其工作原理如下:
第一次,我有bool
值null
,所以显示空框,然后我的值将是true
或false
,所以显示相应的小部件 创建此小部件(可从外部自定义):
我认为您可以通过单独使用
\u checked
来改进这一点,并去掉CheckStatus
变量,或者反过来。它们当前表示的是完全相同的东西,并且是冗余的,因此容易出错并且代码很臭。小部件的好主意-我可以看出这可能会很有用。@Eiko我也这么认为,但后来我决定添加enum
,甚至使MyCheckbox
在将来可维护,当你尝试添加更多内容时,否则你必须使用\u value==null?否则,请执行此操作!你应该这样做。
class MyCheckbox extends StatefulWidget {
final bool value;
final ValueChanged<bool> onChanged;
final Color checkedIconColor;
final Color checkedFillColor;
final IconData checkedIcon;
final Color uncheckedIconColor;
final Color uncheckedFillColor;
final IconData uncheckedIcon;
const MyCheckbox({
Key key,
@required this.value,
@required this.onChanged,
this.checkedIconColor = Colors.white,
this.checkedFillColor = Colors.teal,
this.checkedIcon = Icons.check,
this.uncheckedIconColor = Colors.white,
this.uncheckedFillColor = Colors.red,
this.uncheckedIcon = Icons.close,
}) : super(key: key);
@override
_MyCheckboxState createState() => _MyCheckboxState();
}
class _MyCheckboxState extends State<MyCheckbox> {
bool _checked;
CheckStatus _status;
@override
void initState() {
super.initState();
_init();
}
@override
void didUpdateWidget(MyCheckbox oldWidget) {
super.didUpdateWidget(oldWidget);
_init();
}
void _init() {
_checked = widget.value;
if (_checked == null) {
_status = CheckStatus.empty;
} else if (_checked) {
_status = CheckStatus.checked;
} else {
_status = CheckStatus.unchecked;
}
}
Widget _buildIcon() {
Color fillColor;
Color iconColor;
IconData iconData;
switch (_status) {
case CheckStatus.empty:
break;
case CheckStatus.checked:
fillColor = widget.checkedFillColor;
iconColor = widget.checkedIconColor;
iconData = widget.checkedIcon;
break;
case CheckStatus.unchecked:
fillColor = widget.uncheckedFillColor;
iconColor = widget.uncheckedIconColor;
iconData = widget.uncheckedIcon;
break;
}
return Container(
decoration: BoxDecoration(
color: fillColor,
border: Border.all(color: Colors.grey, width: 2),
),
child: Icon(iconData, color: iconColor),
);
}
@override
Widget build(BuildContext context) {
return IconButton(
icon: _buildIcon(),
onPressed: () => widget.onChanged(_checked == null ? true : !_checked),
);
}
}
enum CheckStatus {
empty,
checked,
unchecked,
}
bool _value;
MyCheckbox(
value: _value,
onChanged: (value) => setState(() => _value = value),
)