diff --git a/packages/fleather/lib/src/rendering/editable_text_line.dart b/packages/fleather/lib/src/rendering/editable_text_line.dart index accc4744..6e1dd0e7 100644 --- a/packages/fleather/lib/src/rendering/editable_text_line.dart +++ b/packages/fleather/lib/src/rendering/editable_text_line.dart @@ -631,7 +631,8 @@ class RenderEditableTextLine extends RenderEditableBox { double computeDistanceToActualBaseline(TextBaseline baseline) { _resolvePadding(); // The baseline of this widget is the baseline of the body. - return body!.getDistanceToActualBaseline(baseline)! + _resolvedPadding!.top; + return body!.getDistanceToActualBaseline(baseline) ?? + 0.0 + _resolvedPadding!.top; } @override diff --git a/packages/fleather/lib/src/widgets/editor.dart b/packages/fleather/lib/src/widgets/editor.dart index 7ce54701..ad01dd0a 100644 --- a/packages/fleather/lib/src/widgets/editor.dart +++ b/packages/fleather/lib/src/widgets/editor.dart @@ -1627,21 +1627,6 @@ class RawEditorState extends EditorState bool _showCaretOnScreenScheduled = false; void _showCaretOnScreen([bool withAnimation = true]) { - assert( - widget.enableInteractiveSelection - ? _scrollController.positions.isNotEmpty - : true, - 'ScrollController not attached to any scroll views. ' - 'When editor configured with scrollable = false and ' - 'enableInteractiveSelection = true, make sure the editor is the child ' - 'of a Scrollable widget.'); - assert( - widget.showCursor ? _scrollController.positions.isNotEmpty : true, - 'ScrollController not attached to any scroll views. ' - 'When editor configured with scrollable = false and ' - 'showCursor = true, make sure the editor is the child ' - 'of a Scrollable widget.'); - if (!widget.showCursor || !widget.enableInteractiveSelection || _showCaretOnScreenScheduled) { diff --git a/packages/fleather/test/widgets/editor_test.dart b/packages/fleather/test/widgets/editor_test.dart index 0e49b322..2d3acac3 100644 --- a/packages/fleather/test/widgets/editor_test.dart +++ b/packages/fleather/test/widgets/editor_test.dart @@ -1599,7 +1599,7 @@ void main() { }); }); - group('field', () { + group('Field', () { testWidgets('creating field without focusNode does not throw _CastError', (tester) async { final widget = MaterialApp( @@ -1611,6 +1611,24 @@ void main() { // Fails if thrown }); + testWidgets('handle insertion embeds with no baseline', (tester) async { + final controller = FleatherController(); + final widget = MaterialApp( + home: FleatherField( + controller: controller, + ), + ); + await tester.pumpWidget(widget); + await tester.tap(find.byType(FleatherField)); + await tester.pump(); + controller.replaceText(0, 0, BlockEmbed.horizontalRule, + selection: TextSelection.collapsed(offset: 1)); + await tester.pump(throttleDuration); + controller.replaceText(0, 0, BlockEmbed.horizontalRule, + selection: TextSelection.collapsed(offset: 1)); + await tester.pump(throttleDuration); + }); + testWidgets('shows cursor on screen with scroll parent', (tester) async { final scrollController = ScrollController(); final controller = FleatherController();