【问题标题】:How to update and display data summed up from DB by BLoC pattern in flutter?如何在flutter中通过BLoC模式更新和显示从DB汇总的数据?
【发布时间】:2019-11-16 07:13:39
【问题描述】:

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
}

因为我是新来的长笛挣扎了很长时间。请以正确的方式指导我。提前致谢。

【问题讨论】:

  • @pskink 我已经阅读了这篇文章。我想我必须重构/修改我的小部件代码。
  • @pskink 即使我重构了我的小部件,如何将我的脚手架更改为流构建器?
  • 阅读一些关于FutureBuilder / StreamBuilder的教程

标签: flutter dart bloc


【解决方案1】:

好吧,我不知道您使用了哪种 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

    })
  }),
}

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

【讨论】:

  • 抱歉回复晚了,我使用的是 BLoC、Repository、Dao 模式。 ``` final _debtController = StreamController>.broadcast();得到债务 => _debtController.stream; /*DebtBloc({String query}) { getDebts(query: query); }*/ getDebts({String query}) async { //sink 是一种向流中添加数据的方法 //通过注册一个新事件 _debtController.sink.add(await _debtRepository.getAllDebts(query: query)); } ```
  • 并将总计添加到流中,如下所示 getTotalAmount() async { final totalAmount = await _debtRepository.getTotalAmt(); _debtController.sink.add(totalAmount); }
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2019-05-23
  • 2019-12-10
  • 2019-06-13
  • 2019-03-25
  • 2019-08-25
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多