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捕获到了指针事件?不知道有什么办法可以更详细的搞明白,希望有大神能不吝赐教。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!