ошибка видимости флаттера и проблема с состоянием инициализации

#laravel #flutter

Вопрос:

я новичок , и у меня странная ошибка, у меня проблема с видимостью, я работаю с api laravel, если у меня нет продуктов в базе данных, этот.виджет.клиент всегда ложен, если у меня есть продукт в базе данных, приложение работает отлично !! код флаттера :

     bool client=false ;
    _getAuthenticatedUser() async {
          SharedPreferences _prefs = await SharedPreferences.getInstance();
          var log = new Logger();
          var x = _prefs.getString('photoUser');
          this.widget.photo=json.decode(x);
          this.widget.name= json.decode(_prefs.getString('Username'));
          if(_prefs.getString('token')!=null){
            if(json.decode(_prefs.getString('role'))=='superAdmin'){
              this.widget.superAdmin=true;}else{this.widget.superAdmin=false;}
            if(json.decode(_prefs.getString('role'))=='admin'){
              this.widget.admin=true;
            }else{this.widget.admin=false;}
            if(json.decode(_prefs.getString('role'))=='user'){
              _prefs.setString('client', 'client');
              this.widget.client=true;
            }else{this.widget.client=false; log.d('here not client');}
      }
      else{
               this.widget.superAdmin=false;
              this.widget.admin=false;
              this.widget.client=false;
      }
      }
 _getAllProducts() async {
     var _productService = ProductService();
     var products = await _productService.getProducts();
    var result = json.decode(products.body);
    var log = new Logger();
    _productList.clear();
    result.forEach((data) {
      var product = Product();
       product.id = data['id'] ?? 0 ;
      product.name = data['name'] ?? "";
      product.photo = data['photo'] ?? "";
      product.price = data['price'] ?? 0;
      product.discount = data['discount'] ?? 0;
      product.detail = data['detail'] ?? 'No detail';
      product.quantity = data['quantity'] ?? 0;
      setState(() {
          _productList.add(product);
      });
    });
  }
    @override
      void initState(){
        super.initState();
        _getAuthenticatedUser();
        _getAllProducts();}
    and in the build
    Visibility(
                      visible: this.widget.client,
                      child:  ListTile(
                          leading: Icon(Icons.category,color: Colors.white,),
                          title: Text('Produits refusé',style: TextStyle(color: Colors.white)),
                          onTap: () {
                            Navigator.push(context, MaterialPageRoute(
                                builder: (context) =>RefusedProducts(_refusedProductList,this.widget.client,this.widget.photo,this.widget.name)));
                          }
                      ),),
 

Комментарии:

1. Вам нужно проверить, как setState и как использовать его для обновления значения.

2. Проблема в том, что я передаю _productList пустым на другой экран

Ответ №1:

Вы можете обернуть свою setState() функцию следующим образом:

  WidgetsBinding.instance?.addPostFrameCallback((_) {
    setState(() {
          _productList.add(product);
      });
  });
 

Комментарии:

1. Спасибо за ответ , та же проблема,проблема в том, что я передаю _productList пустым на другой экран

2. Вы звоните SetState() по каждому товару. Это означает, что вы много раз перестраиваете виджет впустую. В любом случае, вам действительно нужно пройти несколько уроков.