Flutter 从数据库读取异步时,我的列表未显示

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

我有一个从数据库表sqllite读取数据的屏幕,但是数据没有显示在我的listview中。看起来,当我读取数据时,屏幕已经显示gui,并且在listview访问阵列时,我的阵列没有填充数据。 下面是我的代码

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;
  });


}