Почему моя функция void не обновляет мою переменную int? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть 3 переменные типа int, которые я хочу обновить с помощью функции void во время initstate. Я попытался распечатать их, и значение верное, но когда я пытаюсь отобразить их в своем контейнере, он все равно показывает 0.

int equipmentCount1 = 0;
int equipmentCount2 = 0;
int equipmentCount3 = 0;

 @override
  void initState() {
    getEquipmentCount('Hammer', equipmentCount1);
    getEquipmentCount('Spanner', equipmentCount2);
    getEquipmentCount('Screwdriver', equipmentCount3);
    super.initState();
  }

void getEquipmentCount(String type, int counter) async {
    await Firestore.instance
        .collection('Notes')
        .document('CarNotes')
        .collection('PM Overview')
        .document(type)
        .collection(type)
        .getDocuments()
        .then((QuerySnapshot snapshot) {
      setState(() {
        return counter = snapshot.documents.length;
      });
    });
    print(counter);
  }

@override
  Widget build(BuildContext context) {
    return Scaffold(
body: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
Text(equipmentCount1),
Text(equipmentCount2),
Text(equipmentCount3),


Ответы [ 2 ]

1 голос
/ 04 мая 2020

Значение по-прежнему равно 0, поскольку в вашем методе вы изменяете только переменную counter внутри метода, а не переменные экземпляра equipmentCount3. Вы можете создать список, чтобы добавить все 3 значения, а затем использовать этот список в методе build:

int equipmentCount1 = 0;
int equipmentCount2 = 0;
int equipmentCount3 = 0;
List<int> listOfEquipments = List();

void getEquipmentCount(String type, int counter) async {
    await Firestore.instance
        .collection('Notes')
        .document('CarNotes')
        .collection('PM Overview')
        .document(type)
        .collection(type)
        .getDocuments()
        .then((QuerySnapshot snapshot) {
      setState(() {
        listOfEquipments.add(snapshot.documents.length);
      });
    });
  }

Чтобы добавить list в метод build, проверьте следующее:

{ ссылка }

1 голос
/ 04 мая 2020

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

 @override
  void initState() {
    getEquipmentCount('Hammer', (int count) => setState(() { 
      equipmentCount1 = count;
    }));
    // same for the others
    super.initState();
  }

void getEquipmentCount(String type, ValueChanged<int> onCountChanged) {
    Firestore.instance
        .collection('Notes')
        .document('CarNotes')
        .collection('PM Overview')
        .document(type)
        .collection(type)
        .getDocuments()
        .then((QuerySnapshot snapshot) {
          onCountChanged(snapshot.documents.length);
        });
    });
    print(counter);
  }

Кроме того, await не требуется, поскольку вы используете then на Future, а функция внутри setState не должна ничего возвращать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...