JSON/Datatable:未来<dynamic>不是类型的子类型



我是flutter的新手,但我做了很多工作来学习项目所需的一切。

我有一个服务器使用HTTP:发送的JSON

[{"equipe1":"PSG","equipe2":"DIJON","type_prono":"1N2"},
{"equipe1":"MONACO","equipe2":"REIMS","type_prono":"1N2"},
{"equipe1":"TOULOUSE","equipe2":"RENNES","type_prono":"1N2"},`{"equipe1":"MONTPELLIER","equipe2":"STRASBOURG","type_prono":"1N2"},{"equipe1":"AMIENS","equipe2":"METZ","type_prono":"1N2"},{"equipe1":"BREST","equipe2":"ANGERS","type_prono":"1N2"},{"equipe1":"LORIENT","equipe2":"CHAMBLY","type_prono":"1N2"}]`

我试着把它设置成一个数据表小部件,但这似乎很复杂

现在是我的全部代码:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:async';
// Create a Form widget.
class Affiche_grille extends StatefulWidget {
@override
Affiche_grille_State createState() {
return Affiche_grille_State();
}
}
// Create a corresponding State class.
// This class holds data related to the form.
class Affiche_grille_State extends State<Affiche_grille> {
@override
final _formKey = GlobalKey<FormState>();
Grille_display() async {
// SERVER LOGIN API URL
var url = 'http://www.axis-medias.fr/game_app/display_grid.php';
// Store all data with Param Name.
var data = {'id_grille': 1};
// Starting Web API Call.
var response = await http.post(url, body: json.encode(data));
// Getting Server response into variable.
var match = json.decode(response.body);
return match;
}
Widget build(BuildContext context) {
// Build a Form widget using the _formKey created above.
var valjson = Grille_display();
var ListEquipe=EquipeList(breed: [valjson]);
return Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
DataTable(
columnSpacing: 20,
columns: [
DataColumn(
label: Text("Eq 1"),
numeric: false,
tooltip: "",
),
DataColumn(
label: Text("Eq 2"),
numeric: false,
tooltip: "",
),
DataColumn(
label: Text("Type pro"),
numeric: false,
tooltip: "",
),
],
rows: ListEquipe.breed.map((Match_detail) => DataRow(
cells: [
DataCell(
Text(Match_detail.equipe1.toString()),
),
DataCell(
Text(Match_detail.equipe2.toString()),
),
DataCell(
Text(Match_detail.typeProno.toString()),
),
]),
).toList(),
)
],
)
);
}
}
class Match_detail {
String equipe1;
String equipe2;
String typeProno;
Match_detail({this.equipe1, this.equipe2, this.typeProno});
Match_detail.fromJson(Map<String, dynamic> json) {
equipe1 = json['equipe1'];
equipe2 = json['equipe2'];
typeProno = json['type_prono'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['equipe1'] = this.equipe1;
data['equipe2'] = this.equipe2;
data['type_prono'] = this.typeProno;
return data;
}
}
class EquipeList {
List <Match_detail> breed;
EquipeList({this.breed});
factory EquipeList.fromJson(List<dynamic> json) {
return EquipeList(
breed: json
.map((e) => Match_detail.fromJson(e as Map<String, dynamic>))
.toList());
}
}

我现在已经更改了最后的信息,但现在没有来自flutter/dart的错误,但在android上模拟时出现错误,我有一个错误

类型"Future"不是类型"Match_detail"的子类型

因为您不能从类本身访问实例成员。

class EquipeList {
List<Match_detail> breeds;
EquipeList({this.breeds});
...
}

breeds是实例成员(没有static修饰符(。

您需要构造一个实例,然后访问其成员,而不是EquipeList.breeds

var equipeList = EquipeList(breeds: [ ... ]);
...
rows: equipeList.breeds.map( ... ).toList()

静态成员/实例成员

class Demo {
// Static member
static int var1;
// Instance member
int var2;
}
class AnotherClass {
void main() {
// Accessing static member via class
Demo.var1 = 15;   // works
// Accessing instance member via instance
var inst = Demo();
inst.var2 = 24;   // works
// Accessing static member via instance
inst.var1 = 45;   // fails
// Accessing instance member via class
Demo.var2 = 64;   // fails
}
}

使用FutureBuilder构建小工具。

@override
Widget build(BuildContext context) {
return FutureBuilder<List<Match_detail>>(
future: Grille_display(),
builder: (context, snapshot) {
if (!snapshot.hasData) return Container();
return Form(/* ... */);
});
}
Future<List<Match_detail>> Grille_display() async {
// ...
return EquipeList.fromJson(response.body);
}

将JSON字符串转换为列表。


class EquipeList {
// ...
factory EquipeList.fromJson(String jsonArrayString) {
List<Map<String, dynamic>> jsonMapList =
json.decode(jsonArrayString).cast<Map<String, dynamic>>();
List<Match_detail> result = jsonMapList
.map((json) => Match_detail.fromJson(json))
.cast<Match_detail>()
.toList();
return EquipeList(breed: result);
}
}

请参阅有效的Dart:Style,如果我们在整个Dart生态系统中使用一致的风格,我们所有人都可以更容易地学习和贡献彼此的代码。

相关内容

最新更新