Flutter:ListView.builder中的Textfield

问题描述 投票:0回答:2

大家好,我在Cloud Firestore和ListView.builder上有一些数据来加载数据。在这个ListView.builder中我有Network.Image,ListTile用于显示标题和副标题,另一个ListTile有一个Textfield来添加一些注释和一个iconbutton。我的目标是获取文本字段的文本,并在单击按钮时显示为alertDialog。到目前为止,我在文本字段中添加了一个控制器,但每当我在文本字段中输入任何内容时,它都会更改所有文本字段。我已经尝试创建一个List来指定一个独特的控制器,所以我可以停止文本字段中的所有更改,但我失败了。有什么方法可以做到这一点。所有这些textfields和iconbuttons必须是唯一的,所以当我点击图标按钮时,我需要查看键入的文本字段的文本。

flutter
2个回答
1
投票

尝试使用

List<TextEditingController> _controllers = new List();

在你的ListView.builder里面为每个项目添加一个新的控制器。

ListView.builder(
            itemBuilder: (context,index){
              _controllers.add(new TextEditingController());

              //Your code here

            }),

要访问控制器的文本,您需要索引值

_controllers[index].text

确保最后处理所有textControllers。


2
投票

您可能需要考虑为每一行创建一种新类型的自定义Widget。

你可以利用一个

  • TextEditingController(你称之为相应的控制器on click或者
  • TextFieldonChanged回调(你存储相应项目的新值on change

在这两种情况下,您都有一个令人讨厌的文本控制器或字符串值列表。

请记住,ListView.builder只会构建视口中或附近的项目(滚动时)。

只为那些实际可见的子项调用构建器

这意味着您可以多次构建相同的行(

考虑为每一行使用自定义小部件(扩展StatefulWidget

这将减轻与所有角色相关的协调,并且它将任何结果状态进一步向下推送到叶节点

如果使用TextEditingController

  • 你只有一个控制器担心
  • 在小部件的_textController.dispose()方法中调用dispose()

如果使用onChanged回调(可在TextField上找到TextFormField

  • 在自定义小部件inputValue中创建一个String变量作为状态
  • 处理空案例
  • 点击按钮时读取此信息

看起来TextEditingController可能是最简单的,但我想提及两个选项供您考虑。

© www.soinside.com 2019 - 2024. All rights reserved.