- Edited
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),
),
);
}
}`