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