Flutter 颤振中的多个复选框有3个值

Flutter 颤振中的多个复选框有3个值,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,Dart中的bool可以具有这些值中的任何一个 空的 真的 假的 我想要一个复选框,其工作原理如下: 第一次,我有bool值null,所以显示空框,然后我的值将是true或false,所以显示相应的小部件 创建此小部件(可从外部自定义): 我认为您可以通过单独使用\u checked来改进这一点,并去掉CheckStatus变量,或者反过来。它们当前表示的是完全相同的东西,并且是冗余的,因此容易出错并且代码很臭。小部件的好主意-我可以看出这可能会很有用。@Eiko我也这么认为,但后来我决定

Dart中的
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),
)