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

Posted

技术标签:

【中文标题】尝试从要显示在 ListView 中的字符串列表中读取项目时出错【英文标题】:Error trying to read items from a list of strings to show in a ListView 【发布时间】:2021-08-12 00:21:35 【问题描述】:

在下面的代码中,我尝试使用 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(),
    );
  

【问题讨论】:

你真的让我混淆了 () =&gt; , 使用 () 而不是 () =&gt; 第二个只是返回一个 Set 而第一个是 void 回调。我不得不问不和谐。谢谢美代代 @moneeralhashim 感谢您的信息,但我有一些事情。如果我们根据您所说的进行假设,那么为什么我的那段代码即使返回一个集合也能工作? 你真的不应该使用它,即使它有效。当您编写 () =&gt; 时,您将返回一个 Set 文字。就像你这样做一样() =&gt; [] 函数部分只是() =&gt; [] 部分是在你制作它时返回的列表你可以调用像() =&gt; [print('not ok')] 这样的函数但是你可以看到没有需要在此处执行此操作,因为您可以编写 () =&gt; print('ok')() 用于分组表达式。不要混淆 javascript 和 dart,但即使在 javascript 中它也会引入歧义,因为它看起来像一个对象和一个函数体。 【参考方案1】:

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

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

        

    );

  

【讨论】:

感谢您的回答礼萨!工作得很好,整洁。

以上是关于尝试从要显示在 ListView 中的字符串列表中读取项目时出错的主要内容,如果未能解决你的问题,请参考以下文章

我有一个包含在 ScrollView 中的 ListView 以在标题下显示字符串列表,但无法正确显示

填充 listview API 调用

在颤动的列表视图中搜索

单击 Xamarin.Forms 中的 ListView 项后完整显示详细信息

如何在颤动的Listview中显示字符串列表

ListView 数据未在 Kotlin 中显示