我遇到了一个问题:我有一个方法,它有几个TextEditingController实例,该方法返回一个小部件,表示一个对象.它通过列表呈现,这意味着这些控制器具有与列表长度一样多的实例.现在,在按钮的点击处理程序上,我希望从控制器获取每个小部件的所有值.我目前正在将它们保存在对象列表中.主要问题是,当我更新一些文本时,控制器值会更改,但它已经在列表中,所以它不会反映在对象中.有没有办法只在单击按钮时才获得这些值,而不需要将它们存储在对象列表中?以下是获得 idea 的代码.

ListView.builder(
    controller: _deviceScroll,
    itemCount: 6,
    itemBuilder: (BuildContext context, int index) {
    return Container(
        child: editableAdress(), //Widget rendering
    );
})

Widget editableAdress() {
    TextEditingController _nameController =
        TextEditingController(text: adress.adrName1);

    TextEditingController _secondNameController =
        TextEditingController(text: adress.adrName2);
    
    //adding in the list
    widget.addressesList.add(new Address(
        adrName1: _nameController.text, adrName2: _secondNameController.text));

    return Column(
      children: [
        Text('NAME', style: headingStyle),
        const SizedBox(height: 10),
        Column(
          children: [
            editableTextField(context, _nameController, 'Person 1 / Firma'),
            const SizedBox(
              height: 10,
            ),
            editableTextField(context, _secondNameController, 'Person 2'),
          ],
        ),
      ],
    );
  }

推荐答案

最简单的方法是将TextEditingController保留在列表中,而不仅仅是控制器的Text属性.

widget.addressesController.add(
  new AddressController(adrName1: _nameController, adrName2: _secondNameController)
);

这样,您始终可以访问实际值,并在按钮上单击Convert to Address类.

But if you don't want to do this, then:

一种更好的方法. 您可以使用监听程序更新值. 只需用字符串中的空值或地址中的空字符串预加载数组,并将索引传递给该方法.

预加载:

widget.addressesList=List.generate(6/*Or the length you want*/, (index) => Address(adrName1: null, adrName2: null));

方法:

Widget editableAdress(int index) {
  TextEditingController _nameController =
    TextEditingController(text: adress.adrName1);

  TextEditingController _secondNameController =
    TextEditingController(text: adress.adrName2);

  //update value
  _nameController.addListener(() {
    widget.addressesList[index].ardName1 = _nameController.value;
  })

  //update second value
  _secondNameController.addListener(() {
    widget.addressesList[index].ardName2 = _secondNameController.value;
  })

  ....
}

这样,监听程序总是更新值.

Flutter相关问答推荐

创建多个具有适当填充和对齐的按钮的最佳方法

具有可变高度小部件的SingleChildScrollView内的列

如何创建一个按钮来在Ffltter Webview中转到上一页?

如何在凌晨12点显示00:00(24小时格式)而不是在Flutter 中显示24:00

无法让Riverpod Stream发出新值

如何将Xpriter代码页更改为代码页27?

如何在容器小部件中的图像旁边添加文本?

就像Flutter 中的头文件一样?

为什么我的页面控制器在使用Riverpod时没有更改我的页面视图?

在Ffltter中,我已经使用了Ffltter_BLOC Cupit和Pusher,但当获得新数据时,UI没有更新

使用 Firebase Realtime 实现高效流式传输

使用Flutter项目设置Firebase遇到困难?这些解决方案或许能帮到你!

无法在 ListView (Flutter) 中限制 Card 的最大宽度

更改 flutter listview 中的布局

Flutter 动保存新的变量值

从子类调用超类的超方法

Cloud firestore:如何使用 map 对象创建和更新嵌套数组

Android: 从 URI 获取音频元数据

在 CircleAvatar 中放置芯片

使用 hydrad_bloc 的预览包