简体   繁体   English

ListTile onLongPress 事件不工作 Flutter

[英]ListTile onLongPress Event Not working Flutter

I encountered weird issue while creating a learning Todo App.我在创建学习 Todo 应用程序时遇到了奇怪的问题。 I implemented TaskList Class and TaskTile class as below.我实现了 TaskList Class 和 TaskTile class 如下。

TaskList Class as below任务列表 Class 如下

import 'package:provider/provider.dart';
import 'package:todoey/Models/taskdata.dart';
import 'package:todoey/widgets/task_tile.dart';

class TasksList extends StatefulWidget {
  @override
  State<TasksList> createState() => _TasksListState();
}

class _TasksListState extends State<TasksList> {
  @override
  Widget build(BuildContext context) {
    return Consumer<TaskData>(builder: (context, taskData, child) {
      return ListView.builder(
        itemBuilder: (context, index) {
          final task = taskData.taskList[index];
          return TaskTile(
            longPressCallBack: () {
              taskData.deleteTask(task);
            },
            name: task.name,
            isChecked: task.isDone,
            checkBoxCallBack: (newValue) {
              taskData.updateTask(task);
            },
          );
        },
        itemCount: taskData.taskList.length,
      );
    });
  }
}

TaskTile Class as below TaskTile Class 如下


class TaskTile extends StatelessWidget {
  final bool? isChecked;
  final String name;
  final Function checkBoxCallBack;
  final Function longPressCallBack;

  TaskTile(
      {required this.name,
      this.isChecked,
      required this.checkBoxCallBack,
      required this.longPressCallBack});

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text(
        name,
        style: TextStyle(
          decoration: isChecked! ? TextDecoration.lineThrough : null,
        ),
      ),
      trailing: Checkbox(
        fillColor: MaterialStateProperty.all(Colors.lightBlueAccent),
        checkColor: Colors.white,
        value: isChecked!,
        onChanged: (newValue) {
          checkBoxCallBack(newValue);
        },
      ),
      onLongPress: () => longPressCallBack,
    );
  }
}

Now the problem is it doesn't call longPressCallBack of parent class ie TaskList class.现在的问题是它不调用父 class 的 longPressCallBack,即任务列表 class。 I debugged and it calls onLongPress of TaskTile class but not calling callback to it's parent class and that is why deleteTask not working.我进行了调试,它调用了 TaskTile class 的 onLongPress,但没有调用它的父 class 的回调,这就是 deleteTask 不起作用的原因。

The problem is with this line onLongPress: () => longPressCallBack, on your TaskTile class.问题在于您的TaskTile class 上的这一行onLongPress: () => longPressCallBack, longPressCallBack。 Here you are just invoking longPressCallBack closure reference instead of executing the closure function.在这里,您只是调用longPressCallBack闭包引用,而不是执行闭包 function。

Solution:解决方案:

Change that line to this: onLongPress: () => longPressCallBack(), or try directly passing function refrence to onLongPress property of ListTile like this onLongPress: longPressCallBack,将该行更改为: onLongPress: () => longPressCallBack(),或尝试直接将 function 引用传递给 ListTile 的onLongPress属性,如下所示onLongPress: longPressCallBack, ListTile

You can use VoidCallback instead, look at the following sample code:您可以改用VoidCallback ,查看以下示例代码:

class _MyWidgetState extends State<MyWidget> {
  String greeting = "Hello World!";
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(
          greeting,
          style: Theme.of(context).textTheme.headline4,
        ),
        TestButton(
          onClickCallback: () {
            setState(() {
              greeting = "Hello Test!";
            });
            
          }
        ),
      ],
    );
  }
}

class TestButton extends StatelessWidget {
  final VoidCallback onClickCallback;
  
  const TestButton( {required this.onClickCallback});
  
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      child: const Text("TestButton"),
      onPressed: onClickCallback,
    );
      
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM