如何在抖动中更新和显示通过BLoC模式从DB汇总的数据?

时间:2019-11-16 07:13:39

标签: flutter dart bloc

debt_dao.dart

Future totalAmount() async {
    final db = await dbProvider.database;
    var result = await db.rawQuery("SELECT SUM(amount) as Total FROM $debtDetailsTable");
    var total = result[0]['Total'];
    print(total); // It prints expected value ex. 1400
    return total;
  }

debt_repository.dart

Future getTotalAmt() => debtDao.totalAmount();

debt_bloc.dart

getTotalAmount() async {
    await _debtRepository.getTotalAmt();
  }

我想在这里显示输出,尽管像下面这样,它仅显示 null

debt_details.dart

Widget build(BuildContext context) {
    int _total;

    void calculateTotal() {
      _total = debtBloc.getTotalAmount();
    }

    return Scaffold(
      appBar: AppBar(
        title: Text(_total.toString()), // Total should show/updated here
      ),

还有一件事,每当我在表单中添加数据时,我都有一个表单,总计应该更新。

debt_form.dart

saveDetails() async {
await debtBloc.getTotalAmount(); // Even this prints null only
}

因为我是长笛苦苦挣扎的新手。请以正确的方式指导我。预先感谢。

1 个答案:

答案 0 :(得分:0)

好吧,我不知道您使用了哪种BLOC模式,但是根据我的情况,我使用rxdart来使用BLOC模式。 假设您的数据库是这样的

Future<double> totalAmount() async {
    final db = await dbProvider.database;
    var result = await db.rawQuery("SELECT SUM(amount) as Total FROM $debtDetailsTable");
    double total = result[0]['Total'];
    return total;
}

然后在您的bloc.dart中

final BehaviorSubject<Future<double>> _totalAmount = BehaviorSubject<Future<double>>();
Observable<Future<double>> get totalAmount => _totalAmount.stream;

Future<double> getTotalAmount(){
    final totalAmount = totalAmount();
    _totalAmount.sink.add(totalAmount);
}

然后在您的main.dart中

Widget build(BuildContext context) {
int _total;

bloc.getTotalAmount();

return Scaffold(
  appBar: StreamBuilder(stream: bloc.totalAmount, builder:(Buildcontext context, Asyncsnapshot<Future<double>> snapshot){
    if(!snapshot.hasdata){
        // return no data
    }

    return FutureBuilder(future: snapshot.data, builder:(Buildcontext context, Asyncsnapshot<double> amountSnapshot){
        if(!amountSnapshot.data){
            // return no data
        }

        return AppBar(
    title: Text(_total.toString()), // Total should show/updated here

    })
  }),
}

希望此示例代码可以帮助您解决此问题