如何在Flutter中使用sqflite保存数据?

时间:2019-05-21 11:40:01

标签: flutter behaviorsubject bloc stream-builder

我在颤振方面几乎没有开发任何应用程序,可以进行一些计算, 我正在使用sqflite流从BehaviorSubject数据库加载用于计算的默认值,

然后我在屏幕上显示数据,通过点击计算按钮,用户可以计算结果,结果显示在颤振表小部件中。

现在我需要将计算结果保存在数据库中以备将来参考,

问题是如何访问表中的计算结果。

这是我的代码。

我的BloC类

class ConcreteBLoC extends EstimationBlocBase {
  final int typeId;
  BLoCProvider provider;

  BehaviorSubject<EstimationResult> _subjectCalcResult;

  ConcreteBLoC(this.typeId) {
     provider = BLoCProvider(typeId);
    _subjectCalcResult = new BehaviorSubject<EstimationResult>();
    provider.getInitialData().then((onValue)=>{
      _subjectCalcResult.add(onValue)
    });
  }

  Observable<EstimationResult> resultObservable() {
    return _subjectCalcResult.stream;
  }

  void updateResult(String length, String width, String thick, int selectedRatio) {
    provider.calculateResult(length, width, thick, selectedRatio);
    _subjectCalcResult.add(provider.result);
  }

  void dispose() {
    _subjectCalcResult.close();
  }
}

在此组中,我加载默认数据并添加到接收器。

我的BlocProvider

class BLoCProvider {
    // ...... More codes here
  Future<EstimationResult> getInitialData() async{
    List<Material> resultList = new List();
    List<Material> materials = await materialRepository.getMaterialsForEsType(id); 
    var material;
    materials.forEach((f)=>{
      material = new Material(),
      material.name = f.name,
      material.id = f.id,
      material.qty = 0.0,
      material.unit = "kg",

      resultList.add(material)
    });

    var estimation = new EstimationResult();
    estimation.materials = resultList;
    estimation.totalRootMaterialValue = 0.0;
    estimation.rootMatrialText = "Total concrete area : ";
    return estimation;
  }
  // ....... More codes here!
}

从数据库加载初始数据

我的Statefulwidget构建方法

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: ... APP BAR CODE
        body: GestureDetector(
          onTap: () {
            FocusScope.of(context).requestFocus(new FocusNode());
          },
          child: CustomScrollView(
            slivers: <Widget>[
              SliverList(
                delegate: SliverChildListDelegate([
                  Container(
                    padding: EdgeInsets.all(15.0),
                    child: StreamBuilder<EstimationResult>(
                        stream: _bloc.resultObservable(),
                        builder: (context,
                            AsyncSnapshot<EstimationResult> snapshot) {
                          if (snapshot.hasData) {
                            return _buildMainUI(snapshot.data);
                          }else{
                            return new Center(child: new CircularProgressIndicator());
                          }
                        }),
                  )
                ]),
              )
            ],
          ),
        ));
  }

使用流数据创建小部件UI

 Widget _buildMainUI(EstimationResult data) {
    return Column(
      children: <Widget>[
        Form(
          key: _formKey,
          autovalidate: _autoValidate,
          child: _formUI(),
        ),
        ButtonBar(
          alignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            cw.getRaisedButton(Colors.white, Theme.of(context).buttonColor,
                "CALCULATE", _calculate),
            cw.getRaisedButton(
                Colors.white, Theme.of(context).buttonColor, "SAVE", _save),
            cw.getRaisedButton(
                Colors.white, Theme.of(context).buttonColor, "RESET", _reset),
          ],
          mainAxisSize: MainAxisSize.max,
        ),
        cw.getDividerWidget(Theme.of(context).dividerColor),
        _buildCalculationResultTable(data),
      ],
    );
  }

在这里,我有“计算”按钮,当用户单击“计算”按钮时,它将调用bloc的计算方法并返回一些计算结果,并将再次反映在_buildCalculationResultTable

现在我需要知道如何将结果保存到db吗?

我们不能使用Bloc的BehaviorSubject保存数据吗?还是必须将带有数据的模型再次传递给bloc?

我很陌生,所以,请帮助我解决这个问题,

谢谢!

0 个答案:

没有答案