Я разработал небольшое приложение во флаттере, чтобы сделать некоторые вычисления, я загружаю значения по умолчанию для расчета из базы данных 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
Или мы должны пройтимодель с данными для блока снова?
Я новичок во флаттере, поэтому, пожалуйста, помогите мне решить эту проблему,
Спасибо!