我在創建學習 Todo 應用程式時遇到了奇怪的問題。我實作了 TaskList 類和 TaskTile 類,如下所示。
TaskList 類如下
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 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,
);
}
}
現在的問題是它沒有呼叫父類的 longPressCallBack,即 TaskList 類。我進行了除錯,它呼叫了 TaskTile 類的 onLongPress,但沒有呼叫它的父類的回呼,這就是 deleteTask 不起作用的原因。
uj5u.com熱心網友回復:
問題出onLongPress: () => longPressCallBack,在你TaskTile班級的這條線上。這里你只是呼叫longPressCallBack 閉包參考而不是執行閉包函式。
解決方案:
把上面一行是: onLongPress: () => longPressCallBack(),或嘗試直接傳遞函式refrence到onLongPress的財產ListTile像這樣 onLongPress: longPressCallBack,
uj5u.com熱心網友回復:
你可以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,
);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/392810.html
