Flutter 从数据库读取异步时,我的列表未显示
我有一个从数据库表sqllite读取数据的屏幕,但是数据没有显示在我的listview中。看起来,当我读取数据时,屏幕已经显示gui,并且在listview访问阵列时,我的阵列没有填充数据。 下面是我的代码Flutter 从数据库读取异步时,我的列表未显示,flutter,Flutter,我有一个从数据库表sqllite读取数据的屏幕,但是数据没有显示在我的listview中。看起来,当我读取数据时,屏幕已经显示gui,并且在listview访问阵列时,我的阵列没有填充数据。 下面是我的代码 import 'package:finsec/model/cardview_list_item.dart'; import 'package:flutter/material.dart'; import 'package:finsec/utils/strings.dart'; import
import 'package:finsec/model/cardview_list_item.dart';
import 'package:flutter/material.dart';
import 'package:finsec/utils/strings.dart';
import 'package:finsec/utils/colors.dart';
import 'package:finsec/widget/circle_icon.dart';
import 'package:finsec/data/db_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'package:finsec/utils/queries.dart';
class CardviewListItemData extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return CardviewListItemDataState();
}
}
class CardviewListItemDataState extends State<CardviewListItemData> {
DBProvider db = new DBProvider();
List<String> amountList;
List<CardviewListItem> listItems = List<CardviewListItem>();
int count = 0;
@override
Widget build(BuildContext context) {
if (amountList == null) {
amountList = List<String>();
updateListView();
listItems = summaryList();
}
return ListView.builder(
itemCount: listItems.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return ListTile(
leading: Icon(listItems[index].icon, color: listItems[index].iconColor),
title: Align(
child: new Text(listItems[index].title,style: TextStyle(fontSize: 16)),
alignment: Alignment(-1.4, 0),
),
trailing: new Text(listItems[index].amount, style: TextStyle(fontSize: 16),),
//onTap: () => onTapped(context, listItems[index].title),
);
},
);
}
List<CardviewListItem> summaryList() {
List<CardviewListItem> summaryListItems = List<CardviewListItem>();
CardviewListItem income = new CardviewListItem(
title: totalIncome,
amount: amountList[0],
icon: Icons.attach_money,
iconColor: green
);
summaryListItems.add(income);
return summaryListItems;
}
void updateListView() {
final Future<Database> dbFuture = db.initializeDatabase();
dbFuture.then((database) {
Future<List<String>> incomeListFuture = db.getDataList(test);
incomeListFuture.then((amountList) {
setState(() {
this.amountList = amountList;
this.count = this.amountList.length;
});
});
});
}
}
这是我对正在发生的事情的假设。有人同意我的观点吗?如何解决在listview中显示数据之前等待数据库返回数据的问题?提前感谢问题在于您正在调用setState方法并更新其amountList,因为setState重新加载页面时,它并没有完全执行listItems=summaryList 也许一个快速修复方法是创建bool检查并将其保留为false,在执行setState时将其设置为true,并在构建器方法中执行以下操作:
if (amountList == null) {
amountList = List<String>();
updateListView();
}
if(check){
listItems = summaryList();
}
注意:我建议在方法中使用async和Wait,而不是future
void updateListView() async{
final Database db = await db.initializeDatabase();
List<String> incomeList = await db.getDataList(test);
setState(() {
this.amountList = amountList;
this.count = this.amountList.length;
this.check = true;
});
}
我希望我帮助了你 哇,这很有效,谢谢。快速提问,为什么使用async和Wait而不是future?有什么好处吗?这是否意味着我还必须更改我的数据库类才能不使用future?请解释为什么使用async和Wait而不是future?其使用取决于您的用例,也取决于您的偏好。当使用async和wait时,您将通知颤振必须等待该项完成执行,以跟随执行,而对于future,它将继续执行其他方法。我不知道我是否很清楚!但我建议你在这里读一读:如果你标出答案并投赞成票,我将不胜感激,以便更多面临问题的人找到可能的解决办法!
RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter ( 3640):
I/flutter ( 3640): User-created ancestor of the error-causing widget was:
I/flutter ( 3640): Column file:///C:/Users/rodrigue33/Documents/APP/finsec/lib/widget/cardview_widget.dart:45:22
I/flutter ( 3640):
I/flutter ( 3640): When the exception was thrown, this was the stack:
I/flutter ( 3640): #0 List.[] (dart:core-patch/growable_array.dart:145:60)
I/flutter ( 3640): #1 CardviewListItemDataState.summaryList (package:finsec/data/cardview_list_item.dart:114:27)
I/flutter ( 3640): #2 CardviewListItemDataState.build (package:finsec/data/cardview_list_item.dart:80:19)
I/flutter ( 3640): #3 StatefulElement.build (package:flutter/src/widgets/framework.dart:4040:27)
if (amountList == null) {
amountList = List<String>();
updateListView();
}
if(check){
listItems = summaryList();
}
void updateListView() async{
final Database db = await db.initializeDatabase();
List<String> incomeList = await db.getDataList(test);
setState(() {
this.amountList = amountList;
this.count = this.amountList.length;
this.check = true;
});
}