После выполнения потокового построителя виджет строки ниже не обновляется во флаттере - PullRequest
0 голосов
/ 04 апреля 2020

Я новичок, чтобы трепетать, я пытаюсь выполнить операцию CRUD с помощью Firestore до этого я завершил.

У меня здесь 2 проблемы ..

  1. И когда я пытаюсь с промежуточным итогом, он не перерисовывает виджет ROW промежуточного итога, который подсчитывается в самом Streambuilder. Итоговое значение всегда отображается как ноль, но должно отображаться как общее значение
  2. Идентификатор также не обновляется (рядом с именами)

Моя цель - когда я нажимаю кнопку «Создать», в ней необходимо сохранить данные в пожарном хранилище и должны отображаться в виде списка и промежуточного итога в нижней части моей деятельности, а следующий идентификатор должен отображаться для следующей записи. В будущем вместе с промежуточным итогом я собираюсь добавить Ранг также в другой виджет Строка под виджетом Общая строка.

Мой код

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

Ожидаемый результат: Это ожидаемый вывод с промежуточной суммой и обновленным идентификатором

Но отображается сейчас: при закрытии и открытии приложения. Здесь промежуточный итог отображается как ноль, а идентификатор также не перерисовывается

После записи: Здесь промежуточный итог отображается как ноль и идентификатор также не перерисовывается

Любая помощь?

...