尝试从字符串列表中读取项目以显示在 ListView 中时出错

Error trying to read items from a list of strings to show in a ListView

在下面的代码中,我尝试使用 flutter 构建一个基本的 ToDo 列表应用程序。我有一个 FAB,当它被按下时,它要求用户在弹出的包含 TextField 的警告对话框中输入文本。我还使用 TextEditingController 获取文本并将其添加到字符串列表中。 我有一个计数器变量来跟踪添加到列表中的项目,并在我想显示列表中的项目并将其作为 ListTile 添加到 ListView 时将其用作列表的索引。

当我 运行 代码时,它说索引超出范围,我真的不知道我还应该注意什么。对不起,如果我的问题很基础,我是新手。

我的代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ToDo List',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyTaskList(),
    );
  }
}

class MyTaskList extends StatefulWidget {

  @override
  _MyTaskListState createState() => _MyTaskListState();
}

class _MyTaskListState extends State<MyTaskList> {
  final _taskItems = <String>[];
  var _counter = 0;
  final myController = TextEditingController();


  @override
  void dispose(){
    myController.dispose();
    super.dispose();
  }

  void _addTask(String task){
    setState(() {
      _taskItems.add(task);
    });
    myController.clear();
  }


  Widget _buildTaskList() {
    return new ListView.builder(
        itemCount: _taskItems.length,
        itemBuilder: (BuildContext context, _) {
          print(_taskItems);
          return _buildTask(_taskItems[_counter]);

        }

    );

  }

  Widget _buildTask(String task) {

    return new ListTile(
      title: new Text(task),
    );
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(

        appBar: AppBar(

          title: Text("ToDo List"),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () => showDialog<String>(
            context: context,
            builder: (context) => AlertDialog(
              title: Text("New Task"),
              content: TextField(
                controller: myController,
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  hintText: "Enter New Task",
                ),
              ),

              actions: <Widget>[
                TextButton(
                    onPressed: () => {
                      _addTask(myController.text),
                      Navigator.pop(context, "ok"),
                      _counter++,
                      print(_counter),
                      print(_taskItems),


                    },
                    child: const Text("OK")),

              ],
            )
          ),
          child: Center(child:Icon(Icons.add)),

        ),
        body: _buildTaskList(),
    );
  }
}

编辑如下。可以使用ListViewBuilder索引,为什么要用counter?我认为,您的初始 counter 值为 0 但列表为空。您尝试获取空列表的元素 0(或第一个)`,但没有元素。

Widget _buildTaskList() {
    return new ListView.builder(
        itemCount: _taskItems.length,
        itemBuilder: (BuildContext context, index) {
          print(_taskItems);
          return _buildTask(_taskItems[index]);

        }

    );

  }