RangeError в флаттере списка - PullRequest
0 голосов
/ 01 мая 2020

Я использую переменную 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

1 Ответ

1 голос
/ 01 мая 2020

здесь, когда вы проверяете, является ли последний тег пустым или нет, он выдает ошибку, потому что индекс начинается с 0, поэтому последний элемент будет считать-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),
                          ),
                        ))))
          ],
        );
      }),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...