IgnorePointer 在 GridView 中没有阻止指针事件
IgnorePointer 在 GridView 中没有阻止指针事件
代码
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Sca(),
);
}
}
class Sca extends StatefulWidget {
@override
State<StatefulWidget> createState() => _Sca();
}
class _Sca extends State<Sca> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("hello"),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
child: B(),
width: 300,
height: 300,
),
Listener(
child: Container(child: SubIgnore(), width: 150, height: 150),
onPointerDown: (e) => print("Ignore的上层收到"),
),
],
),
);
}
}
class B extends StatelessWidget {
@override
Widget build(BuildContext context) {
var gridview = GridView.count(
crossAxisCount: 2,
children: [
SubNormal(),
SubIgnore(),
SubIgnore(),
SubNormal(),
],
);
return Listener(
child: gridview,
onPointerDown: (e) => print("gredview 接收到点击事件"),
);
}
}
class SubNormal extends StatelessWidget {
@override
Widget build(BuildContext context) {
return myListener(Colors.red);
}
}
class SubIgnore extends StatelessWidget {
@override
Widget build(BuildContext context) {
return IgnorePointer(child: myListener(Colors.blue));
}
}
Widget myListener(Color color) {
return Listener(
child: Container(
color: color,
),
onPointerDown: (e) => print("down"),
);
}
输出
当点击四方格中蓝色方块(有 IgnorePointer )时,输出为
[ +1 ms] gredview 接收到点击事件
蓝色方块内部的Listener没有处理原始指针事件
当点击红色方块时(无 IgnorePointer ),输出为
[ +966 ms] down [ +1 ms] gredview 接收到点击事件
红色方块内部的Listener处理了原始指针事件
当点击下面单个的蓝色方块(有 IgnorePointer )时,没有输出
问题
IgnorePointer拦截了事件,但是貌似GridView中的某个内部的widget捕获到了指针事件?不知道有什么办法可以更详细的搞明白,希望有大神能不吝赐教。