Загрузка данных Firebase каждый раз, когда я устанавливаю состояние - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь создать приложение со списком категорий. Я хотел увеличить выбранную категорию и придать ей жирный цвет. Но каждый раз, когда я устанавливаю состояние, он обновляет экран, а затем устанавливает состояние. Могу ли я остановить его обновление каждый раз, когда я устанавливаю состояние?

это мой код

Это мое будущее

Future getCategories() async{
    var firestore = Firestore.instance;
    QuerySnapshot querySnapshot = await firestore.collection("category").getDocuments();
    return querySnapshot.documents;
  }

и это мой будущий строитель

FutureBuilder(
    future: getCategories(),
    builder: (_, snapshot){
      if (snapshot.connectionState == ConnectionState.waiting) {
        return Container(
          child: Text('Loading'),
        );
      }else return ListView(
          scrollDirection: Axis.horizontal,
          children:
          List.generate(snapshot.data.length, (int index) =>
              InkWell(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text(snapshot.data[index].data["category"],
                        style: TextStyle(fontSize: currentCategory == snapshot.data[index].data["category"] ? sActive : sNotActive,
                          color: currentCategory == snapshot.data[index].data["category"] ? active : notActive,)
                      ,),
                  ),
                onTap: () {
                  String selectedCategory = snapshot.data[index].data["category"];
                  setState(() {
                    currentCategory = selectedCategory;
                    print(selectedCategory);
                  });
                },
              )));
    })

1 Ответ

1 голос
/ 01 августа 2020

Когда вы используете setState(), весь виджет будет перестроен, а затем FutureBuilder, который снова вызовет метод getCategories().

Вы можете вызвать метод getCategories() (не дожидаясь его) в initState() и сохраните будущее в свойстве класса состояния, а затем используйте это свойство в построителе будущего вместо getCategories().

Другим решением может быть перемещение ListView() в отдельный виджет , поэтому вы можете перестроить только ListView, когда вы выбираете элемент и вызываете setState.

В любом случае вы можете использовать, например, шаблон BLo C для управления состоянием, таким образом вам не нужно перестраивать весь виджет.

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