| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | import 'package:flutter_quill/flutter_quill.dart';import 'package:flutter_quill/models/documents/style.dart';import 'package:flutter/material.dart';import 'toolbar_icon_button.dart';class FlowyToggleStyleButton extends StatefulWidget {  final Attribute attribute;  final String normalIcon;  final double iconSize;  final QuillController controller;  final String tooltipText;  const FlowyToggleStyleButton({    required this.attribute,    required this.normalIcon,    required this.controller,    required this.tooltipText,    this.iconSize = defaultIconSize,    Key? key,  }) : super(key: key);  @override  _ToggleStyleButtonState createState() => _ToggleStyleButtonState();}class _ToggleStyleButtonState extends State<FlowyToggleStyleButton> {  bool? _isToggled;  Style get _selectionStyle => widget.controller.getSelectionStyle();  @override  void initState() {    super.initState();    _isToggled = _getIsToggled(_selectionStyle.attributes);    widget.controller.addListener(_didChangeEditingValue);  }  @override  Widget build(BuildContext context) {    return ToolbarIconButton(      onPressed: _toggleAttribute,      width: widget.iconSize * kIconButtonFactor,      isToggled: _isToggled ?? false,      iconName: widget.normalIcon,      tooltipText: widget.tooltipText,    );  }  @override  void didUpdateWidget(covariant FlowyToggleStyleButton oldWidget) {    super.didUpdateWidget(oldWidget);    if (oldWidget.controller != widget.controller) {      oldWidget.controller.removeListener(_didChangeEditingValue);      widget.controller.addListener(_didChangeEditingValue);      _isToggled = _getIsToggled(_selectionStyle.attributes);    }  }  @override  void dispose() {    widget.controller.removeListener(_didChangeEditingValue);    super.dispose();  }  void _didChangeEditingValue() {    setState(() => _isToggled = _getIsToggled(_selectionStyle.attributes));  }  bool _getIsToggled(Map<String, Attribute> attrs) {    if (widget.attribute.key == Attribute.list.key) {      final attribute = attrs[widget.attribute.key];      if (attribute == null) {        return false;      }      return attribute.value == widget.attribute.value;    }    return attrs.containsKey(widget.attribute.key);  }  void _toggleAttribute() {    widget.controller.formatSelection(_isToggled! ? Attribute.clone(widget.attribute, null) : widget.attribute);  }}
 |