Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
ac02a7b
[pointer_interceptor] Adopt code-excerpts for README
danielleon-cmd Aug 25, 2026
44956cf
[pointer_interceptor] Bump to 0.10.1+3 for the code-excerpts README c…
danielleon-cmd Aug 25, 2026
1488d4e
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Aug 27, 2026
0700849
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Aug 28, 2026
efa8f57
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Aug 28, 2026
d815c22
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Aug 31, 2026
1a214a3
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 1, 2026
9ca6f2f
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 2, 2026
8b541be
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 3, 2026
9db1a96
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 3, 2026
62dec40
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 4, 2026
dba8f51
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 7, 2026
0779a22
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 8, 2026
856651a
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 8, 2026
caabfc3
[pointer_interceptor] Address review: trim excerpt noise, add tests
danielleon-cmd Sep 9, 2026
2dde7d7
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 9, 2026
523d6f1
Merge branch 'main' into fpoctsmp-9-pointer-interceptor-code-excerpts
danielleon-cmd Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## NEXT
## 0.10.1+3

* Adopts `code-excerpt` for the README's Dart snippets so they are validated
against compilable, analyzed source.
* Updates minimum supported SDK version to Flutter 3.38/Dart 3.10.
* Updates README to reflect currently supported OS versions for the latest
versions of the endorsed platform implementations.
Expand Down
73 changes: 42 additions & 31 deletions packages/pointer_interceptor/pointer_interceptor/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# pointer_interceptor
<?code-excerpt path-base="example/lib"?>

| | iOS | Web |
|-------------|---------|-----|
Expand Down Expand Up @@ -47,25 +48,27 @@ There's two ways that the `PointerInterceptor` widget can be used to solve the p

1. Wrapping your button element directly (FAB, Custom Play/Pause button...):

```dart
PointerInterceptor(
child: ElevatedButton(...),
)
```
<?code-excerpt "readme_excerpts.dart (WrapButton)"?>
```dart
PointerInterceptor(
child: ElevatedButton(
// ···
),
)
```

2. As a root container for a "layout" element, wrapping a bunch of other elements (like a Drawer):

```dart
Scaffold(
...
drawer: PointerInterceptor(
child: Drawer(
child: ...
),
),
...
)
```
<?code-excerpt "readme_excerpts.dart (WrapSubtree)"?>
```dart
Scaffold(
drawer: PointerInterceptor(
child: Drawer(
// ···
),
),
)
```

### `intercepting`

Expand All @@ -76,24 +79,32 @@ The `intercepting` property allows the `PointerInterceptor` widget to render
itself (or not) depending on a boolean value, instead of having to manually
write an `if/else` on the Flutter App widget tree, so code like this:

```dart
if (someCondition) {
return PointerInterceptor(
child: ElevatedButton(...),
)
} else {
return ElevatedButton(...),
}
```
<?code-excerpt "readme_excerpts.dart (InterceptingBefore)"?>
```dart
if (someCondition) {
return PointerInterceptor(
child: ElevatedButton(
// ···
),
);
} else {
return ElevatedButton(
// ···
);
}
```

can be rewritten as:

```dart
return PointerInterceptor(
intercepting: someCondition,
child: ElevatedButton(...),
)
```
<?code-excerpt "readme_excerpts.dart (InterceptingAfter)"?>
```dart
PointerInterceptor(
intercepting: someCondition,
child: ElevatedButton(
// ···
),
)
```

Note: when `intercepting` is false, the `PointerInterceptor` will not render
_anything_ in flutter, and just return its `child`. The code is exactly
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';

/// Wraps a single button so that it can be clicked, even when it's on top of
/// a platform view.
Widget wrapButtonSnippet() {
return
// #docregion WrapButton
PointerInterceptor(
child: ElevatedButton(
// #enddocregion WrapButton
onPressed: () {},
child: const Text('Button'),
// #docregion WrapButton
),
)
// #enddocregion WrapButton
;
}

/// Wraps a whole subtree (a [Drawer], in this case) so that it can be
/// clicked, even when it's on top of a platform view.
Widget wrapSubtreeSnippet() {
return
// #docregion WrapSubtree
Scaffold(
drawer: PointerInterceptor(
child: Drawer(
// #enddocregion WrapSubtree
child: ListView(children: const <Widget>[Text('Drawer contents')]),
// #docregion WrapSubtree
),
),
)
// #enddocregion WrapSubtree
;
}

/// The naive way of conditionally intercepting pointer events, which
/// `intercepting` is meant to replace.
Widget interceptingBeforeSnippet(bool someCondition) {
// #docregion InterceptingBefore
if (someCondition) {
return PointerInterceptor(
child: ElevatedButton(
// #enddocregion InterceptingBefore
onPressed: () {},
child: const Text('Button'),
// #docregion InterceptingBefore
),
);
} else {
return ElevatedButton(
// #enddocregion InterceptingBefore
onPressed: () {},
child: const Text('Button'),
// #docregion InterceptingBefore
);
}
// #enddocregion InterceptingBefore
}

/// The equivalent of [interceptingBeforeSnippet], using `intercepting`.
Widget interceptingAfterSnippet(bool someCondition) {
return
// #docregion InterceptingAfter
PointerInterceptor(
intercepting: someCondition,
child: ElevatedButton(
// #enddocregion InterceptingAfter
onPressed: () {},
child: const Text('Button'),
// #docregion InterceptingAfter
),
)
// #enddocregion InterceptingAfter
;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:pointer_interceptor_example/readme_excerpts.dart';

void main() {
testWidgets('wrapButtonSnippet wraps a button in a PointerInterceptor', (
WidgetTester tester,
) async {
await tester.pumpWidget(MaterialApp(home: wrapButtonSnippet()));

expect(find.byType(PointerInterceptor), findsOneWidget);
expect(find.widgetWithText(ElevatedButton, 'Button'), findsOneWidget);
});

testWidgets('wrapSubtreeSnippet wraps a Drawer in a PointerInterceptor', (
WidgetTester tester,
) async {
await tester.pumpWidget(MaterialApp(home: wrapSubtreeSnippet()));
tester.state<ScaffoldState>(find.byType(Scaffold)).openDrawer();
await tester.pumpAndSettle();

expect(find.byType(PointerInterceptor), findsOneWidget);
expect(find.widgetWithText(Drawer, 'Drawer contents'), findsOneWidget);
});

testWidgets('interceptingBeforeSnippet returns a PointerInterceptor when true', (
WidgetTester tester,
) async {
await tester.pumpWidget(MaterialApp(home: interceptingBeforeSnippet(true)));

expect(find.byType(PointerInterceptor), findsOneWidget);
expect(find.widgetWithText(ElevatedButton, 'Button'), findsOneWidget);
});

testWidgets('interceptingBeforeSnippet returns a plain button when false', (
WidgetTester tester,
) async {
await tester.pumpWidget(MaterialApp(home: interceptingBeforeSnippet(false)));

expect(find.byType(PointerInterceptor), findsNothing);
expect(find.widgetWithText(ElevatedButton, 'Button'), findsOneWidget);
});

testWidgets('interceptingAfterSnippet sets intercepting from its argument', (
WidgetTester tester,
) async {
await tester.pumpWidget(MaterialApp(home: interceptingAfterSnippet(true)));

final PointerInterceptor interceptor = tester.widget(find.byType(PointerInterceptor));
expect(interceptor.intercepting, isTrue);
expect(find.widgetWithText(ElevatedButton, 'Button'), findsOneWidget);
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: pointer_interceptor
description: A widget to prevent clicks from being swallowed by underlying HtmlElementViews on the web.
repository: https://github.com/flutter/packages/tree/main/packages/pointer_interceptor/pointer_interceptor
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+pointer_interceptor%22
version: 0.10.1+2
version: 0.10.1+3

environment:
sdk: ^3.10.0
Expand Down
Loading