getter的“ position”在null上被调用在TapGestureRecognizer.handleTapDown中包:flutter / src / gestures / tap.dart:493:28

问题描述

预期行为

允许多个嵌套手势检测器监听onTap事件的目标。

仅在点击时,代码即可工作。

I/Flutter (18227): inner  on tap down kind PointerDeviceKind.touch,local Offset(126.0,177.4) global Offset(126.0,257.5)
I/Flutter (18227): outter on tap down kind PointerDeviceKind.touch,257.5)

问题

但是当您将其拖动到某个位置然后点击任意位置时,就会发生此问题。

I/Flutter (18227): inner  on tap down kind PointerDeviceKind.touch,local Offset(188.3,151.9) global Offset(188.3,231.9)

════════ Exception caught by gesture library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown while dispatching a pointer event:
The getter 'position' was called on null.
Receiver: null
Tried calling: position

When the exception was thrown,this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      TapGestureRecognizer.handleTapDown (package:Flutter/src/gestures/tap.dart:493:28)
#2      BaseTapGestureRecognizer._checkDown (package:Flutter/src/gestures/tap.dart:274:5)
#3      BaseTapGestureRecognizer.acceptGesture (package:Flutter/src/gestures/tap.dart:252:7)
#4      AllowMultipleTapGestureRecognizer.rejectGesture (package:ride_app/test/allow_multiple_recognizer.dart:61:5)
...
Event: PointerUpEvent#ff59a(position: Offset(188.3,231.9))
  position: Offset(188.3,231.9)
Target: <WidgetsFlutterBinding>
════════════════════════════════════════════════════════════════════════════════════════════════════

可复制的代码(只需复制并粘贴)

import 'package:Flutter/material.dart';
import 'package:Flutter/gestures.dart';

class AllowMultipleRecognizerWidget extends StatefulWidget {
  @override
  _AllowMultipleRecognizerWidgetState createState() => _AllowMultipleRecognizerWidgetState();
}

class _AllowMultipleRecognizerWidgetState extends State<AllowMultipleRecognizerWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Multiple recognizer'),),body: RawGestureDetector(
        gestures: {
          AllowMultipleTapGestureRecognizer:
          GestureRecognizerFactoryWithHandlers<
              AllowMultipleTapGestureRecognizer>(
                () => AllowMultipleTapGestureRecognizer(),(AllowMultipleTapGestureRecognizer instance) {
              instance.onTapDown = (TapDownDetails event) {
                print(
                    'outter on tap down kind ${event.kind},local ${event.localPosition} global ${event.globalPosition}');
              };
            },},behavior: HitTestBehavior.defertochild,child:_gestureDetectorInnertest(),);
  }

  _gestureDetectorInnertest() {
    return GestureDetector(

      onTapDown: (TapDownDetails event) {
        print(
            'inner  on tap down kind ${event.kind},local ${event.localPosition} global ${event.globalPosition}');
      },child:  Container(
        color: Colors.pink,child: Center(
          child: Text('Drag then stop. Now tap anywhere. Check logs for exception'),);
  }
}

class AllowMultipleTapGestureRecognizer extends TapGestureRecognizer {
  @override
  void rejectGesture(int pointer) {
    acceptGesture(pointer);
  }
}

如您所见,tap监听器的外部输出错误

我在做什么错了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)