|
|
@ -6,28 +6,28 @@ import 'package:flutter_quill/widgets/editor.dart'; |
|
|
|
|
|
|
|
|
|
|
|
class QuillField extends StatefulWidget { |
|
|
|
class QuillField extends StatefulWidget { |
|
|
|
final QuillController controller; |
|
|
|
final QuillController controller; |
|
|
|
final FocusNode focusNode; |
|
|
|
final FocusNode? focusNode; |
|
|
|
final ScrollController scrollController; |
|
|
|
final ScrollController? scrollController; |
|
|
|
final bool scrollable; |
|
|
|
final bool scrollable; |
|
|
|
final EdgeInsetsGeometry padding; |
|
|
|
final EdgeInsetsGeometry padding; |
|
|
|
final bool autofocus; |
|
|
|
final bool autofocus; |
|
|
|
final bool showCursor; |
|
|
|
final bool showCursor; |
|
|
|
final bool readOnly; |
|
|
|
final bool readOnly; |
|
|
|
final bool enableInteractiveSelection; |
|
|
|
final bool enableInteractiveSelection; |
|
|
|
final double minHeight; |
|
|
|
final double? minHeight; |
|
|
|
final double maxHeight; |
|
|
|
final double? maxHeight; |
|
|
|
final bool expands; |
|
|
|
final bool expands; |
|
|
|
final TextCapitalization textCapitalization; |
|
|
|
final TextCapitalization textCapitalization; |
|
|
|
final Brightness keyboardAppearance; |
|
|
|
final Brightness keyboardAppearance; |
|
|
|
final ScrollPhysics scrollPhysics; |
|
|
|
final ScrollPhysics? scrollPhysics; |
|
|
|
final ValueChanged<String> onLaunchUrl; |
|
|
|
final ValueChanged<String>? onLaunchUrl; |
|
|
|
final InputDecoration decoration; |
|
|
|
final InputDecoration? decoration; |
|
|
|
final Widget toolbar; |
|
|
|
final Widget? toolbar; |
|
|
|
final EmbedBuilder embedBuilder; |
|
|
|
final EmbedBuilder? embedBuilder; |
|
|
|
|
|
|
|
|
|
|
|
QuillField({ |
|
|
|
QuillField({ |
|
|
|
Key key, |
|
|
|
Key? key, |
|
|
|
@required this.controller, |
|
|
|
required this.controller, |
|
|
|
this.focusNode, |
|
|
|
this.focusNode, |
|
|
|
this.scrollController, |
|
|
|
this.scrollController, |
|
|
|
this.scrollable = true, |
|
|
|
this.scrollable = true, |
|
|
@ -53,28 +53,28 @@ class QuillField extends StatefulWidget { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
class _QuillFieldState extends State<QuillField> { |
|
|
|
class _QuillFieldState extends State<QuillField> { |
|
|
|
bool _focused; |
|
|
|
late bool _focused; |
|
|
|
|
|
|
|
|
|
|
|
void _editorFocusChanged() { |
|
|
|
void _editorFocusChanged() { |
|
|
|
setState(() { |
|
|
|
setState(() { |
|
|
|
_focused = widget.focusNode.hasFocus; |
|
|
|
_focused = widget.focusNode!.hasFocus; |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
@override |
|
|
|
void initState() { |
|
|
|
void initState() { |
|
|
|
super.initState(); |
|
|
|
super.initState(); |
|
|
|
_focused = widget.focusNode.hasFocus; |
|
|
|
_focused = widget.focusNode!.hasFocus; |
|
|
|
widget.focusNode.addListener(_editorFocusChanged); |
|
|
|
widget.focusNode!.addListener(_editorFocusChanged); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
@override |
|
|
|
void didUpdateWidget(covariant QuillField oldWidget) { |
|
|
|
void didUpdateWidget(covariant QuillField oldWidget) { |
|
|
|
super.didUpdateWidget(oldWidget); |
|
|
|
super.didUpdateWidget(oldWidget); |
|
|
|
if (widget.focusNode != oldWidget.focusNode) { |
|
|
|
if (widget.focusNode != oldWidget.focusNode) { |
|
|
|
oldWidget.focusNode.removeListener(_editorFocusChanged); |
|
|
|
oldWidget.focusNode!.removeListener(_editorFocusChanged); |
|
|
|
widget.focusNode.addListener(_editorFocusChanged); |
|
|
|
widget.focusNode!.addListener(_editorFocusChanged); |
|
|
|
_focused = widget.focusNode.hasFocus; |
|
|
|
_focused = widget.focusNode!.hasFocus; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -82,8 +82,8 @@ class _QuillFieldState extends State<QuillField> { |
|
|
|
Widget build(BuildContext context) { |
|
|
|
Widget build(BuildContext context) { |
|
|
|
Widget child = QuillEditor( |
|
|
|
Widget child = QuillEditor( |
|
|
|
controller: widget.controller, |
|
|
|
controller: widget.controller, |
|
|
|
focusNode: widget.focusNode, |
|
|
|
focusNode: widget.focusNode!, |
|
|
|
scrollController: widget.scrollController, |
|
|
|
scrollController: widget.scrollController!, |
|
|
|
scrollable: widget.scrollable, |
|
|
|
scrollable: widget.scrollable, |
|
|
|
padding: widget.padding, |
|
|
|
padding: widget.padding, |
|
|
|
autoFocus: widget.autofocus, |
|
|
|
autoFocus: widget.autofocus, |
|
|
@ -97,7 +97,7 @@ class _QuillFieldState extends State<QuillField> { |
|
|
|
keyboardAppearance: widget.keyboardAppearance, |
|
|
|
keyboardAppearance: widget.keyboardAppearance, |
|
|
|
scrollPhysics: widget.scrollPhysics, |
|
|
|
scrollPhysics: widget.scrollPhysics, |
|
|
|
onLaunchUrl: widget.onLaunchUrl, |
|
|
|
onLaunchUrl: widget.onLaunchUrl, |
|
|
|
embedBuilder: widget.embedBuilder, |
|
|
|
embedBuilder: widget.embedBuilder!, |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (widget.toolbar != null) { |
|
|
|
if (widget.toolbar != null) { |
|
|
@ -105,7 +105,7 @@ class _QuillFieldState extends State<QuillField> { |
|
|
|
children: [ |
|
|
|
children: [ |
|
|
|
child, |
|
|
|
child, |
|
|
|
Visibility( |
|
|
|
Visibility( |
|
|
|
child: widget.toolbar, |
|
|
|
child: widget.toolbar!, |
|
|
|
visible: _focused, |
|
|
|
visible: _focused, |
|
|
|
maintainSize: true, |
|
|
|
maintainSize: true, |
|
|
|
maintainAnimation: true, |
|
|
|
maintainAnimation: true, |
|
|
@ -117,11 +117,11 @@ class _QuillFieldState extends State<QuillField> { |
|
|
|
|
|
|
|
|
|
|
|
return AnimatedBuilder( |
|
|
|
return AnimatedBuilder( |
|
|
|
animation: |
|
|
|
animation: |
|
|
|
Listenable.merge(<Listenable>[widget.focusNode, widget.controller]), |
|
|
|
Listenable.merge(<Listenable?>[widget.focusNode, widget.controller]), |
|
|
|
builder: (BuildContext context, Widget child) { |
|
|
|
builder: (BuildContext context, Widget? child) { |
|
|
|
return InputDecorator( |
|
|
|
return InputDecorator( |
|
|
|
decoration: _getEffectiveDecoration(), |
|
|
|
decoration: _getEffectiveDecoration(), |
|
|
|
isFocused: widget.focusNode.hasFocus, |
|
|
|
isFocused: widget.focusNode!.hasFocus, |
|
|
|
// TODO: Document should be considered empty of it has single empty line with no styles applied |
|
|
|
// TODO: Document should be considered empty of it has single empty line with no styles applied |
|
|
|
isEmpty: widget.controller.document.length == 1, |
|
|
|
isEmpty: widget.controller.document.length == 1, |
|
|
|
child: child, |
|
|
|
child: child, |
|
|
|