Я новичок, чтобы трепетать, я пытаюсь выполнить операцию CRUD с помощью Firestore до этого я завершил.
У меня здесь 2 проблемы ..
- И когда я пытаюсь с промежуточным итогом, он не перерисовывает виджет ROW промежуточного итога, который подсчитывается в самом Streambuilder. Итоговое значение всегда отображается как ноль, но должно отображаться как общее значение
- Идентификатор также не обновляется (рядом с именами)
Моя цель - когда я нажимаю кнопку «Создать», в ней необходимо сохранить данные в пожарном хранилище и должны отображаться в виде списка и промежуточного итога в нижней части моей деятельности, а следующий идентификатор должен отображаться для следующей записи. В будущем вместе с промежуточным итогом я собираюсь добавить Ранг также в другой виджет Строка под виджетом Общая строка.
Мой код
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FireBase CRUD',
debugShowCheckedModeBanner: false,
theme: ThemeData(
brightness: Brightness.dark,
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Points'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int id, agila, ravi, jothi, bharath, rownum; //Used for Firestore CRUD
int agilaTotal, raviTotal, jothiTotal, bharathTotal; //Used for SubTotal
final TextEditingController agController = new TextEditingController();
final TextEditingController raController = new TextEditingController();
final TextEditingController joController = new TextEditingController();
final TextEditingController bbController = new TextEditingController();
@override
void initState() {
super.initState();
id = 1;
agila = 0;
ravi = 0;
jothi = 0;
bharath = 0;
agilaTotal = 0;
raviTotal = 0;
jothiTotal = 0;
bharathTotal = 0;
rownum = 0;
}
getAgila(String agila) {
this.agila = int.parse(agila);
print("Agila: $agila");
}
getRavi(String ravi) {
this.ravi = int.parse(ravi);
print("Ravi: $ravi");
}
getJothi(String jothi) {
this.jothi = int.parse(jothi);
print("Jothi: $jothi");
}
getBharath(String bharath) {
this.bharath = int.parse(bharath);
print("Bharath: $bharath");
}
CreateData() {
DocumentReference docRef =
Firestore.instance.collection("points").document(id.toString());
//in above line instead of name we can pass uniqueid
Map<String, dynamic> docs = {
"id": id,
"agila": agila,
"ravi": ravi,
"jothi": jothi,
"bharath": bharath
};
docRef.setData(docs).whenComplete(() {
print("$id document/row Created successfully..");
agController.clear();
raController.clear();
joController.clear();
bbController.clear();
//id = id + 1;
agila = 0;
ravi = 0;
jothi = 0;
bharath = 0;
});
}
ReadData() {
//print("Read");
id = id - 1;
print(id.toString());
DocumentReference docRef =
Firestore.instance.collection("points").document(id.toString());
docRef.get().then((datasnapshot) {
//datasnapshot gives specific document of all fields
print(datasnapshot.data["agila"].toString());
print(datasnapshot.data["ravi"].toString());
print(datasnapshot.data["jothi"].toString());
print(datasnapshot.data["bharath"].toString());
agController.text = datasnapshot.data["agila"].toString();
raController.text = datasnapshot.data["ravi"].toString();
joController.text = datasnapshot.data["jothi"].toString();
bbController.text = datasnapshot.data["bharath"].toString();
});
}
DeleteData() {
//print("Delete");
DocumentReference docRef;
docRef = Firestore.instance.collection("points").document(id.toString());
/*if (agController.text.toString() == "-1")
{
//docRef = Firestore.instance.collection("points")
print("Deleted Successfully");
}
else
{
docRef = Firestore.instance.collection("points").document(id.toString());
}
*/
docRef.delete().whenComplete(() {
print("$id Deleted Successfully..");
});
}
UpdateData() {
DeleteData();
CreateData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Padding(
padding: EdgeInsets.only(left: 5.0),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Text("Names:"),
),
Expanded(
child: Text("Id:$id"),
),
],
),
Row(
children: <Widget>[
Expanded(
child: TextField(
decoration: InputDecoration(labelText: "Agila"),
keyboardType: TextInputType.number,
controller: agController,
onChanged: (String value) {
getAgila(value);
},
),
),
Expanded(
child: TextField(
decoration: InputDecoration(labelText: "Ravi"),
controller: raController,
keyboardType: TextInputType.number,
onChanged: (String value) {
getRavi(value);
},
),
),
Expanded(
child: TextField(
decoration: InputDecoration(labelText: "Jothi"),
controller: joController,
keyboardType: TextInputType.number,
onChanged: (String value) {
getJothi(value);
},
),
),
Expanded(
child: TextField(
decoration: InputDecoration(labelText: "Bharath"),
controller: bbController,
keyboardType: TextInputType.number,
onChanged: (String value) {
getBharath(value);
},
),
),
],
),
Row(
children: <Widget>[
Expanded(
child: RaisedButton(
color: Colors.green,
child: Text("Create"),
onPressed: () {
CreateData();
}),
),
Expanded(
child: RaisedButton(
color: Colors.blue,
child: Text("Read"),
onPressed: () {
ReadData();
}),
),
Expanded(
child: RaisedButton(
color: Colors.orange,
child: Text("Update"),
onPressed: () {
UpdateData();
}),
),
Expanded(
child: RaisedButton(
color: Colors.red,
child: Text("Delete"),
onPressed: () {
DeleteData();
}),
),
],
),
Row(
textDirection: TextDirection.ltr,
children: <Widget>[
Expanded(
child: Text("Id"),
),
Expanded(
child: Text("Agila"),
),
Expanded(
child: Text("Ravi"),
),
Expanded(
child: Text("Jothi"),
),
Expanded(
child: Text("Bharath"),
),
],
),
Flexible(
child: StreamBuilder(
stream: Firestore.instance
.collection("points")
.orderBy("id")
.snapshots(),
builder: (context, snapshot) {
if (snapshot.hasData) {
//print("snapshot: "+ snapshot.data.documents.length.toString());
agilaTotal = 0;
raviTotal = 0;
jothiTotal = 0;
bharathTotal = 0;
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
DocumentSnapshot ds = snapshot.data.documents[index];
//id=snapshot.data.documents.length+2;
rownum = rownum + 1;
id = ds["id"] + 1;
agilaTotal = agilaTotal + ds["agila"];
raviTotal = raviTotal + ds["ravi"];
jothiTotal = jothiTotal + ds["jothi"];
bharathTotal = bharathTotal + ds["bharath"];
return Row(
textDirection: TextDirection.ltr,
children: <Widget>[
Expanded(
child: Text(ds["id"].toString()),
),
Expanded(
child: Text(ds["agila"].toString()),
),
Expanded(
child: Text(ds["ravi"].toString()),
),
Expanded(
child: Text(ds["jothi"].toString()),
),
Expanded(
child: Text(ds["bharath"].toString()),
),
],
);
});
} else {
return Align(
alignment: FractionalOffset.bottomCenter,
child: CircularProgressIndicator(),
);
}
},
),
),
//rownum = 0;
Row(
children: <Widget>[
Expanded(
child: Text("Total:"),
),
Expanded(
child: Text("$agilaTotal"),
),
Expanded(
child: Text("$raviTotal"),
),
Expanded(
child: Text("$jothiTotal"),
),
Expanded(
child: Text("$bharathTotal"),
),
],
),
],
),
),
);
}
}
Ожидаемый результат: Это ожидаемый вывод с промежуточной суммой и обновленным идентификатором
Но отображается сейчас: при закрытии и открытии приложения. Здесь промежуточный итог отображается как ноль, а идентификатор также не перерисовывается
После записи: Здесь промежуточный итог отображается как ноль и идентификатор также не перерисовывается
Любая помощь?