You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter任务编辑按钮异常:无法动态获取任务索引求助

解决Flutter任务列表动态编辑任务索引的问题

核心思路

要实现动态编辑对应任务,关键是把当前任务的索引从列表项传递到编辑弹窗,这样就能在保存时使用该索引调用editTask方法,而非硬编码固定值。

具体修改步骤

1. 修改EditTask组件,添加索引和初始标题参数

更新EditTask的构造函数,接收要编辑的任务索引和当前标题,同时初始化输入框的默认值:

class EditTask extends StatelessWidget {
  final int taskIndex; // 新增:要编辑的任务索引
  final String initialTitle; // 新增:任务当前标题,用于初始化输入框
  final TextEditingController entryController;

  // 修改构造函数,接收参数并初始化controller
  EditTask({
    super.key,
    required this.taskIndex,
    required this.initialTitle,
  }) : entryController = TextEditingController(text: initialTitle);

  @override
  Widget build(BuildContext context) {
    return Consumer<AppViewModel>(builder: (context, viewModel, child) {
      return AlertDialog(
        title: const Text('Edit Task'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              TextField(
                onSubmitted: (value) {
                  if (entryController.text.isNotEmpty) {
                    viewModel.editTask(taskIndex, entryController.text); // 使用传入的索引
                    entryController.clear();
                  }
                  Navigator.of(context).pop();
                },
                decoration: InputDecoration(
                    contentPadding: EdgeInsets.only(bottom: 5),
                    filled: true,
                    border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(20),
                        borderSide: const BorderSide(
                            width: 0, style: BorderStyle.none))),
                textAlign: TextAlign.center,
                textAlignVertical: TextAlignVertical.center,
                autofocus: true,
                autocorrect: false,
                controller: entryController,
                style: TextStyle(fontWeight: FontWeight.w500),
              ),
            ],
          ),
        ),
        actions: <Widget>[
          TextButton(
            child: const Text('Save'),
            onPressed: () {
              if (entryController.text.isNotEmpty) {
                viewModel.editTask(taskIndex, entryController.text); // 使用传入的索引
              }
              Navigator.of(context).pop();
            },
          ),
          TextButton(
            child: const Text('Cancel'),
            onPressed: () {
              entryController.clear();
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    });
  }
}

2. 在task_list_view.dart中传递任务索引和标题

遍历任务列表生成列表项时,获取当前任务的索引和标题,传递给EditTask:

// 假设使用ListView.builder遍历tasks
ListView.builder(
  itemCount: viewModel.tasks.length,
  itemBuilder: (context, index) {
    final task = viewModel.tasks[index];
    return ListTile(
      title: Text(task.title),
      trailing: IconButton(
        onPressed: () {
          // 推荐用showDialog替代Navigator.push,更符合对话框交互逻辑
          showDialog(
            context: context,
            builder: (context) => EditTask(
              taskIndex: index, // 传递当前任务索引
              initialTitle: task.title, // 传递当前任务标题
            ),
          );
        },
        icon: Icon(Icons.edit),
      ),
    );
  },
)

验证效果

现在点击不同任务的编辑按钮,输入框会自动填充当前任务的标题,保存时会精准修改对应索引的任务,不再局限于硬编码的固定索引值。

内容的提问来源于stack exchange,提问作者Maha Abd El-Moneam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:56:18