Skip to content

Commit ca4b3a6

Browse files
committed
fix: viewId when no View in context
1 parent 48f6b70 commit ca4b3a6

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
1111
## [Unreleased]
1212

13+
### Fixed
14+
15+
- Fixed `View.of(context)` calls throwing when used with the `screenshot` package.
16+
1317
## [11.4.2] - 2025-07-22
1418

1519
### Fixed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:flutter/widgets.dart';
2+
3+
extension ViewIdExt on BuildContext {
4+
int? getViewId() {
5+
late final platformDispatcher = WidgetsBinding.instance.platformDispatcher;
6+
return View.maybeOf(this)?.viewId ??
7+
// If context has no View, check platformDispatcher
8+
platformDispatcher.views.firstOrNull?.viewId ??
9+
platformDispatcher.implicitView?.viewId;
10+
}
11+
}

lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:flutter/scheduler.dart';
77
import 'package:flutter/services.dart';
88
import 'package:meta/meta.dart';
99

10+
import '../../common/extensions/view_id_ext.dart';
1011
import '../../delta/delta_diff.dart';
1112
import '../../document/document.dart';
1213
import '../editor.dart';
@@ -89,7 +90,7 @@ mixin RawEditorStateTextInputClientMixin on EditorState
8990
allowedMimeTypes: widget.config.contentInsertionConfiguration == null
9091
? const <String>[]
9192
: widget.config.contentInsertionConfiguration!.allowedMimeTypes,
92-
viewId: View.of(context).viewId,
93+
viewId: context.getViewId(),
9394
),
9495
);
9596

lib/src/editor/raw_editor/scribble_focusable.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
22
import 'package:flutter/rendering.dart';
33
import 'package:flutter/services.dart';
44

5+
import '../../common/extensions/view_id_ext.dart';
6+
57
class ScribbleFocusable extends StatefulWidget {
68
const ScribbleFocusable({
79
required this.child,
@@ -87,10 +89,16 @@ class _ScribbleFocusableState extends State<ScribbleFocusable>
8789
if (!calculatedBounds.overlaps(rect)) {
8890
return false;
8991
}
92+
93+
final viewId = context.getViewId();
94+
if (viewId == null) {
95+
// Can't perform hit testing without a viewId
96+
return false;
97+
}
98+
9099
final intersection = calculatedBounds.intersect(rect);
91100
final result = HitTestResult();
92-
WidgetsBinding.instance
93-
.hitTestInView(result, intersection.center, View.of(context).viewId);
101+
WidgetsBinding.instance.hitTestInView(result, intersection.center, viewId);
94102
return result.path.any((entry) =>
95103
entry.target == _renderBoxForEditor ||
96104
entry.target == _renderBoxForBounds);

0 commit comments

Comments
 (0)