check_button.dart 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'package:flutter_quill/flutter_quill.dart';
  2. import 'package:flutter_quill/models/documents/style.dart';
  3. import 'package:flutter/material.dart';
  4. import 'toolbar_icon_button.dart';
  5. class FlowyCheckListButton extends StatefulWidget {
  6. const FlowyCheckListButton({
  7. required this.controller,
  8. required this.attribute,
  9. required this.tooltipText,
  10. this.iconSize = defaultIconSize,
  11. this.fillColor,
  12. this.childBuilder = defaultToggleStyleButtonBuilder,
  13. Key? key,
  14. }) : super(key: key);
  15. final double iconSize;
  16. final Color? fillColor;
  17. final QuillController controller;
  18. final ToggleStyleButtonBuilder childBuilder;
  19. final Attribute attribute;
  20. final String tooltipText;
  21. @override
  22. FlowyCheckListButtonState createState() => FlowyCheckListButtonState();
  23. }
  24. class FlowyCheckListButtonState extends State<FlowyCheckListButton> {
  25. bool? _isToggled;
  26. Style get _selectionStyle => widget.controller.getSelectionStyle();
  27. void _didChangeEditingValue() {
  28. setState(() {
  29. _isToggled =
  30. _getIsToggled(widget.controller.getSelectionStyle().attributes);
  31. });
  32. }
  33. @override
  34. void initState() {
  35. super.initState();
  36. _isToggled = _getIsToggled(_selectionStyle.attributes);
  37. widget.controller.addListener(_didChangeEditingValue);
  38. }
  39. bool _getIsToggled(Map<String, Attribute> attrs) {
  40. if (widget.attribute.key == Attribute.list.key) {
  41. final attribute = attrs[widget.attribute.key];
  42. if (attribute == null) {
  43. return false;
  44. }
  45. return attribute.value == widget.attribute.value ||
  46. attribute.value == Attribute.checked.value;
  47. }
  48. return attrs.containsKey(widget.attribute.key);
  49. }
  50. @override
  51. void didUpdateWidget(covariant FlowyCheckListButton oldWidget) {
  52. super.didUpdateWidget(oldWidget);
  53. if (oldWidget.controller != widget.controller) {
  54. oldWidget.controller.removeListener(_didChangeEditingValue);
  55. widget.controller.addListener(_didChangeEditingValue);
  56. _isToggled = _getIsToggled(_selectionStyle.attributes);
  57. }
  58. }
  59. @override
  60. void dispose() {
  61. widget.controller.removeListener(_didChangeEditingValue);
  62. super.dispose();
  63. }
  64. @override
  65. Widget build(BuildContext context) {
  66. return ToolbarIconButton(
  67. onPressed: _toggleAttribute,
  68. width: widget.iconSize * kIconButtonFactor,
  69. iconName: 'editor/checkbox',
  70. isToggled: _isToggled ?? false,
  71. tooltipText: widget.tooltipText,
  72. );
  73. }
  74. void _toggleAttribute() {
  75. widget.controller.formatSelection(_isToggled!
  76. ? Attribute.clone(Attribute.unchecked, null)
  77. : Attribute.unchecked);
  78. }
  79. }