Flutter:ListView.builder中的文本字段

时间:2018-09-08 10:28:24

标签: flutter

大家好,我在Cloud Firestore有一些数据,还有一个ListView.builder可以在其中加载数据。在此ListView.builder中,我具有Network.Image,用于显示标题和字幕的ListTile,以及另一个具有文本字段以添加一些注释和图标按钮的ListTile。我的目标是获取文本字段的文本,并在单击按钮时显示为alertDialog。到目前为止,我向文本字段添加了一个控制器,但是每当我在文本字段中键入任何内容时,它都会更改所有文本字段。我试图创建一个列表来指定一个唯一的控制器,以便我可以停止文本字段中的所有更改,但是我失败了。有什么办法可以做到这一点。所有这些文本字段和图标按钮必须唯一,因此当我单击图标按钮时,我需要查看键入的文本字段的文本。

3 个答案:

答案 0 :(得分:2)

您可能要考虑为每行制作一种新型自定义窗口小部件

您可以利用

  • TextEditingController(在其中调用相应的控制器 on click
  • TextField的{​​{1}}回调(您在其中存储的新值 相应的项目onChanged

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

请记住,ListView.builder仅用于构建视口内或附近的项目(滚动时)。

  

仅针对那些实际可见的子代调用构建器

这意味着您可以多次构建同一行

考虑为每行使用自定义窗口小部件(扩展on change

这将减轻与所有角色相关的协调,并将所有结果状态进一步推到树上,直到叶子节点

如果使用StatefulWidget

  • 您只需要担心一个控制器
  • 使用小部件的TextEditingController方法调用_textController.dispose()

如果使用onChanged回调(在dispose()而非TextField上可用)

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

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

答案 1 :(得分:1)

尝试使用

public function posts()
    {
        return $this->hasMany('App\Models\Post')->sum('post_views','AS','totalViews');
    }

然后在您的List<TextEditingController> _controllers = new List(); 中为每个项目添加一个新控制器。

ListView.builder

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

ListView.builder( itemBuilder: (context,index){ _controllers.add(new TextEditingController()); //Your code here }),

确保最后处置所有textController。

答案 2 :(得分:1)

ListView.builder(
         shrinkWrap: true,
         physics: ScrollPhysics(),
         itemCount: list.length,
         itemBuilder: (BuildContext context, int index) {
         _controllers.add(new TextEditingController());
           return Container(
               child: TextField(
                  textAlign: TextAlign.start,
                  controller:   _controllers[index],
                  autofocus: false,
                  keyboardType: TextInputType.text,),))