#mysql #json #flutter #dart
#mysql #json #flutter #dart
Вопрос:
здравствуйте, я создаю новое приложение flutter, и я новичок в flutter, я использую базу данных mysql и получаю ответ в виде json. Вот мой отформатированный ответ json :
JsonResponse
{
"folders":[
{
"id":2107,
"name":"Labs ",
"img":null,
"haschild":1,
"parentid":1955,
"createdate":"2019-09-30 03:00:39",
"inarchive":0,
"active":1
},
{
"id":2108,
"name":"L1",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-09-30 03:00:45",
"inarchive":0,
"active":1
},
{
"id":2130,
"name":"L2",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-02
02:39:11",
"inarchive":0,
"active":1
},
{
"id":2175,
"name":"L3",
"img":null,
"haschild":1,
"parentid":1955,
"createdate":"2019-10-07 03:43:15",
"inarchive":0,
"active":1
},
{
"id":2202,
"name":"L4",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-09 02:08:10",
"inarchive":0,
"active":1
},
{
"id":2227,
"name":"u0645u0631u0627u062cu0639u0627u062a
",
"img":null,
"haschild":1,
"parentid":1955,
"createdate":"2019-10-11 05:15:43",
"inarchive":0,
"active":1
},
{
"id":2242,
"name":"L5",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-14 03:45:24",
"inarchive":0,
"active":1
},
{
"id":2257,
"name":"L6",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-16
06:23:41",
"inarchive":0,
"active":1
},
{
"id":2269,
"name":"L7",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-21 03:39:12",
"inarchive":0,
"active":1
},
{
"id":2309,
"name":"L8",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-23 05:14:48",
"inarchive":0,
"active":1
},
{
"id":2310,
"name":"L8",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-23
05:14:51",
"inarchive":0,
"active":1
},
{
"id":2346,
"name":"L9",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-28 04:22:24",
"inarchive":0,
"active":1
},
{
"id":2370,
"name":"L10",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-10-30 03:02:00",
"inarchive":0,
"active":1
},
{
"id":2446,
"name":"L11",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-12
06:28:13",
"inarchive":0,
"active":1
},
{
"id":2462,
"name":"u062au0628u064au0636u0627u062a",
"img":null,
"haschild":1,
"parentid":1955,
"createdate":"2019-11-13 08:39:00",
"inarchive":0,
"active":1
},
{
"id":2464,
"name":"L12",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-13
08:40:55",
"inarchive":0,
"active":1
},
{
"id":2488,
"name":"L13",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-18 06:09:11",
"inarchive":0,
"active":1
},
{
"id":2490,
"name":"L14",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-18 06:38:59",
"inarchive":0,
"active":1
},
{
"id":2491,
"name":"L15",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-18
06:45:57",
"inarchive":0,
"active":1
},
{
"id":2497,
"name":"u062au0644u062eu064au0635u0627u062a",
"img":null,
"haschild":1,
"parentid":1955,
"createdate":"2019-11-19 04:24:49",
"inarchive":0,
"active":1
},
{
"id":2509,
"name":"L16",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-20
09:56:04",
"inarchive":0,
"active":1
},
{
"id":2522,
"name":"L17",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-25 06:38:27",
"inarchive":0,
"active":1
},
{
"id":2542,
"name":"L18",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-27 12:19:12",
"inarchive":0,
"active":1
},
{
"id":2552,
"name":"Protein
Lab",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-27 16:32:27",
"inarchive":0,
"active":1
},
{
"id":2562,
"name":"Chromatography ",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-11-30 15:24:24",
"inarchive":0,
"active":1
},
{
"id":2576,
"name":"L19",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-02
02:05:29",
"inarchive":0,
"active":1
},
{
"id":2580,
"name":"L20",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-02 08:23:48",
"inarchive":0,
"active":1
},
{
"id":2592,
"name":"21",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-03 06:27:24",
"inarchive":0,
"active":1
},
{
"id":2600,
"name":"L22",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-04
06:22:46",
"inarchive":0,
"active":1
},
{
"id":2614,
"name":"L23",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-04 10:03:00",
"inarchive":0,
"active":1
},
{
"id":2640,
"name":"L24",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-08 06:53:11",
"inarchive":0,
"active":1
},
{
"id":2644,
"name":"L25",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-09
05:33:07",
"inarchive":0,
"active":1
},
{
"id":2649,
"name":"L26",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-09 07:58:42",
"inarchive":0,
"active":1
},
{
"id":2711,
"name":"u0623u0633u0626u0644u0629",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-12-19
05:18:11",
"inarchive":0,
"active":1
}
],
"files":[
{
"id":4542,
"name":"Ch2-part1.m4a 27.52MB",
"img":null,
"uploader":"Aws",
"url":"http://msc-mu.com/../uploaded/031020190Ch2-part1.m4a",
"createdate":"2019-10-03 09:53:39",
"approved":1,
"active":1
}
]
}
И всякий раз, когда я пытаюсь реализовать список папок и файлов, он говорит, что внутри списка ничего нет, и его значение null
вот мой код :
fellow.dart
class SecondScreen extends StatefulWidget {
final YearsMain value;
SecondScreen({Key key, this.value}) : super(key: key);
@override
_SecondScreenState createState() => _SecondScreenState();
}
class _SecondScreenState extends State<SecondScreen> {
List<Folders> list= <Folders>[];
Future<List<Folders>> getData() async {
String link = "http://msc-mu.com/api_verfication.php";
try {
var res = await http.post(link,
body: {
'flag': 'selectfellowsubjects',
'parentsubject': widget.value.id
});
print(res.body);
if (res.statusCode == 200) {
var data = json.decode(res.body);
var rest = data["folders"].forEach((v) {
list.add(Folders.fromJson(v));
});
print(rest);
}
return list;
} catch (e) {
debugPrint('$e');
}
}
Widget listViewWidget(List<Folders> article) {
return Container(
child: ListView.builder(
itemCount: 20,
padding: const EdgeInsets.all(2.0),
itemBuilder: (context, position) {
return Card(
child: ListTile(
title: Text(
'${article[position].name}',
style: TextStyle(
fontSize: 18.0,
color: Colors.black,
fontWeight: FontWeight.bold),
),
onTap: () => _onTapItem(context, article[position]),
),
);
}),
);
}
void _onTapItem(BuildContext context, Folders folders) {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => DownloadPage()));
}
@override
void initState() {
// TODO: implement initState
super.initState();
print(widget.value.id);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: new FutureBuilder<List<Folders>>(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasData) {
List fellow = snapshot.data;
return listViewWidget(fellow);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return CircularProgressIndicator();
},
),
),
);
}
}
функция получила список «папок», но это результат :
I/flutter (32601): NoSuchMethodError: The method '[]' was called on null.
I/flutter (32601): Receiver: null
I/flutter (32601): Tried calling: []("id")
и это мой Folders.class
class Folders {
String id;
String name;
Folders({this.id, this.name});
factory Folders.fromJson(Map<String, dynamic> json)=> Folders(id: json["folders"]["id"].toString(),name: json["folders"]["name"]);
}
я делаю что-то не так?
Комментарии:
1. всегда полезно посмотреть, какая строка выдает ошибку
2. как я могу это увидеть?
Ответ №1:
Удалить ['folders']
в
factory Folders.fromJson(Map<String, dynamic> json)=> Folders(id: json["folders"]["id"].toString(),name: json["folders"]["name"]);
Вы уже просматриваете папки data["folders"].forEach
и передаете каждый объект в конструктор.
Поэтому ни один отдельный объект не имеет свойства ‘папки’.
{
"id":2108,
"name":"L1",
"img":null,
"haschild":0,
"parentid":1955,
"createdate":"2019-09-30 03:00:45",
"inarchive":0,
"active":1
},
Комментарии:
1. могу я спросить вас еще кое о чем?
2. я хочу получить значение этого списка в другой класс, как я могу это сделать, поскольку вы можете видеть, что функция вызывает другое значение списка с помощью (widget.value.id ), но я, кажется, не могу сделать то же самое в этом, почему? этот список прост
3. Вы пытались передать список в другой класс в качестве параметра?