。对我而言,期货似乎一直是造成混乱的根源。
我试图在页面上使用FutureBuilder,但是即使我可以在DBprovider返回之前立即打印数据,snapshot.data始终为null。
我有类'CentreDetailScreen',该类使用initState创建未来。
class _CentreDetailScreenState extends State<CentreDetailScreen> {
Future centreFuture;
@override
void initState() {
super.initState();
centreFuture = widget._centresBloc.getCentre(widget.centreReference);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: centreFuture,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return CircularProgressIndicator();
case ConnectionState.active:
case ConnectionState.waiting:
return CircularProgressIndicator();
case ConnectionState.done:
print('snapshot: ${snapshot.data}'); <-always null
return Container(...//build UI
在CentresBloc中,我有:
Future<ClimbingCentre> getCentre(String centreId) async {
print('BloC get Centre'); <-- this prints
var _centre = await ClimbDB.db.getCentre(centreId);
print('Bloc has got a centre $_centre') <-- this doesn't
return _centre;
}
,然后DBprovider ClimbDB具有:
Future<ClimbingCentre> getCentre(String centreId) async {
try {
var map = Map<String, dynamic>();
map['action'] = _GET_ONE_ACTION;
map['centreId'] = centreId;
final response = await http.post(
'http://xxx.xxx.xx.x/flutter/climbinside/centre.php',
body: map);
if (200 == response.statusCode) {
var centre = json.decode(response.body);
var toReturn =
centre.map((centre) => new ClimbingCentre.fromJson(centre));
print($toReturn); <-prints 'instance of ClimbingCentre'
return toReturn;
} else {
throw Exception('we were not able to download json data');
}
} catch (e) {
throw Exception('Get centre: unable to download JSON');
}
}
我尝试了很多不同的事情...有时我收到有关Future的错误不是Future的子类型...其他导致“无法下载JSON”异常触发...我无法弄清楚。
我将非常感谢您的帮助。
答案 0 :(得分:0)
您应始终检查snapshot
是否没有error
。
在您的情况下,由于使用var
定义了变量而出现了错误,这很棘手且容易出错,因为您没有得到编译器的全部帮助来让您知道代码将被破坏在运行时。始终尝试使用完全类型化的变量来避免这种麻烦,因此也请避免使用dynamic
。
您必须在存储库类中返回与T
相同类型Future<T>
的变量。
此外,请尽量不要丢弃Exception变量,以某种方式将其传递给新的Exception对象(将其传递给String
或理想情况下,将其作为内部Exception传递给构造函数),它包含有用的信息以调试您的代码。
答案 1 :(得分:0)
已解决:
在为ClimbingCentre的模型类中重写fromJson方法后,它起作用了。我最初遵循flutter.dev中的结构,就像这样:
ClimbingCentre.fromJson(Map<String, dynamic> json) {
centreId: json['CentreId'],
name: json['Name'],
imagePath: json['ImagePath'],
}
但是我将其更改为我在另一堂课中使用的:
factory ClimbingCentre.fromJson(Map<String, dynamic> jsonData) {
ClimbingCentre c = ClimbingCentre(
centreId: jsonData['CentreId'],
name: jsonData['Name'],
imagePath: jsonData['ImagePath'],
);
return c;
}