我使用 FlutterBuilder 和 ListView.builder 创建了一个 Flutter 项目,它从 JSON 文件(本地)获取数据。我成功地构建了应用程序,但只是一秒钟的屏幕显示如下:
在那之后,我的应用程序运行顺利。 这是我的代码:
FutureBuilder(
future: _isInit ? fetchDoa(context) : Future(null),
builder: (context, _) {
if (doaList.isNotEmpty) {
return ListView.builder(
itemCount: doaList.length,
itemBuilder: (BuildContext context, int index) {
Doa doa = doaList[index];
return Card(
margin: EdgeInsets.all(8),
child: ListTile(
title: Text(doa.judul),
onTap: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) =>
DoaPage(
doa: doa,
)));
},
trailing: IconButton(
icon: Icon(
doa.fav
? Icons.favorite
: Icons.favorite_border,
color: doa.fav ? Colors.red : null,
),
onPressed: () => setState(() {
doa.fav = !doa.fav;
}),
)));
},
);
}
return CircularProgressIndicator();
})
这是我的应用程序的完整预览:
我需要你的帮助,非常感谢:)
答案 0 :(得分:1)
改变这个:
if (doaList.isNotEmpty)
进入这个:
if (doaList != null)
答案 1 :(得分:1)
这是因为您在以下行中有一个空数据:
if (doaList.isNotEmpty)
而您的 FutureBuilder
有点不正确。
您需要将您的 FutureBuilder
更新为如下所示:
// Change YourDoaList to your model.
FutureBuilder<YourDoaList>(
future: _isInit ? fetchDoa(context) : Future(null),
builder: (BuildContext context, AsyncSnapshot<YourDoaList> snapshot) {
Widget widget;
if (snapshot.hasData) {
// You have succesfully get the data.
// check if you have correct data here
YourDoaList items = snapshot.data;
widget = ListView.builder(
...
);
} else if (snapshot.hasError) {
// You've failed get the data
widget = Text("Failed");
} else {
// waiting for data
widget = CircularProgressIndicator();
}
return widget;
},
),
请参阅此处的文档:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
答案 2 :(得分:1)
将构建器设为
builder: (context, snapshot) {
if(snapshot.hasData){
if (doaList != null && doaList.isNotEmpty){
// UI
} else {
// no data available
}
} else {
// show loader or empty container
}
答案 3 :(得分:1)
虽然有很多好的答案。但是按照你现在的代码。只需在您定义 DAO 列表的位置添加 {}
。
喜欢
var daoList = [];
官方文档中的一件重要事情Link
<块引用>future 一定是更早获得的,例如在 State.initState、State.didUpdateWidget 或 State.didChangeDependencies 期间。在构造 FutureBuilder 时,它不能在 State.build 或 StatelessWidget.build 方法调用期间创建。如果future和FutureBuilder同时创建,那么每次重建FutureBuilder的parent时,异步任务都会重新启动。
所以在你的 initState 中,做
@override
void initState() {
myFuture = getFuture();
super.initState();
}
然后在 futureBuilder 中。
FutureBuilder(
future: myFuture,
remaining code
........