من از قابلیت های Rxdart استفاده کردم.
اول از همه داخل کلاس Index متغیر زیر و تعریف کنید. به دلیل اینکه داخل این کلاس تعریف میکنیم این هست که از کلاس startpage به متغیر های استاتیک این کلاس دسترسی داشته باشیم و کلاس _IndexState چون از نوع private هست این امکان وجود نداره مگر اینکه پابلیک تعریف کنید.
static BehaviorSubject<int> tedad_subject = BehaviorSubject<int>();
حالا داخل state ویجت این کلاس یعنی _IndexState جایی که روی علامت اضافه کردن کلیک میکردن کد زیر و بنویسید. قبل از اون هم داخل init من مقدار اولیه رو 3 گذاشتم برای تست.
@override
void initState() {
super.initState();
Index.tedad_subject.add(3);
LoadPage();
}
/** **/
onPressed: () {
Lunch.LoginModel.TedadDarBag =
Lunch.LoginModel.TedadDarBag + 1;
Index.tedad_subject.add(Lunch.LoginModel.TedadDarB ag);
print(
Lunch.LoginModel.TedadDarBag.toString());
setState(() {
var t = Lunch.LoginModel.TedadDarBag;
});
}
اینجا با کلیک کردن روی آیکون زمانی که مقدار متغیر TedadDarBag اپدیت میشه همونو به عنوان مقدار جدید استریم tedad_subject قرار میدیم.
داخل کلاس startpage هم فقط کافی متد زیر و به این شکل اپدیت کنید.
Widget _shoppingCartBadge(var context) {
return StreamBuilder(
stream: Index.tedad_subject,
builder: (context,snapshot){
return Badge(
position: BadgePosition.topEnd(top: 0, end: 3),
animationDuration: Duration(milliseconds: 300),
animationType: BadgeAnimationType.slide,
badgeContent:
Text(snapshot.data.toString(), style: TextStyle(color: Colors.white)),
child: IconButton(icon: Icon(Icons.shopping_cart), onPressed: () {}),
);
},
);
}
داخل این ویجت از StreamBuilder استفاده شده که هر زمان مقدار جدیدی داخل استریم قرار گرفته ویجت دوباره ساخته بشه.
اگر مشکلی بود بگید فایل دو کلاس و بفرستم.
پکیج rxdart رو هم اضافه کنید.