Merhabalar böyle bir alışveriş listesi uylama sayfamda sayac arttırma ve azaltma işlemi yaparak eklenencek ürünün miktarını kaydetmek istiyorum ama show diolog içinde set state yapmama rağmen artı butonuna bastığım zaman arttırmıyor daha doğrusu arttırıyor ama güncellemiyor ekranda hot reload yaptığım zaman yapıyor

bunun için bir ayrı bir class oluşturdum bu sefer oluyor fakat oluşan sayaç verisini yani eklenecek veriyi kaydetme fonksiyonuna geri atamıyorum yani ana classa veri gönderemiyorum. C# da public değişken atadığında aynı sayfa içinde nerede olursa olsun o değişkene erişilebiliyordu bunun gibi bişey olsa iyi olurdu yada başk abir yöntemi var mı?

`class Kategoriler extends StatefulWidget {
  @override
  _KategorilerState createState() => _KategorilerState();
}

class _KategorilerState extends State<Kategoriler> {
  var db = new Mysql();
  List urunlerListesi = [];
  var kategori = "";

  List<Urunler> parseUrunCevap(String cevap) {
    return UrunlerCevap.fromJson(json.decode(cevap)).urunlerListesi;
  }

  Future<List<Urunler>> aramaYap(String kategori) async {
    var url = Uri.parse("url");
    var veri = {"aramaKelimesi": kategori};
    var cevap = await http.post(url, body: veri);
    return parseUrunCevap(cevap.body);
  }

  Future<void> getListeArama(String kategori) async {
    var urunListe = await aramaYap(kategori);
    for (var u in urunListe) {
      urunlerListesi.add(u);
      print(u.ad);
    }
  }

  Future<void> urunEkle(String urun, String marka, String miktar) async {
    var url = Uri.parse("url");
    var veri = {
      "urun": urun,
      "marka": marka,
      "miktar": miktar,
    };
    // ignore: unused_local_variable
    var cevap = await http.post(url, body: veri);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    final _kTabPages = <Widget>[
      sayfa("Fırın,Pastahane"),
      sayfa("Meyve,Sebze"),
      sayfa("Kahvaltılık"),
      sayfa("Temizlik"),
      sayfa("Temel Gıda"),
    ];
    final _kTabs = <Tab>[
      const Tab(
        text: "Fırın,Pastahane",
        icon: Icon(Icons.ac_unit_outlined),
      ),
      Tab(
        text: "Meyve,Sebze",
        icon: Icon(Icons.shield_sharp),
      ),
      Tab(
        text: "Kahvaltılık",
        icon: Icon(Icons.emoji_food_beverage_rounded),
      ),
      Tab(
        text: "Temizlik",
        icon: Icon(Icons.clean_hands_rounded),
      ),
      Tab(
        text: "Temel Gıda",
        icon: Icon(Icons.food_bank_outlined),
      ),
    ];
    return DefaultTabController(
        length: _kTabs.length,
        child: Scaffold(
            appBar: AppBar(
              toolbarHeight: 0,
              bottom: TabBar(
                isScrollable: true,
                tabs: _kTabs,
              ),
            ),
            body: TabBarView(
              children: _kTabPages,
            )));
  }

  FutureBuilder sayfa(String kategori) {
    getListeArama(kategori);
    return FutureBuilder<List<Urunler>>(
        future: aramaYap(kategori),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            var urunlerListesiArama = snapshot.data;
            return ListView.builder(
                itemCount: urunlerListesiArama!.length,
                itemBuilder: (context, index) {
                  var liste = urunlerListesiArama[index];
                  return SizedBox(
                      height: 70,
                      child: Card(
                        child: ListTile(
                          title: Text(liste.ad),
                          leading: SizedBox(
                            width: 40,
                            height: 40,
                            child: Image.network(
                                "url",
                                errorBuilder: (BuildContext context,
                                    Object exception, StackTrace? stackTrace) {
                              return Image.network(
                                  "url");
                            }),
                          ),
                          trailing: IconButton(
                            icon: Icon(Icons.add),
                            color: Colors.green,
                            onPressed: () {
                              late TextEditingController flmarka;
                              flmarka = new TextEditingController();

                              showDialog(
                                  context: context,
                                  builder: (BuildContext context) {
                                    return AlertDialog(
                                        content: Column(
                                            mainAxisSize: MainAxisSize.min,
                                            crossAxisAlignment:
                                                CrossAxisAlignment.start,
                                            children: [
                                          Text(
                                            "${liste.ad} ekle",
                                            style: TextStyle(
                                                fontSize: 25,
                                                fontWeight: FontWeight.bold),
                                          ),
                                          Padding(
                                            padding: const EdgeInsets.only(
                                                top: 30, bottom: 10),
                                            child: Row(
                                              children: [
                                                sayacEylem(
                                                    birim: "${liste.birim}"),
                                              ],
                                            ),
                                          ),
                                          TextFormField(
                                            keyboardType: TextInputType.text,
                                            controller: flmarka,
                                            decoration: InputDecoration(
                                                helperText:
                                                    "Marka, renk, çeşit vb bilgiler...",
                                                border: UnderlineInputBorder(),
                                                labelText: "Açıklama : "),
                                          ),
                                          ElevatedButton(
                                              onPressed: () {
                                                urunEkle(
                                                    "${liste.ad}",
                                                    flmarka.value.text,
                                                    "1 Kilo");
                                                Navigator.pop(context);
                                                ScaffoldMessenger.of(context)
                                                    .showSnackBar(SnackBar(
                                                        duration: Duration(
                                                            milliseconds: 600),
                                                        content: Text(
                                                            "${liste.ad} listeye eklendi")));
                                              },
                                              child: Text("Ekle"))
                                        ]));
                                  });
                            },
                          ),
                        ),
                      ));
                });
          } else {
            return Center();
          }
        });
  }
}

class sayacEylem extends StatefulWidget {
  const sayacEylem({Key? key, required this.birim}) : super(key: key);
  final String birim;

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

class _sayacEylemState extends State<sayacEylem> {
  int sayac = 1;
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(left: 50),
      child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            sayacButon(Icons.remove, () {
              setState(() {
                sayac--;
              });
            }),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 15),
              child: Text(
                "${sayac.toString()}   ${widget.birim}",
                style: TextStyle(fontSize: 20),
              ),
            ),
            sayacButon(Icons.add, () {
              setState(() {
                sayac++;
              });
            }),
          ]),
    );
  }

  SizedBox sayacButon(IconData icon, Function() press) {
    return SizedBox(
      width: 30,
      height: 25,
      child: OutlineButton(
        padding: EdgeInsets.zero,
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(13)),
        onPressed: press,
        child: Icon(icon),
      ),
    );
  }
}`
5 days later

Merhaba
Böyle işlemler için state managment paketlerini kullanabilirsiniz.
En kolayı ValueNotifier. Ancak çok kapsamlı değil. Provider, Getx,Bloc gibi yapılarıda inceleyebilirsiniz.

4 months later

aykutik merhaba.
Akşam bende bu sorunu yaşadım
Bir ana widget var ve içinde her modülü extract edip widget class oluşturdum.
Photowidget içinde yaptığım like işlemi bir altta kullandığım Likewidget class içindeki butonu aktif etmesi gerekiyor.
Classlar aynı ana class içinde olduğu için bunu ben ana class içinde oluşturduğum void methoda bu iki alt class içinden erişim sağladım clik işlemi ile bu void içinde oluşturduğum setState işlemi ile hepsini güncellemeyi başardım. Ama classlar farklı yerlerde barınıyorsa state yönetimi kullanabilirsiniz. En popüler eklenti provider eklentisi bunu kullanabilirsiniz.

Write a Reply...