Flutter应用在三星平板S6按压触控笔按钮触屏时崩溃求助
修复三星Galaxy Tab S6触控笔按钮按下崩溃问题
问题根源
你碰到的java.lang.AssertionError: Unexpected masked action是Flutter Android端触控处理器无法处理带按钮按下状态的触控笔屏幕触碰事件导致的崩溃。另外你的代码还有两处逻辑问题:
- 嵌套的
GestureDetector会干扰事件传递,引发冲突 onPointerDown和onPointerMove里的else if分支永远不会触发,因为前面已经判断了触控笔类型,后续条件无法满足
纯Flutter修复方案
直接用下面的代码替换你的原代码,就能解决崩溃问题,同时修正逻辑错误:
import 'dart:ui'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const MaterialApp( home: HomePage(), ); } } class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ const Positioned.fill(child: Container(color: Colors.yellow)), Listener( behavior: HitTestBehavior.opaque, onPointerHover: (event) { // 用位与判断按钮是否按下(buttons是位掩码,不能直接相等) if (event.kind == PointerDeviceKind.stylus && (event.buttons & kPrimaryStylusButton) != 0) { print("触控笔悬停且按钮按下"); } }, onPointerDown: (event) { if (event.kind == PointerDeviceKind.stylus) { if ((event.buttons & kPrimaryStylusButton) != 0) { print("触控笔按屏幕且按钮按下"); } else { print("触控笔按屏幕"); } } }, onPointerMove: (event) { if (event.kind == PointerDeviceKind.stylus) { if ((event.buttons & kPrimaryStylusButton) != 0) { print("触控笔在屏幕移动且按钮按下"); } else { print("触控笔在屏幕移动"); } } }, onPointerCancel: (event) { if (event.kind == PointerDeviceKind.stylus) { print("触控笔离开"); } }, onPointerUp: (event) { if (event.kind == PointerDeviceKind.stylus) { print("触控笔抬起"); } }, ), ], ), ); } }
核心修复点
- 删掉多余的GestureDetector:外层的GestureDetector会和内层Listener抢事件,导致传递异常,直接移除就好
- 用位与判断按钮状态:
buttons是位掩码类型,多个按钮状态会用二进制位叠加,必须用(event.buttons & kPrimaryStylusButton) != 0来判断按钮是否按下,直接用==会漏判 - 合并条件分支:把原来的
if-else if改成嵌套if,确保带按钮的事件能被正确捕获 - 补充onPointerUp事件:完善触控笔的完整事件周期,避免状态遗漏
这样修改后,按压触控笔按钮触碰屏幕时,事件会在Flutter层被完全处理,不会传到Android底层触发崩溃。
内容的提问来源于stack exchange,提问作者KRBILN
相关产品推荐
相关产品推荐

