Flutter:文本小部件中的 sqflite 总金额为空

Flutter: sqflite sum amount is null in text widget

免责声明,总体而言,我对编码还很陌生,但我已经尝试研究了几天,还使用了此处几个类似问题的答案,但其中 none 似乎有效。感谢您对初学者的耐心等待。

我在我的数据库文件中使用原始查询如下

 Future getTotal() async {
    var db = await this.database;
    var result =
        await db.rawQuery("SELECT SUM(amount) as sum FROM $expensesTable");
    print(result.toString());
    return result;
  }

我正在尝试在文本小部件中显示数据库中“金额”列的总和。这是 UI 和文本小部件的代码:

class BudgetAppState extends State<BudgetApp> {
  ExpensesDatabase databaseHelper;
  ExpensesDatabase expensesDatabase = ExpensesDatabase();
  List<Expenses> expensesList;
  double getTotal;

  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
      onWillPop: () async => false,
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text("Budget App"),
          centerTitle: true,
          backgroundColor: Colors.blueAccent,
        ),
        drawer: NavigationDrawer(),
        body: Text(getTotal.toString()),
      ),
    );
  }

  void displayTotal() async {
    var total = await databaseHelper.getTotal();
    setState(() {
      print('$total');
      getTotal = total;
    });
  }
}

我的数据库中“金额”列中的各个行数据显示在我应用程序不同页面上的不同列表视图小部件中,但是当我尝试使用它来对所有“金额”求和时",此文本显示为空。任何帮助将不胜感激!

我认为您的 Text 小部件应该等到您的 async 被执行。
如果是这样,在这种情况下,你可以这样做。

Text(getTotal.toString() ?? "Loading"),

表示getTotalnull时显示“加载中”。

希望有用!

您实际上从未通过调用 displayTotal 方法来初始化 getTotal 属性。当您初始化小部件的状态时,请确保调用 displayTotal()。完成后,它将重建您的小部件并显示 getTotal.

的值

class BudgetAppState extends State<BudgetApp> {
  ExpensesDatabase databaseHelper;
  ExpensesDatabase expensesDatabase = ExpensesDatabase();
  List<Expenses> expensesList;
  double getTotal;

  @override
  void initState() {
    super.initState();
    displayTotal();
  }

  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
      onWillPop: () async => false,
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text("Budget App"),
          centerTitle: true,
          backgroundColor: Colors.blueAccent,
        ),
        drawer: NavigationDrawer(),
        body: Text(getTotal?.toString() ?? 'Loading...'),
      ),
    );
  }

  void displayTotal() async {
    var total = await databaseHelper.getTotal();
    setState(() {
      print('$total');
      getTotal = total;
    });
  }
}