Как перестроить конкретное свойство виджета вместо всего виджета?

Я делаю приложение и для отображения кругового индикатора прогресса я использовал библиотеку modal_progress_hud, и когда я установил состояние inAsyncCall true или false, он перестраивает все свои дочерние виджеты внутри modal_progress_hud. И я не хочу перестраивать весь UI снова и снова. Это снижает эффективность приложения за счет увеличения использования графического процессора. Есть ли другой способ сделать его лучше, если мы просто изменим свойство и перестроим это свойство только виджета, а не всего экрана и виджетов внутри него.

  bool circularindicator = false;
  Color circularColor;
  double circularOpacity;

              child: ModalProgressHUD(
                inAsyncCall: circularindicator,
                child: body,
                color: circularColor,
                opacity: circularOpacity,
              ),

В теле у нас есть все виджеты в виде списка. И после нажатия кнопки входа мы вызвали метод showProgress (), установили состояние и перестроили виджет.

  @override
  showProgress() {
    setState(() {
      circularindicator = true;
      circularOpacity = 0.5;
      circularColor = Colors.grey;
    });
  }

person Umair    schedule 19.11.2019    source источник
comment
проверьте Flutter: не бойтесь сборщика мусора - там написано: Так должны ли разработчики Flutter опасаться сборщика мусора? Учитывая, что Flutter с большой частотой создает и уничтожает объекты, должны ли разработчики предпринимать шаги, чтобы ограничить такое поведение? Нередко можно увидеть, как новые разработчики Flutter создают ссылки на виджеты, которые, как они знают, не будут меняться со временем, и помещают их в такое состояние, чтобы они не разрушались и не создавались заново. Не делайте этого.   -  person pskink    schedule 19.11.2019


Ответы (1)


Создайте свой класс StatelessWidget и используйте Provider Package для управления состоянием. Внутри функции сборки виджета оставьте прослушиватель Provider false и оберните изменяемый виджет с помощью Consumer Widget.

 Widget build(BuildContext context) {
  final cart = Provider.of<Cart>(context, listen: false);
  return GridTileBar(
        leading: Consumer<Product>(
          builder: (ctx, product, child) => IconButton(
            onPressed: () {
              product.toggleFavoriteStatus();
            },
            icon: Icon(product.isFavorite ? Icons.favorite : Icons.favorite_border),
            color: Theme.of(context).accentColor,
          ),
        ),
        trailing: IconButton(
          icon: Icon(Icons.shopping_cart),
          onPressed: () {
            cart.addItem(product.id, product.title, product.price);
          },
          color: Theme.of(context).accentColor,
        ),
        backgroundColor: Colors.black87,
        title: Text(product.title),
      );
}

Дополнительные сведения о пакете провайдера: Управление состоянием с помощью провайдера < / а>

person Farwa    schedule 19.11.2019