[英]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.