RangeError в списке флаттер

Я использую переменную count как запись индекса моего списка с типом TagColumn. В моем коде есть кнопка с плюсом. Каждый раз, когда вы нажимаете на нее, она должна проверять, ответили ли вы на предыдущее текстовое поле. Если вы это сделали, будет создан новый TagColumn. Другими словами, новое текстовое поле. Однако я получаю RangeError, в то время как использую SetState () для обновления моего счетчика.

Мой код:

class Practice extends StatefulWidget {
      @override
      _PracticeState createState() => _PracticeState();
    }

class _PracticeState extends State<Practice>{
  int count = 0;
  @override
  Widget build(BuildContext context){
    List<TagColumn> ok = List.generate(count, (int i) => new TagColumn());
    return Scaffold(
      backgroundColor: Colors.black,
      body: new LayoutBuilder(builder: (context, constraint){
      return new Stack(
        children: <Widget>[
          SingleChildScrollView(
            child: SafeArea(
              child: new Wrap(
                direction: Axis.horizontal,
                children: ok,
              )
            ),
          ),
          new Positioned(
            child: new Align(
              alignment: FractionalOffset.bottomRight,
              child: Container(
                margin: EdgeInsets.only(bottom: 50.0, right: 40.0),
                child: RawMaterialButton(
                  onPressed: (){
                    setState(() {
                      if(count != 0 && ok[count].text.text.isEmpty){

                      }
                      else{
                        count ++;
                      }
                    });
                  },
                  shape: CircleBorder(),
                  child: Icon(
                    Icons.add_circle,
                    size: 100.0,
                    color: Color(0xffd3d3d3),
                  ),
                )
              )
            )
          )

        ],
      );
      }),
    );
  }
}

Ошибка:

RangeError (index): Invalid value: Only valid value is 0: 1

Если вам нужно больше контекста, вот предыдущий вопрос, который у меня был о ранней ошибке в моем коде: Getter _text не определен для класса TagColumn во Flutter


person Ashu Mundra    schedule 01.05.2020    source источник


Ответы (1)


здесь, когда вы проверяете, является ли последний тег пустым или нет, он выдает ошибку, потому что индекс начинается с 0, поэтому последний элемент будет count-1.

Более того, вы каждый раз создаете список, поэтому текст будет удален из текстового поля. чтобы избежать, вы можете создавать список вне метода сборки и каждый раз добавлять элемент.

следующий код поможет вам лучше понять.

 int count = 0;
  List<TagColumn> ok = List();   // list created out side 
 @override
  Widget build(BuildContext context) {
    // List<TagColumn> ok = List.generate(count, (int i) => new TagColumn());  // commented list
    return Scaffold(
      backgroundColor: Colors.black,
      body: new LayoutBuilder(builder: (context, constraint) {
        return new Stack(
          children: <Widget>[
            SingleChildScrollView(
              child: SafeArea(
                  child: new Wrap(
                direction: Axis.horizontal,
                children: ok,
              )),
            ),
            new Positioned(
                child: new Align(
                    alignment: FractionalOffset.bottomRight,
                    child: Container(
                        margin: EdgeInsets.only(bottom: 50.0, right: 40.0),
                        child: RawMaterialButton(
                          onPressed: () {
                            setState(() {
                              if (count != 0 &&
                                  ok[count - 1].text.text.isEmpty) { // cout check change
                              } else {
                                ok.add(TagColumn());  // add new item on click
                                count++;
                              }
                            });
                          },
                          shape: CircleBorder(),
                          child: Icon(
                            Icons.add_circle,
                            size: 100.0,
                            color: Color(0xffd3d3d3),
                          ),
                        ))))
          ],
        );
      }),
    );
  }
person Viren V Varasadiya    schedule 01.05.2020