#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
циклы or2. У меня небольшой(максимум от 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);
});