flutter setState () работает, но не обновляет интерфейс - PullRequest
0 голосов
/ 01 апреля 2020

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

class ProductDetails extends StatefulWidget {
  final Product _product;

  ProductDetails(this._product);

  @override
  _ProductDetailsState createState() => _ProductDetailsState(_product);
}

class _ProductDetailsState extends State<ProductDetails> {
  final Product _product;
  _ProductDetailsState(this._product);
  @override
  void initState() {
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return ScaffoldWidget(
        child: ListView(
      children: <Widget>[
        MainPartProduct(_product),
        Container(
          child: Row(
            children: <Widget>[
              GestureDetector(
                onTap: () {
                  Navigator.of(context).push(
                    (MaterialPageRoute(
                      builder: (context) => CartScreen(),
                    )),
                  );
                },
                child: Padding(
                  padding: const EdgeInsets.symmetric(vertical: 0.0),
                  child: Container(
                    margin: EdgeInsets.symmetric(vertical: 10.0),
                    alignment: Alignment.center,
                    width: MediaQuery.of(context).size.width * 0.75,
                    color: Colors.red,
                    child: Padding(
                      padding: const EdgeInsets.symmetric(vertical: 10.0),
                      child: Text(
                        "BUY",
                        style: TextStyle(
                          color: Colors.white,
                          fontSize: 20,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                    ),
                  ),
                ),
              ),
              IconButton(
                color:_product.cart ? Colors.black : Colors.red,
                onPressed: () {
                  _product.cart ? productCart.remove(_product): productCart.add(_product);
                  setState(() {
                    _product.cart = !_product.cart;
                    print(_product.cart);
                  });
                },
                icon:_product.cart ? Icon(Icons.remove_shopping_cart) : Icon(Icons.add_shopping_cart),
              ),
              IconButton(
                color: Colors.red,
                onPressed: () {
                  this.setState(() {
                    _product.fav ? productFavorite.remove(_product) : productFavorite.add(_product);
                    _product.fav = !_product.fav;
                  });
                },
                icon: (_product.fav) ? Icon(Icons.favorite) : Icon(Icons.favorite_border),
              ),
            ],
          ),
        ),
        Padding(
          padding: const EdgeInsets.symmetric(horizontal: 10.0),
          child: Container(
            height: 500,
            child: Text(
              _product.details + _product.details,
              style: TextStyle(
                fontSize: 16.5,
              ),
            ),
          ),
        ),
      ],
    ));
  }
}

1 Ответ

0 голосов
/ 01 апреля 2020

Вы не должны передавать параметры через конструктор StatefulWidget. Вы должны получить к нему доступ через widget поле aka widget._product

class ProductDetails extends StatefulWidget {
  final Product _product;

  const ProductDetails({ Key key, this._product }): super(key: key);  

  @override
  _ProductDetailsState createState() => _ProductDetailsState();
}

class _ProductDetailsState extends State<ProductDetails> {

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return ScaffoldWidget(
        child: ListView(
      children: <Widget>[
        MainPartProduct(widget._product),
        Container(
...
...