Как сохранить данные, используя sqflite во флаттере? - PullRequest
0 голосов
/ 21 мая 2019

Я разработал небольшое приложение во флаттере, чтобы сделать некоторые вычисления, я загружаю значения по умолчанию для расчета из базы данных 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();
  }
}

В этом блоке я загружаю данные по умолчанию и добавляю в сток.

My 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());
                          }
                        }),
                  )
                ]),
              )
            ],
          ),
        ));
  }

Создание пользовательского интерфейса виджета с использованием потоковых данных

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

Здесь у меня есть кнопка вычисления, когда пользователь нажимает кнопку вычисления, которая вызывает метод вычисления блока и возвращает некоторые результаты вычислений, и этоЯ снова должен подумать _buildCalculationResultTable

Теперь мне нужно знать, как сохранить этот результат в дБ?

Разве мы не можем сохранить данные, используя блок BehaviorSubject Или мы должны пройтимодель с данными для блока снова?

Я новичок во флаттере, поэтому, пожалуйста, помогите мне решить эту проблему,

Спасибо!

...