【发布时间】:2018-12-04 14:30:40
【问题描述】:
编辑:我已经编辑了下面的代码,以使用获取数据的方法以及构建火车估计的小部件(将所有 API 信息替换为 "API_URL" 和 @ 987654322@)。我希望这能更好地帮助我们找出问题所在!我非常感谢任何人可以提供的任何信息——我一直在为这个项目努力工作!再次感谢大家!
原帖: 我有一个 ListTiles 的 ListView,每个都有一个尾随小部件,该小部件在新的 Text 小部件中构建火车到达估计值。这些尾随小部件每五秒更新一次(由打印语句证明)。当应用程序从火车的 API 获取数据时,它会显示一个“无数据”文本小部件,该小部件由 _buildEstimatesNull() 构建。
但是,问题是即使应用程序已完成获取数据和_isLoading = false(已通过打印语句证明),仍然显示“无数据”。尽管如此,即使解决了这个问题,火车估计也会很快过时,因为尾随的小部件每五秒就会自行更新一次,但这不会反映在实际的应用程序中,因为小部件是在页面加载时构建的。因此,每当它们获取新信息时,我需要一种方法来重建那些尾随小部件。
有没有办法让 Flutter 每五秒自动重建 ListTile 的尾随小部件(或者每当 _buildEstimatesS1 更新/尾随小部件的内部更新时)?
class ShuttleApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new ShuttleState();
}
}
class ShuttleState extends State<ShuttleApp> {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new HomeState();
}
}
class HomeState extends State<HomeScreen> {
var _isLoading = true;
void initState() {
super.initState();
_fetchData();
const fiveSec = const Duration(seconds: 5);
new Timer.periodic(fiveSec, (Timer t) {
_fetchData();
});
}
var arrivalsList = new List<ArrivalEstimates>();
_fetchData() async {
arrivalsList.clear();
stopsList.clear();
final url = "API_URL";
print("Fetching: " + url);
final response = await http.get(url);
final busesJson = json.decode(response.body);
if (busesJson["service_id"] == null) {
globals.serviceActive = false;
} else {
busesJson["ResultSet"]["Result"].forEach((busJson) {
if (busJson["arrival_estimates"] != null) {
busJson["arrival_estimates"].forEach((arrivalJson) {
globals.serviceActive = true;
final arrivalEstimate = new ArrivalEstimates(
arrivalJson["route_id"], arrivalJson["arrival_at"], arrivalJson["stop_id"]
);
arrivalsList.add(arrivalEstimate);
});
}
});
}
setState(() {
_isLoading = false;
});
}
Widget _buildEstimateNull() {
return new Container(
child: new Center(
child: new Text("..."),
),
);
}
Widget _buildEstimateS1() {
if (globals.serviceActive == false) {
print('serviceNotActive');
_buildEstimateNull();
} else {
final String translocStopId = "API_STOP_ID";
final estimateMatches = new List<String>();
arrivalsList.forEach((arrival) {
if (arrival.stopId == translocStopId) {
estimateMatches.add(arrival.arrivalAt);
}
});
estimateMatches.sort();
if (estimateMatches.length == 0) {
print("zero");
return _buildEstimateNull();
} else {
return new Container(
child: new Center(
child: new Text(estimateMatches[0]),
),
);
}
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
backgroundColor: const Color(0xFF171717),
appBar: new AppBar(),
body: new DefaultTextStyle(
style: new TextStyle(color: const Color(0xFFaaaaaa),),
child: new ListView(
children: <Widget>[
new ListTile(
title: new Text('S1: Forest Hills',
style: new TextStyle(fontWeight: FontWeight.w500, fontSize: 20.0)),
subtitle: new Text('Orange Line'),
contentPadding: new EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0),
trailing: _isLoading ? _buildEstimateNull() : _buildEstimateS1(),
),
],
),
)
);
}
class ArrivalEstimates {
final String routeId;
final String arrivalAt;
final String stopId;
ArrivalEstimates(this.routeId, this.arrivalAt, this.stopId);
}
非常感谢您提供的任何帮助!我真的超级感激! :)
【问题讨论】:
-
有点太宽泛了。有一点代码会有所帮助,足以重现和解决问题
-
@RémiRousselet 我已经使用获取数据的方法以及在应用程序主体中构建火车估计的小部件更新了原始帖子。谢谢你的建议!
-
包含运行应用程序时的日志会很有帮助 - 没有它,很难说出实际发生的情况。但是 1:你确定 busJson["service_id"] != null 吗?并且 2:对象的“状态”是到达列表以及 _isLoading - 也应该在 setState 中设置。而不是重复使用相同的列表,您可能应该每次都制作一个新列表。 3:在 _buildEstimateS1 中,如果服务未激活,您不会返回 _buildEstimateNull 的结果。