拖放列表 - 方法"调用"在空值上被调用



我正在尝试使用flutter_list_drag_and_drop 0.1.6制作拖放列表。我已经寻找了如何实现它的示例,但目前还没有专门针对此的示例,因此其中大部分都是反复试验。无论如何,当我运行该应用程序时,它在尝试为列表视图拖动其中一个 MyDraggable 时出现错误。它说"通过手势捕获异常","处理手势时抛出以下NoSuchMethodError:方法'call'在null上被调用","接收者:null","尝试调用:call('偏移'的实例)。

我已经尝试过调试,但无法找到崩溃的确切位置。可拖动小部件的反馈正在出现,但卡在原地。

```
Widget _buildDragDrop(double _screenHeight, double _screenWidth){
return DragAndDropList(_nonDelList.getList(),
canBeDraggedTo: (int i, int j) {
print("drag to");
// _nonDelList.changePos(_nonDelList.getTaskAt(i), j);
return true;
},
itemBuilder: (BuildContext _context, Task _t1) {
print('Entered Item Builder');
return _buildTask(_t1, _screenHeight, _screenWidth);
},
onDragFinish: (int i, int j){
print('Drag finished');
_nonDelList.changePos(_nonDelList.getTaskAt(i), j);
print('Drag finished 2');
},
dragElevation: 1.5,
);
}
Widget _buildTask(Task _t, double _screenHeight, double 
_screenWidth){
final bool alreadyCompleted = !(_t.getPressed());
return new MyDraggable(
child: new ListTile(
title: new Text(_t.getEntry()),
trailing: new Icon(
alreadyCompleted ? Icons.check_box : 
Icons.check_box_outline_blank,
color: alreadyCompleted ? _t.getColor() : Colors.black,
),
subtitle: new Text(_t.getDescription()),
),
onDragStarted: (){
print('Started Drag');
},
onMyDraggableCanceled: (Velocity v, Offset o){
print('Drag Canceled');
},
feedback: Material(
shape: CircleBorder(),
child: new InkResponse(
child: Container(
width: _screenWidth / 15.0,
height: _screenWidth / 15.0,
color: Colors.red,
),
),
),
);
}
```

我希望列表磁贴能够拖放到位。 然而,唯一发生的事情是,当我开始拖动时,我的反馈出现在列表磁贴的左上角,然后此错误立即被吐出。此外,"开始拖动"和"拖动取消"不会打印出来,唯一正在打印的是"输入的项目生成器"。

我欢迎并感谢所有的帮助!

提前感谢!

编辑(堆栈跟踪)

I/flutter ( 2974): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter ( 2974): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter ( 2974): The method 'call' was called on null.
I/flutter ( 2974): Receiver: null
I/flutter ( 2974): Tried calling: call(Instance of 'Offset')
I/flutter ( 2974):
I/flutter ( 2974): When the exception was thrown, this was the stack:
I/flutter ( 2974): #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter ( 2974): #1      DragAvatar.updateDrag
package:flutter_list_drag_and_drop/my_draggable.dart:547
I/flutter ( 2974): #2      new DragAvatar
package:flutter_list_drag_and_drop/my_draggable.dart:498
I/flutter ( 2974): #3      MyDraggableState._startDrag
package:flutter_list_drag_and_drop/my_draggable.dart:328
I/flutter ( 2974): #4      MultiDragGestureRecognizer._startDrag.<anonymous closure> 
package:flutter/…/gestures/multidrag.dart:263
I/flutter ( 2974): #5      GestureRecognizer.invokeCallback 
package:flutter/…/gestures/recognizer.dart:120
I/flutter ( 2974): #6      MultiDragGestureRecognizer._startDrag 
package:flutter/…/gestures/multidrag.dart:263
I/flutter ( 2974): #7      MultiDragGestureRecognizer.acceptGesture.<anonymous closure> 
package:flutter/…/gestures/multidrag.dart:253
I/flutter ( 2974): #8      _ImmediatePointerState.accepted 
package:flutter/…/gestures/multidrag.dart:315
I/flutter ( 2974): #9      MultiDragGestureRecognizer.acceptGesture 
package:flutter/…/gestures/multidrag.dart:253
I/flutter ( 2974): #10     GestureArenaManager._resolveInFavorOf 
package:flutter/…/gestures/arena.dart:263
I/flutter ( 2974): #11     GestureArenaManager._resolve 
package:flutter/…/gestures/arena.dart:222
I/flutter ( 2974): #12     GestureArenaEntry.resolve 
package:flutter/…/gestures/arena.dart:52
I/flutter ( 2974): #13     MultiDragPointerState.resolve 
package:flutter/…/gestures/multidrag.dart:62
I/flutter ( 2974): #14     _ImmediatePointerState.checkForResolutionAfterMove 
package:flutter/…/gestures/multidrag.dart:310
I/flutter ( 2974): #15     MultiDragPointerState._move 
package:flutter/…/gestures/multidrag.dart:81
I/flutter ( 2974): #16     MultiDragGestureRecognizer._handleEvent 
package:flutter/…/gestures/multidrag.dart:227
I/flutter ( 2974): #17     PointerRouter._dispatch 
package:flutter/…/gestures/pointer_router.dart:73
I/flutter ( 2974): #18     PointerRouter.route 
package:flutter/…/gestures/pointer_router.dart:101
I/flutter ( 2974): #19     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent 
package:flutter/…/gestures/binding.dart:214
I/flutter ( 2974): #20     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent 
package:flutter/…/gestures/binding.dart:192
I/flutter ( 2974): #21     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent 
package:flutter/…/gestures/binding.dart:149
I/flutter ( 2974): #22     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue 
I/flutter ( 2974): #23     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket 
package:flutter/…/gestures/binding.dart:85
I/flutter ( 2974): #27     _invoke1 (dart:ui/hooks.dart:223:10)
I/flutter ( 2974): #28     _dispatchPointerDataPacket (dart:ui/hooks.dart:144:5)
I/flutter ( 2974): (elided 3 frames from package dart:async)
I/flutter ( 2974):
I/flutter ( 2974): Handler: onStart
I/flutter ( 2974): Recognizer:
I/flutter ( 2974):   ImmediateMultiDragGestureRecognizer#774eb

堆栈跟踪显示:

I/flutter ( 2974): When the exception was thrown, this was the stack:
I/flutter ( 2974): #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter ( 2974): #1      DragAvatar.updateDrag
package:flutter_list_drag_and_drop/my_draggable.dart:547

好的,所以那里发生了空指针异常。 让我们看一下代码:

onMove(globalPosition);

这符合错误消息,即:

I/flutter ( 2974): Tried calling: call(Instance of 'Offset')

所以globalPosition很可能是一个Offset,而onMove一定是一个对象。 让我们在应该设置onMove的代码中搜索:

DragAvatar({
@required this.overlayState,
...
this.onMove,

(第 491 行)

其中(省略某些步骤)似乎是从以下位置获得的:

const MyDraggable({
Key key,
@required this.child,
@required this.feedback,
...
this.onMove

(101行)

我没有看到其他任何地方以其他方式设置onMove。 看起来可能有一个错误,DragAvatar.updateDrag无条件地调用onMoveonMove最初没有被标记为@required,或者onMove没有初始化为某个默认值。

无论如何,尝试在构造MyDraggable时提供onMove回调。

(或者,也许可以考虑使用官方的 ReorderableListView 类,flutter_list_drag_and_drop 包页面甚至引用了该类。

最新更新