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



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
}

因为我是长笛的新手,奋斗了很长时间。请引导我走正确的路。提前谢谢。

我不知道你使用了什么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);
}

然后在你的主要部分

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

希望这个示例代码可以帮助你解决这个问题

最新更新