【问题标题】:Get value from textFormField within a ListView从 ListView 中的 textFormField 获取值
【发布时间】:2021-03-05 02:24:56
【问题描述】:

我的 Flutter 项目中有一个 ListView,其中有 2 个 TextFormField。我想要获取用户从 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

请告诉我如何解决这个问题。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    新更新

    您需要从 TextField 中删除 initalValue 参数

    Expanded(child: TextFormField(
        controller: _textFieldQtyControllers[index],
        initialValue: "0", //REMOVE THIS LINE
        textAlign: TextAlign.center,)
    )
    

    而且你的动作顺序错误,一定是:

    1. 设置将 TextEditingController 添加到您的列表中
    _textFieldRateControllers.add(new TextEditingController());
    _textFieldQtyControllers.add(new TextEditingController());
    
    1. 将控制器文本设置为您的初始值:
    _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());
    

    这会使用构造函数正确创建控制器

    【讨论】:

    • 我尝试在 Listview.builder 之后(内)添加这两行。然后我得到错误 - “断言失败:第 191 行 pos 15:'initialValue == null || 控制器 == null':不正确。”
    • 我在问题中添加了我当前的代码。它产生相同的输出。您是仅提出相同的建议还是我弄错了。
    • @Alias 我再次更新了它,请确保从您的 TextField 中删除 initialValue 参数
    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多