для цикла, показывающего флаттер ошибки диапазона

#flutter

Вопрос:

Следующий код показывает

 E/flutter ( 7354): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Exception: RangeError (index): Invalid value: Not in inclusive range 0..17: 18
E/flutter ( 7354): #0      List.[] (dart:core-patch/growable_array.dart:254:60)
E/flutter ( 7354): #1      parseStudent (package:xxx/screens/SearchActivity/main.dart:22:19)
E/flutter ( 7354): #2      _IsolateConfiguration.apply (package:flutter/src/foundation/_isolates_io.dart:81:34)
E/flutter ( 7354): #3      _spawn.<anonymous closure> (package:flutter/src/foundation/_isolates_io.dart:88:65)
E/flutter ( 7354): #4      _spawn.<anonymous closure> (package:flutter/src/foundation/_isolates_io.dart:87:5)
E/flutter ( 7354): #5      Timeline.timeSync (dart:developer/timeline.dart:163:22)
E/flutter ( 7354): #6      _spawn (package:flutter/src/foundation/_isolates_io.dart:85:35)
E/flutter ( 7354): #7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:286:17)
E/flutter ( 7354): #8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
 

это ошибка.

Код:

 Map<String, dynamic> map = json.decode(responseBody);
  List<dynamic> data = map["students"];
  //developer.log(data[0]);
  List<Student> stL = List<Student>();
  for(int i=0;data[i]!=null;i  ){
    Student student = Student(rollno:data[i]["username"],name:data[i]["name"],
        hostel:data[i]["hostel"],room:data[i]["room"],gender:data[i]["gender"]);
    stL.add(student);
  }
  developer.log(stL.toString());
  return stL;
 

developer.log() не называется.Может ли кто-нибудь дать решение?
Или есть лучший способ проанализировать JSON в список Student

Ответ №1:

Решение @Tipu приемлемо, но dart может предоставить более гибкий способ. Вы также можете использовать from именованный конструктор List .

 List<Student> stL = List<Student>.from(map['students'].map((element) =>
        Student(rollno:element["username"],name:element["name"],
            hostel:element["hostel"],room:element["room"],gender:element["gender"])
    ).toList());
 

Комментарии:

1. Сам Flutter использует этот метод во многих местах своего кода. Я не нахожу ни одного предложения с точки зрения производительности от flutter. Тем не менее, я наблюдаю это в большом списке в своем проекте, который имеет фиксированную длину, он обеспечил мне лучшую производительность, чем for foreach циклы or

2. У меня небольшой(максимум от 30 до 40) список переменных, а другой, кажется, быстрее.

Ответ №2:

Вместо использования List<dynamic> используйте Iterable .

   Iterable list = map['students'];
  list.forEach((element){
    Student student = Student(rollno:element["username"],name:element["name"],
      hostel:element["hostel"],room:element["room"],gender:element["gender"]);
    stL.add(student);
  });