flutter - 从 ListView 中的 textFormField 获取值
问题描述
我的颤振项目中有一个 ListView,其中有 2 个 TextFormFields。我希望获取用户从 TextFormField 输入的任何值并打印它(现在)。
我检查了以下链接 - Flutter : Textfield in ListView.builder并尝试获取值。
以下是我的代码 -
class _OrderBookingState extends State<OrderBooking> {
@override
Widget build(BuildContext context) {
TextEditingController controller = new TextEditingController();
List<TextEditingController> _textFieldRateControllers = new List();
List<TextEditingController> _textFieldQtyControllers = new List();
return Scaffold(
appBar: AppBar(
title: Center(child: Text(widget.shop.shopName)),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
child: StreamBuilder<List<ProductModel>>(
stream: DatabaseService().productList,
builder: (context,snapshot){
if(snapshot.hasData){
return Flexible(
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index){
_textFieldRateControllers[index].text = "5";
_textFieldQtyControllers[index].text = "5";
_textFieldQtyControllers.add(new TextEditingController());
_textFieldRateControllers.add(new TextEditingController());
return Padding(
padding: EdgeInsets.only(top: 8.0),
child: Card(
margin: EdgeInsets.fromLTRB(10.0, 6.0, 10.0, 0.0),
child: ListTile(
leading: CircleAvatar(
radius: 25.0,
backgroundColor: Colors.deepOrangeAccent,
),
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Container(
width: 175,
child: Text(snapshot.data[index].productName,),
),
// Expanded(child: Container(
// width: 10,
// child: Center(child: Text(snapshot.data[index].productName,)))),
SizedBox(width: 5,),
Expanded(child: Container(
width: 10,
child: TextFormField(
controller: _textFieldRateControllers[index],
initialValue: snapshot.data[index].rate,textAlign: TextAlign.center,
),
),
),
SizedBox(width: 5,),
Expanded(child: TextFormField(
controller: _textFieldQtyControllers[index],
initialValue: "0",textAlign: TextAlign.center,)
)
],
),
subtitle: Text('MRP ' + snapshot.data[index].mrp),
),
),
);
}
),
);
}else{
return Loading();
}
}
),
),
Container(
margin: EdgeInsets.fromLTRB(10.0, 6.0, 10.0, 0.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
"Total Value: 0/-",
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold,backgroundColor: Colors.greenAccent)
),
RaisedButton(
child: Text("Save",style: TextStyle(fontSize: 18.0),),
color: Colors.green,
textColor: Colors.white,
highlightColor: Colors.lightGreenAccent,
onPressed: (){
print(_textFieldQtyControllers[1].text);
},
)
],
),
)
],
),
);
}
}
我得到以下错误 -
RangeError (index): Invalid value: Valid value range is empty: 0
请让我知道如何解决这个问题。
解决方案
新更新
您需要从 TextField中删除 initalValue 参数:
Expanded(child: TextFormField(
controller: _textFieldQtyControllers[index],
initialValue: "0", //REMOVE THIS LINE
textAlign: TextAlign.center,)
)
而且您的操作顺序错误,它必须是:
- 设置将 TextEditingController 添加到您的列表中
_textFieldRateControllers.add(new TextEditingController());
_textFieldQtyControllers.add(new TextEditingController());
- 将控制器文本设置为您的初始值:
_textFieldRateControllers[index].text = snapshot.data[index].rate.toString();
_textFieldQtyControllers[index].text = "0";
老的
要解决您的错误,请删除 initialValue 并改为设置
//set this after
_textFieldRateControllers[index].text = //your Initial data
_textFieldQtyControllers[index].text = //your Initial data
我认为您没有正确设置列表,因为需要像这样创建 TextEditingController:
TextEditingController controller = new TextEditingController();
然后在您的 ListView 中,在构建器中调用它:
_textFieldRateControllers.add(new TextEditingController());
_textFieldQtyControllers.add(new TextEditingController());
这将使用构造函数正确创建控制器
推荐阅读
- excel - 如何组合循环以将值分配给文本框
- c++ - C++ 继承:我必须在派生类中重复父属性吗?
- android - NDK 版本 r17.0.4754217 不再支持 ABI 过滤器“armeabi”
- python - scipy.curve_fit() 返回多行
- python - cv2.VideoCapture 不工作
- python - 日期时间熊猫之后的总和和平均值
- php - 从 PHP 7.1.x 迁移到 PHP 7.2.x json_decode() 更改
- linux - 如何在处理开始之前控制 Linux 中的文件 - bash
- r - 文件名列表强制每个元素中只有一个文件名
- c# - Xamarin Forms Prism call the method