【问题标题】:ListTile onLongPress Event Not working FlutterListTile onLongPress 事件不工作颤振
【发布时间】:2022-01-25 09:29:07
【问题描述】:

我在创建学习 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 不起作用的原因。

【问题讨论】:

    标签: flutter dart listtile


    【解决方案1】:

    问题在于onLongPress: () =&gt; longPressCallBack, 课程上的这一行 TaskTile。这里你只是调用longPressCallBack闭包参考,而不是执行闭包函数。

    解决方案:

    将该行更改为: onLongPress: () =&gt; longPressCallBack(), 或尝试直接将函数引用传递给ListTileonLongPress 属性,如下所示 onLongPress: longPressCallBack,

    【讨论】:

      【解决方案2】:

      你可以改用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,
          );
            
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-30
        • 1970-01-01
        • 2021-11-02
        • 2020-05-04
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多