diff --git a/CHANGELOG.md b/CHANGELOG.md index c9ff048a3..7dbb4d6c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fixed `View.of(context)` calls throwing when used with the `screenshot` package. + ## [11.4.2] - 2025-07-22 ### Fixed diff --git a/lib/src/common/extensions/view_id_ext.dart b/lib/src/common/extensions/view_id_ext.dart new file mode 100644 index 000000000..dd941669e --- /dev/null +++ b/lib/src/common/extensions/view_id_ext.dart @@ -0,0 +1,11 @@ +import 'package:flutter/widgets.dart'; + +extension ViewIdExt on BuildContext { + int? getViewId() { + late final platformDispatcher = WidgetsBinding.instance.platformDispatcher; + return View.maybeOf(this)?.viewId ?? + // If context has no View, check platformDispatcher + platformDispatcher.views.firstOrNull?.viewId ?? + platformDispatcher.implicitView?.viewId; + } +} diff --git a/lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart b/lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart index 5857bcf00..70310c8f3 100644 --- a/lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart +++ b/lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart @@ -7,6 +7,7 @@ import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; +import '../../common/extensions/view_id_ext.dart'; import '../../delta/delta_diff.dart'; import '../../document/document.dart'; import '../editor.dart'; @@ -89,7 +90,7 @@ mixin RawEditorStateTextInputClientMixin on EditorState allowedMimeTypes: widget.config.contentInsertionConfiguration == null ? const [] : widget.config.contentInsertionConfiguration!.allowedMimeTypes, - viewId: View.of(context).viewId, + viewId: context.getViewId(), ), ); diff --git a/lib/src/editor/raw_editor/scribble_focusable.dart b/lib/src/editor/raw_editor/scribble_focusable.dart index 8436d2de6..a83188f9c 100644 --- a/lib/src/editor/raw_editor/scribble_focusable.dart +++ b/lib/src/editor/raw_editor/scribble_focusable.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; +import '../../common/extensions/view_id_ext.dart'; + class ScribbleFocusable extends StatefulWidget { const ScribbleFocusable({ required this.child, @@ -87,10 +89,16 @@ class _ScribbleFocusableState extends State if (!calculatedBounds.overlaps(rect)) { return false; } + + final viewId = context.getViewId(); + if (viewId == null) { + // Can't perform hit testing without a viewId + return false; + } + final intersection = calculatedBounds.intersect(rect); final result = HitTestResult(); - WidgetsBinding.instance - .hitTestInView(result, intersection.center, View.of(context).viewId); + WidgetsBinding.instance.hitTestInView(result, intersection.center, viewId); return result.path.any((entry) => entry.target == _renderBoxForEditor || entry.target == _renderBoxForBounds);