RangeError (index): Недопустимое значение: не входит в инклюзивный диапазон 0..13: 14 Flutter

Кто-то, чтобы помочь мне? Я новичок. Я пытаюсь получить номера контроллеров из текстового поля. Для этого я попытался преобразовать символы в int. Примечание: в текстовое поле пользователь будет вводить числа до трех цифр. Появляется эта ошибка: RangeError (index): Неверное значение: не входит в инклюзивный диапазон 0..13: 14

validate(textController)
  {
    List textCode = List();
    List messageInCode = List();
    int validateRepeticions;
    var stringText = textController;

    for (var b = 0; b < stringText.length; b++)
    {
      textCode.insert(b, stringText[b]);
    }

    validateRepeticions = textCode.length;
    print(validateRepeticions);
    int g = 0;
    int k = 0;
    
    do 
    {
      
      bool comma = true;
      List tryToParseInt = List();
      int d = 0;// 'd' is responsible for identifying the positional value of a digit
      int a = 1;// 'a' increment values to k
      int c = 0;// 'c' defines the positions used in tryToParseInt
      int completeNumber;

        tryToParseInt.insert(c, int.tryParse(textCode[k]));

        if (tryToParseInt[c] == null)
        {
          validateRepeticions--;
        }
        else
        {
          d++;
          c++;
          do
          {
            tryToParseInt.insert(c, int.tryParse(textCode[k+a]));

            if (tryToParseInt[c] == null)
            {
              completeNumber = tryToParseInt[0];
              messageInCode.insert(g, completeNumber);
              g++;
              comma = false;
              validateRepeticions -= 2;
            }
            else
            {
              d++;
              a++;
              c++;
              tryToParseInt.insert(c, int.tryParse(textCode[k+a]));

              if (tryToParseInt[c] == null)
              {
                completeNumber = tryToParseInt[0]*10 + tryToParseInt[1];
                messageInCode.add(completeNumber);
                g++;
                comma = false;
                validateRepeticions -= 3;
                d++;
              }
              else
              {
                d++;
                completeNumber = tryToParseInt[0]*100 + tryToParseInt[1]*10 + tryToParseInt[2];
                messageInCode.add(completeNumber);
                g++;
                comma = false;
                validateRepeticions -= 3;
              }
            }
          } while (comma);
        }
        d++;
        k += d;
    } while (validateRepeticions >= 0);
  }

Обновленный код

validate(textEditingController) {
  int validateRepeticions = textEditingController.text.length;
  List textString = textEditingController.text.split('');
  List messageInCode = List();
  int k = 0;

  do {
    bool comma = true;
    List tryToParseInt = List();
    int d = 0; // 'd' is responsible for identifying the value of a number that has already been verified
    int a = 1; // 'a' increment values to k
    int c = 0; // 'c' defines the positions used in tryToParseInt
    int completeNumber;

    tryToParseInt.insert(c, int.tryParse(textString[k]));

    if (tryToParseInt[c] == null) {
      validateRepeticions--;
    } else {
      d++; //1
      c++; //1
      do {
        tryToParseInt.insert(c, int.tryParse(textString[k + a]));

        if (tryToParseInt[c] == null) {
          completeNumber = tryToParseInt[0];
          messageInCode.add(completeNumber);
          comma = false;
          validateRepeticions -= 2;
        } else {
          d++; //2
          a++; //2
          c++; //2
          tryToParseInt.insert(c, int.tryParse(textString[k + a]));

          if (tryToParseInt[c] == null) {
            completeNumber = tryToParseInt[0] * 10 + tryToParseInt[1];
            messageInCode.add(completeNumber);
            comma = false;
            validateRepeticions -= 3;
            d++;
          } else {
            d++;
            completeNumber = tryToParseInt[0] * 100 + tryToParseInt[1] * 10 + tryToParseInt[2];
            messageInCode.add(completeNumber);
            comma = false;
            validateRepeticions -= 3;
          }
        }
      } while (comma);
    }
    d++;
    k += d;
  } while (validateRepeticions > 0);
}

Сейчас почти работает, хотя ошибка все равно появляется: Метод _addFromInteger был вызван при нулевом значении. Получатель: ноль Пробовал вызывать: _addFromInteger(0)

validate(textEditingController) {
  int validateRepeticions = textEditingController.text.length;
  List textString = textEditingController.text.split('');
  List messageInCode = List();
  int k = 0;
  messageInCode.clear();

  do {
    bool comma = true;
    List tryToParseInt = List();
    int d = 0; // 'd' is responsible for identifying the positional value of a digit
    int a = 0; // 'a' increment values to k
    int c = 0; // 'c' defines the positions used in tryToParseInt
    int completeNumber;

    if (k < textEditingController.text.length) {
      tryToParseInt.insert(c, int.tryParse(textString[k]));

      if (tryToParseInt[c] == null) {
        validateRepeticions--;
      } else {
        d++; //1 these comments are examples
        c++; //1
        a++; //1

        do {
          if ((k + a) < textEditingController.text.length) {
            tryToParseInt.insert(c, int.tryParse(textString[k + a]));

            if (tryToParseInt[c] == null) {
              completeNumber = tryToParseInt[0];
              messageInCode.add(completeNumber);
              comma = false;
              validateRepeticions -= 2;
            } else {
              d++; //2
              a++; //2
              c++; //2

              if ((k + a) < textEditingController.text.length) {
                tryToParseInt.insert(c, int.tryParse(textString[k + a]));

                if (tryToParseInt[c] == null) {
                  completeNumber = tryToParseInt[0] * 10 + tryToParseInt[1];
                  messageInCode.add(completeNumber);
                  comma = false;
                  validateRepeticions -= 3;
                  d++;
                } else {
                  d++;
                  completeNumber = tryToParseInt[0] * 100 + tryToParseInt[1] * 10 + tryToParseInt[2];
                  messageInCode.add(completeNumber);
                  comma = false;
                  validateRepeticions -= 3;
                }
              } else {
                completeNumber = tryToParseInt[0] * 10 + tryToParseInt[1];
                messageInCode.add(completeNumber);
                comma = false;
                validateRepeticions -= 3;
                d++;
              }
            }
          } else {
            completeNumber = tryToParseInt[0];
            messageInCode.add(completeNumber);
            comma = false;
            validateRepeticions -= 2;
          }
        } while (comma);
      }
    } else {
      validateRepeticions--;
    }
    d++;
    k += d;
  } while (validateRepeticions > 0 && k < textEditingController.text.length);
}
0
0
871
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Замените textCode.insert(b, stringText[b]); на textCode.add(stringText[b]);

Проблема не в этой части кода, я это знаю, потому что превратил часть do в комментарий и никаких ошибок не появилось.

Rodivan Bitencourt 23.12.2020 15:31
Ответ принят как подходящий

В вашей функции я предполагаю, что параметр textController является TextEditingController. В этом случае вам нужно проверить длину с помощью textController.text.length

Чтобы создать список символов из строки, вам просто нужно использовать split() вместо создания нового списка и перебора строки. Например: textController.text.split('')

Я ценю подсказку функции split, она действительно очень полезна. Я обновил код, и теперь параметр textController получает TextEditingController. Но все равно появляется та же ошибка: RangeError (index): Invalid value: Not in inclusive range 0..6: 7

Rodivan Bitencourt 23.12.2020 16:01

Это строка кода, которая вызывает разрыв: int.tryParse(textString[k]) (а также k + a). Я думаю, проблема заключается в логике вашего утверждения do, которое изменяет validateRepeticions. Чтобы ограничить количество циклов, я предлагаю добавить еще 1 условие в оператор while, например while (validateRepeticions > 0 && k < text.length);, а затем отладить логику в вашем операторе do.

Bach 23.12.2020 18:14

Спасибо, что показали мне, где была ошибка. Я читал код и думал, как он будет обрабатывать текст, который я взял в качестве примера. Добавил проверки и теперь почти работает, хотя ошибка все равно появляется, не знаю чем она вызвана.

Rodivan Bitencourt 27.12.2020 18:00

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

Rodivan Bitencourt 27.12.2020 18:27

Другие вопросы по теме