Merge branch 'master' of github.com:singerdmx/flutter-quill into prefer-const-constructors

pull/116/head
Till Friebe 4 years ago
commit 27c115d54a
  1. 2
      analysis_options.yaml
  2. 1
      example/lib/pages/home_page.dart
  3. 1
      example/lib/pages/read_only_page.dart
  4. 6
      lib/models/documents/document.dart
  5. 2
      lib/models/quill_delta.dart
  6. 1
      lib/widgets/controller.dart
  7. 2
      lib/widgets/default_styles.dart
  8. 13
      lib/widgets/editor.dart
  9. 3
      lib/widgets/raw_editor.dart
  10. 8
      lib/widgets/responsive_widget.dart
  11. 8
      lib/widgets/text_block.dart
  12. 10
      lib/widgets/text_line.dart
  13. 6
      lib/widgets/text_selection.dart
  14. 71
      lib/widgets/toolbar.dart

@ -7,5 +7,7 @@ analyzer:
unsafe_html: ignore unsafe_html: ignore
linter: linter:
rules: rules:
- always_put_required_named_parameters_first
- avoid_print - avoid_print
- avoid_redundant_argument_values
- prefer_const_constructors - prefer_const_constructors

@ -110,7 +110,6 @@ class _HomePageState extends State<HomePage> {
autoFocus: false, autoFocus: false,
readOnly: false, readOnly: false,
placeholder: 'Add content', placeholder: 'Add content',
enableInteractiveSelection: true,
expands: false, expands: false,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
customStyles: DefaultStyles( customStyles: DefaultStyles(

@ -42,7 +42,6 @@ class _ReadOnlyPageState extends State<ReadOnlyPage> {
focusNode: _focusNode, focusNode: _focusNode,
autoFocus: true, autoFocus: true,
readOnly: !_edit, readOnly: !_edit,
enableInteractiveSelection: true,
expands: false, expands: false,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
), ),

@ -183,7 +183,7 @@ class Document {
bool nextOpIsImage = bool nextOpIsImage =
i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is! String; i + 1 < ops.length && ops[i + 1].isInsert && ops[i + 1].data is! String;
if (nextOpIsImage && !(op.data as String).endsWith('\n')) { if (nextOpIsImage && !(op.data as String).endsWith('\n')) {
res.push(Operation.insert('\n', null)); res.push(Operation.insert('\n'));
} }
// Currently embed is equivalent to image and hence `is! String` // Currently embed is equivalent to image and hence `is! String`
bool opInsertImage = op.isInsert && op.data is! String; bool opInsertImage = op.isInsert && op.data is! String;
@ -193,7 +193,7 @@ class Document {
(ops[i + 1].data as String).startsWith('\n'); (ops[i + 1].data as String).startsWith('\n');
if (opInsertImage && (i + 1 == ops.length - 1 || !nextOpIsLineBreak)) { if (opInsertImage && (i + 1 == ops.length - 1 || !nextOpIsLineBreak)) {
// automatically append '\n' for image // automatically append '\n' for image
res.push(Operation.insert('\n', null)); res.push(Operation.insert('\n'));
} }
} }
@ -213,7 +213,7 @@ class Document {
_history.clear(); _history.clear();
} }
String toPlainText() => _root.children.map((e) => e.toPlainText()).join(''); String toPlainText() => _root.children.map((e) => e.toPlainText()).join();
void _loadDocument(Delta doc) { void _loadDocument(Delta doc) {
assert((doc.last.data as String).endsWith('\n')); assert((doc.last.data as String).endsWith('\n'));

@ -520,7 +520,7 @@ class Delta {
if (op.isInsert) { if (op.isInsert) {
inverted.delete(op.length!); inverted.delete(op.length!);
} else if (op.isRetain && op.isPlain) { } else if (op.isRetain && op.isPlain) {
inverted.retain(op.length!, null); inverted.retain(op.length!);
baseIndex += op.length!; baseIndex += op.length!;
} else if (op.isDelete || (op.isRetain && op.isNotPlain)) { } else if (op.isDelete || (op.isRetain && op.isNotPlain)) {
final length = op.length!; final length = op.length!;

@ -33,7 +33,6 @@ class QuillController extends ChangeNotifier {
TextEditingValue get plainTextEditingValue => TextEditingValue( TextEditingValue get plainTextEditingValue => TextEditingValue(
text: document.toPlainText(), text: document.toPlainText(),
selection: selection, selection: selection,
composing: TextRange.empty,
); );
Style getSelectionStyle() { Style getSelectionStyle() {

@ -6,9 +6,9 @@ class QuillStyles extends InheritedWidget {
final DefaultStyles data; final DefaultStyles data;
QuillStyles({ QuillStyles({
Key? key,
required this.data, required this.data,
required Widget child, required Widget child,
Key? key,
}) : super(key: key, child: child); }) : super(key: key, child: child);
@override @override

@ -176,14 +176,14 @@ class QuillEditor extends StatefulWidget {
required this.scrollable, required this.scrollable,
required this.padding, required this.padding,
required this.autoFocus, required this.autoFocus,
this.showCursor,
required this.readOnly, required this.readOnly,
required this.expands,
this.showCursor,
this.placeholder, this.placeholder,
this.enableInteractiveSelection = true, this.enableInteractiveSelection = true,
this.minHeight, this.minHeight,
this.maxHeight, this.maxHeight,
this.customStyles, this.customStyles,
required this.expands,
this.textCapitalization = TextCapitalization.sentences, this.textCapitalization = TextCapitalization.sentences,
this.keyboardAppearance = Brightness.light, this.keyboardAppearance = Brightness.light,
this.scrollPhysics, this.scrollPhysics,
@ -200,7 +200,6 @@ class QuillEditor extends StatefulWidget {
focusNode: FocusNode(), focusNode: FocusNode(),
autoFocus: true, autoFocus: true,
readOnly: readOnly, readOnly: readOnly,
enableInteractiveSelection: true,
expands: false, expands: false,
padding: EdgeInsets.zero); padding: EdgeInsets.zero);
} }
@ -726,8 +725,7 @@ class RenderEditor extends RenderEditableContainerBox
); );
if (position.offset - word.start <= 1) { if (position.offset - word.start <= 1) {
_handleSelectionChange( _handleSelectionChange(
TextSelection.collapsed( TextSelection.collapsed(offset: word.start),
offset: word.start, affinity: TextAffinity.downstream),
cause, cause,
); );
} else { } else {
@ -866,6 +864,11 @@ class RenderEditor extends RenderEditableContainerBox
); );
} }
/// Returns the y-offset of the editor at which [selection] is visible.
///
/// The offset is the distance from the top of the editor and is the minimum
/// from the current scroll position until [selection] becomes visible.
/// Returns null if [selection] is already visible.
double? getOffsetToRevealCursor( double? getOffsetToRevealCursor(
double viewportHeight, double scrollOffset, double offsetInViewport) { double viewportHeight, double scrollOffset, double offsetInViewport) {
List<TextSelectionPoint> endpoints = getEndpointsForSelection(selection); List<TextSelectionPoint> endpoints = getEndpointsForSelection(selection);

@ -382,8 +382,6 @@ class RawEditorState extends EditorState
TextInputConfiguration( TextInputConfiguration(
inputType: TextInputType.multiline, inputType: TextInputType.multiline,
readOnly: widget.readOnly, readOnly: widget.readOnly,
obscureText: false,
autocorrect: true,
inputAction: TextInputAction.newline, inputAction: TextInputAction.newline,
keyboardAppearance: widget.keyboardAppearance, keyboardAppearance: widget.keyboardAppearance,
textCapitalization: widget.textCapitalization, textCapitalization: widget.textCapitalization,
@ -702,6 +700,7 @@ class RawEditorState extends EditorState
_keyboardVisible = true; _keyboardVisible = true;
} else { } else {
_keyboardVisibilityController = KeyboardVisibilityController(); _keyboardVisibilityController = KeyboardVisibilityController();
_keyboardVisible = _keyboardVisibilityController!.isVisible;
_keyboardVisibilitySubscription = _keyboardVisibilitySubscription =
_keyboardVisibilityController?.onChange.listen((bool visible) { _keyboardVisibilityController?.onChange.listen((bool visible) {
_keyboardVisible = visible; _keyboardVisible = visible;

@ -5,12 +5,12 @@ class ResponsiveWidget extends StatelessWidget {
final Widget? mediumScreen; final Widget? mediumScreen;
final Widget? smallScreen; final Widget? smallScreen;
const ResponsiveWidget( const ResponsiveWidget({
{Key? key,
required this.largeScreen, required this.largeScreen,
this.mediumScreen, this.mediumScreen,
this.smallScreen}) this.smallScreen,
: super(key: key); Key? key,
}) : super(key: key);
static bool isSmallScreen(BuildContext context) { static bool isSmallScreen(BuildContext context) {
return MediaQuery.of(context).size.width < 800; return MediaQuery.of(context).size.width < 800;

@ -253,11 +253,11 @@ class EditableTextBlock extends StatelessWidget {
class RenderEditableTextBlock extends RenderEditableContainerBox class RenderEditableTextBlock extends RenderEditableContainerBox
implements RenderEditableBox { implements RenderEditableBox {
RenderEditableTextBlock({ RenderEditableTextBlock({
List<RenderEditableBox>? children,
required Block block, required Block block,
required TextDirection textDirection, required TextDirection textDirection,
required EdgeInsetsGeometry padding, required EdgeInsetsGeometry padding,
required Decoration decoration, required Decoration decoration,
List<RenderEditableBox>? children,
ImageConfiguration configuration = ImageConfiguration.empty, ImageConfiguration configuration = ImageConfiguration.empty,
EdgeInsets contentPadding = EdgeInsets.zero, EdgeInsets contentPadding = EdgeInsets.zero,
}) : _decoration = decoration, }) : _decoration = decoration,
@ -559,7 +559,6 @@ class _NumberPoint extends StatelessWidget {
final double padding; final double padding;
const _NumberPoint({ const _NumberPoint({
Key? key,
required this.index, required this.index,
required this.indentLevelCounts, required this.indentLevelCounts,
required this.count, required this.count,
@ -568,6 +567,7 @@ class _NumberPoint extends StatelessWidget {
required this.attrs, required this.attrs,
this.withDot = true, this.withDot = true,
this.padding = 0.0, this.padding = 0.0,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -624,7 +624,7 @@ class _NumberPoint extends StatelessWidget {
n = (n / 26).floor(); n = (n / 26).floor();
} }
return result.toString().split('').reversed.join(''); return result.toString().split('').reversed.join();
} }
String _intToRoman(int input) { String _intToRoman(int input) {
@ -657,9 +657,9 @@ class _BulletPoint extends StatelessWidget {
final double width; final double width;
const _BulletPoint({ const _BulletPoint({
Key? key,
required this.style, required this.style,
required this.width, required this.width,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override

@ -27,13 +27,13 @@ class TextLine extends StatelessWidget {
final EmbedBuilder embedBuilder; final EmbedBuilder embedBuilder;
final DefaultStyles styles; final DefaultStyles styles;
const TextLine( const TextLine({
{Key? key,
required this.line, required this.line,
this.textDirection,
required this.embedBuilder, required this.embedBuilder,
required this.styles}) required this.styles,
: super(key: key); this.textDirection,
Key? key,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -246,7 +246,6 @@ class EditorTextSelectionOverlay {
class _TextSelectionHandleOverlay extends StatefulWidget { class _TextSelectionHandleOverlay extends StatefulWidget {
const _TextSelectionHandleOverlay({ const _TextSelectionHandleOverlay({
Key? key,
required this.selection, required this.selection,
required this.position, required this.position,
required this.startHandleLayerLink, required this.startHandleLayerLink,
@ -256,6 +255,7 @@ class _TextSelectionHandleOverlay extends StatefulWidget {
required this.onSelectionHandleTapped, required this.onSelectionHandleTapped,
required this.selectionControls, required this.selectionControls,
this.dragStartBehavior = DragStartBehavior.start, this.dragStartBehavior = DragStartBehavior.start,
Key? key,
}) : super(key: key); }) : super(key: key);
final TextSelection selection; final TextSelection selection;
@ -469,7 +469,7 @@ class _TextSelectionHandleOverlayState
class EditorTextSelectionGestureDetector extends StatefulWidget { class EditorTextSelectionGestureDetector extends StatefulWidget {
const EditorTextSelectionGestureDetector({ const EditorTextSelectionGestureDetector({
Key? key, required this.child,
this.onTapDown, this.onTapDown,
this.onForcePressStart, this.onForcePressStart,
this.onForcePressEnd, this.onForcePressEnd,
@ -483,7 +483,7 @@ class EditorTextSelectionGestureDetector extends StatefulWidget {
this.onDragSelectionUpdate, this.onDragSelectionUpdate,
this.onDragSelectionEnd, this.onDragSelectionEnd,
this.behavior, this.behavior,
required this.child, Key? key,
}) : super(key: key); }) : super(key: key);
final GestureTapDownCallback? onTapDown; final GestureTapDownCallback? onTapDown;

@ -25,9 +25,9 @@ class InsertEmbedButton extends StatelessWidget {
final IconData icon; final IconData icon;
const InsertEmbedButton({ const InsertEmbedButton({
Key? key,
required this.controller, required this.controller,
required this.icon, required this.icon,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -56,9 +56,9 @@ class LinkStyleButton extends StatefulWidget {
final IconData? icon; final IconData? icon;
const LinkStyleButton({ const LinkStyleButton({
Key? key,
required this.controller, required this.controller,
this.icon, this.icon,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -183,11 +183,11 @@ class ToggleStyleButton extends StatefulWidget {
final ToggleStyleButtonBuilder childBuilder; final ToggleStyleButtonBuilder childBuilder;
ToggleStyleButton({ ToggleStyleButton({
Key? key,
required this.attribute, required this.attribute,
required this.icon, required this.icon,
required this.controller, required this.controller,
this.childBuilder = defaultToggleStyleButtonBuilder, this.childBuilder = defaultToggleStyleButtonBuilder,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -267,11 +267,11 @@ class ToggleCheckListButton extends StatefulWidget {
final Attribute attribute; final Attribute attribute;
ToggleCheckListButton({ ToggleCheckListButton({
Key? key,
required this.icon, required this.icon,
required this.controller, required this.controller,
this.childBuilder = defaultToggleStyleButtonBuilder,
required this.attribute, required this.attribute,
this.childBuilder = defaultToggleStyleButtonBuilder,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -371,7 +371,7 @@ Widget defaultToggleStyleButtonBuilder(
class SelectHeaderStyleButton extends StatefulWidget { class SelectHeaderStyleButton extends StatefulWidget {
final QuillController controller; final QuillController controller;
const SelectHeaderStyleButton({Key? key, required this.controller}) const SelectHeaderStyleButton({required this.controller, Key? key})
: super(key: key); : super(key: key);
@override @override
@ -494,14 +494,14 @@ class ImageButton extends StatefulWidget {
final ImageSource imageSource; final ImageSource imageSource;
ImageButton( ImageButton({
{Key? key,
required this.icon, required this.icon,
required this.controller, required this.controller,
required this.imageSource, required this.imageSource,
this.onImagePickCallback, this.onImagePickCallback,
this.imagePickImpl}) this.imagePickImpl,
: super(key: key); Key? key,
}) : super(key: key);
@override @override
_ImageButtonState createState() => _ImageButtonState(); _ImageButtonState createState() => _ImageButtonState();
@ -525,7 +525,6 @@ class _ImageButtonState extends State<ImageButton> {
Future<String?> _pickImageWeb() async { Future<String?> _pickImageWeb() async {
_paths = (await FilePicker.platform.pickFiles( _paths = (await FilePicker.platform.pickFiles(
type: _pickingType, type: _pickingType,
allowMultiple: false,
allowedExtensions: (_extension?.isNotEmpty ?? false) allowedExtensions: (_extension?.isNotEmpty ?? false)
? _extension?.replaceAll(' ', '').split(',') ? _extension?.replaceAll(' ', '').split(',')
: null, : null,
@ -601,12 +600,12 @@ class ColorButton extends StatefulWidget {
final bool background; final bool background;
final QuillController controller; final QuillController controller;
ColorButton( ColorButton({
{Key? key,
required this.icon, required this.icon,
required this.controller, required this.controller,
required this.background}) required this.background,
: super(key: key); Key? key,
}) : super(key: key);
@override @override
_ColorButtonState createState() => _ColorButtonState(); _ColorButtonState createState() => _ColorButtonState();
@ -739,12 +738,12 @@ class HistoryButton extends StatefulWidget {
final bool undo; final bool undo;
final QuillController controller; final QuillController controller;
HistoryButton( HistoryButton({
{Key? key,
required this.icon, required this.icon,
required this.controller, required this.controller,
required this.undo}) required this.undo,
: super(key: key); Key? key,
}) : super(key: key);
@override @override
_HistoryButtonState createState() => _HistoryButtonState(); _HistoryButtonState createState() => _HistoryButtonState();
@ -811,12 +810,12 @@ class IndentButton extends StatefulWidget {
final QuillController controller; final QuillController controller;
final bool isIncrease; final bool isIncrease;
IndentButton( IndentButton({
{Key? key,
required this.icon, required this.icon,
required this.controller, required this.controller,
required this.isIncrease}) required this.isIncrease,
: super(key: key); Key? key,
}) : super(key: key);
@override @override
_IndentButtonState createState() => _IndentButtonState(); _IndentButtonState createState() => _IndentButtonState();
@ -866,7 +865,7 @@ class ClearFormatButton extends StatefulWidget {
final QuillController controller; final QuillController controller;
ClearFormatButton({Key? key, required this.icon, required this.controller}) ClearFormatButton({required this.icon, required this.controller, Key? key})
: super(key: key); : super(key: key);
@override @override
@ -897,10 +896,9 @@ class _ClearFormatButtonState extends State<ClearFormatButton> {
class QuillToolbar extends StatefulWidget implements PreferredSizeWidget { class QuillToolbar extends StatefulWidget implements PreferredSizeWidget {
final List<Widget> children; final List<Widget> children;
const QuillToolbar({Key? key, required this.children}) : super(key: key); const QuillToolbar({required this.children, Key? key}) : super(key: key);
factory QuillToolbar.basic( factory QuillToolbar.basic({
{Key? key,
required QuillController controller, required QuillController controller,
double toolbarIconSize = 18.0, double toolbarIconSize = 18.0,
bool showBoldButton = true, bool showBoldButton = true,
@ -920,7 +918,9 @@ class QuillToolbar extends StatefulWidget implements PreferredSizeWidget {
bool showLink = true, bool showLink = true,
bool showHistory = true, bool showHistory = true,
bool showHorizontalRule = false, bool showHorizontalRule = false,
OnImagePickCallback? onImagePickCallback}) { OnImagePickCallback? onImagePickCallback,
Key? key,
}) {
iconSize = toolbarIconSize; iconSize = toolbarIconSize;
return QuillToolbar(key: key, children: [ return QuillToolbar(key: key, children: [
Visibility( Visibility(
@ -1147,13 +1147,13 @@ class QuillIconButton extends StatelessWidget {
final double highlightElevation; final double highlightElevation;
const QuillIconButton({ const QuillIconButton({
Key? key,
required this.onPressed, required this.onPressed,
this.icon, this.icon,
this.size = 40, this.size = 40,
this.fillColor, this.fillColor,
this.hoverElevation = 1, this.hoverElevation = 1,
this.highlightElevation = 1, this.highlightElevation = 1,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -1163,7 +1163,6 @@ class QuillIconButton extends StatelessWidget {
child: RawMaterialButton( child: RawMaterialButton(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)),
padding: EdgeInsets.zero,
fillColor: fillColor, fillColor: fillColor,
elevation: 0, elevation: 0,
hoverElevation: hoverElevation, hoverElevation: hoverElevation,
@ -1186,15 +1185,15 @@ class QuillDropdownButton<T> extends StatefulWidget {
final ValueChanged<T> onSelected; final ValueChanged<T> onSelected;
const QuillDropdownButton({ const QuillDropdownButton({
Key? key,
this.height = 40,
this.fillColor,
this.hoverElevation = 1,
this.highlightElevation = 1,
required this.child, required this.child,
required this.initialValue, required this.initialValue,
required this.items, required this.items,
required this.onSelected, required this.onSelected,
this.height = 40,
this.fillColor,
this.hoverElevation = 1,
this.highlightElevation = 1,
Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
@ -1209,7 +1208,6 @@ class _QuillDropdownButtonState<T> extends State<QuillDropdownButton<T>> {
child: RawMaterialButton( child: RawMaterialButton(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2)),
padding: EdgeInsets.zero,
fillColor: widget.fillColor, fillColor: widget.fillColor,
elevation: 0, elevation: 0,
hoverElevation: widget.hoverElevation, hoverElevation: widget.hoverElevation,
@ -1250,6 +1248,7 @@ class _QuillDropdownButtonState<T> extends State<QuillDropdownButton<T>> {
// if (widget.onCanceled != null) widget.onCanceled(); // if (widget.onCanceled != null) widget.onCanceled();
return null; return null;
} }
widget.onSelected(newValue);
}); });
} }

Loading…
Cancel
Save