flutter - FutureBuilder 构建错误而不是正常部分
问题描述
我花了几天时间调试,但似乎我没有足够的经验或做错了什么。
我创建了一个小的复制过去准备好的错误示例:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
class TotalDbStat {
int notificationsTotalCount;
TotalDbStat({
this.notificationsTotalCount,
});
factory TotalDbStat.fromJson(Map<String, dynamic> json) {
return TotalDbStat(
notificationsTotalCount: 123
);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Future<TotalDbStat> answer = jobStatusTotal();
@override
build(BuildContext context) {
return FutureBuilder<TotalDbStat> (
future: answer,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Text('Loading....');
default:
if (snapshot.hasData) {
print(snapshot.data);
return Text(snapshot.data.notificationsTotalCount.toString());
} else if (snapshot.hasError) {
print(snapshot);
return Text("${snapshot.error}");
}
return Text("data");
}
}
);
}
}
Future<TotalDbStat> jobStatusTotal() async {
http.get('http://127.0.0.1:5001/status?total').then((value) {
if(value.statusCode == 200) {
Map<String, dynamic> valueMap = jsonDecode(value.body)['data'];
print(valueMap); // this part work I see in console: {notificationsTotalCount: 3948}
return TotalDbStat.fromJson(valueMap);
}
else {
print("SOME WRONG CODE");
}
}).catchError( (e) {
print(e);
throw "jobStatusTotal error";
}
);
throw "jobStatusTotal error";
}
我认为模型中可能存在问题,所以我尝试对值进行硬编码:
notificationsTotalCount: 123
但这无济于事。有任何想法吗?
解决方案
你的方法jobStatusTotal
实际上并没有返回任何东西。它只是触发您的then
链条并继续引发异常。
我强烈建议您使用async
/而不是await
链接.then
,因为这些错误更容易发现,因此更难制造。
这就是您的方法的样子:
Future<TotalDbStat> jobStatusTotal() async {
const value = await http.get('http://127.0.0.1:5001/status?total');
if(value.statusCode == 200) {
Map<String, dynamic> valueMap = jsonDecode(value.body)['data'];
return TotalDbStat.fromJson(valueMap);
} else {
print("SOME WRONG CODE");
return null; // decide what to do here! Maybe throw something?
}
}
推荐阅读
- mysql - 使用 mysql.time_zone_transition_type 制作 MySQL 源代码
- excel - 动态滚动相关excel
- google-cloud-platform - GCP IAM 用户删除日志
- firebase - 如何编写查询firebase
- reactjs - 如何使用 Axios 发送表单数据并做出原生反应?
- python - WA bot 中的多级菜单,每个级别都有相同的数字。我怎样才能做到这一点
- flutter - 如何在 Dart / Flutter pdf 库中使用 drawBox、drawEllipse 或 drawLine 方法
- c++ - unscoped-enum 的显式 ctor 及其底层类型
- java - Java compare.comparing(o->x).reversed 不起作用
- javascript - 是否可以批量更改 slickgrid 中分组行的单元格值?