toggle_button.dart 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 FlowyToggleStyleButton extends StatefulWidget {
  6. final Attribute attribute;
  7. final String normalIcon;
  8. final double iconSize;
  9. final QuillController controller;
  10. final String tooltipText;
  11. const FlowyToggleStyleButton({
  12. required this.attribute,
  13. required this.normalIcon,
  14. required this.controller,
  15. required this.tooltipText,
  16. this.iconSize = defaultIconSize,
  17. Key? key,
  18. }) : super(key: key);
  19. @override
  20. ToggleStyleButtonState createState() => ToggleStyleButtonState();
  21. }
  22. class ToggleStyleButtonState extends State<FlowyToggleStyleButton> {
  23. bool? _isToggled;
  24. Style get _selectionStyle => widget.controller.getSelectionStyle();
  25. @override
  26. void initState() {
  27. super.initState();
  28. _isToggled = _getIsToggled(_selectionStyle.attributes);
  29. widget.controller.addListener(_didChangeEditingValue);
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return ToolbarIconButton(
  34. onPressed: _toggleAttribute,
  35. width: widget.iconSize * kIconButtonFactor,
  36. isToggled: _isToggled ?? false,
  37. iconName: widget.normalIcon,
  38. tooltipText: widget.tooltipText,
  39. );
  40. }
  41. @override
  42. void didUpdateWidget(covariant FlowyToggleStyleButton oldWidget) {
  43. super.didUpdateWidget(oldWidget);
  44. if (oldWidget.controller != widget.controller) {
  45. oldWidget.controller.removeListener(_didChangeEditingValue);
  46. widget.controller.addListener(_didChangeEditingValue);
  47. _isToggled = _getIsToggled(_selectionStyle.attributes);
  48. }
  49. }
  50. @override
  51. void dispose() {
  52. widget.controller.removeListener(_didChangeEditingValue);
  53. super.dispose();
  54. }
  55. void _didChangeEditingValue() {
  56. setState(() => _isToggled = _getIsToggled(_selectionStyle.attributes));
  57. }
  58. bool _getIsToggled(Map<String, Attribute> attrs) {
  59. if (widget.attribute.key == Attribute.list.key) {
  60. final attribute = attrs[widget.attribute.key];
  61. if (attribute == null) {
  62. return false;
  63. }
  64. return attribute.value == widget.attribute.value;
  65. }
  66. return attrs.containsKey(widget.attribute.key);
  67. }
  68. void _toggleAttribute() {
  69. widget.controller.formatSelection(_isToggled!
  70. ? Attribute.clone(widget.attribute, null)
  71. : widget.attribute);
  72. }
  73. }