# Native Code > برنامه نویسی موبایل > Flutter >  تغیر مقدار Badge

## fakhravari

با سلام
یک پراپرتی در StatelessWidget در runApp ایجاد کردم به صورت static که مقدار سبد در ان بزارم.
الان مشکلی که دارم مقدار Badge در دکمه های اضافه و کم تغیر میکند و مشکلی نیست فقط نمایش نمیده.
setState(() { var TedadDarBag = Lunch.LoginModel.TedadDarBag.toString(); });
چون دکمه ای که این Badge کم زیاد میکند در جایی که شی Badge است نیست و در یک StatelessWidget  نیستند.

----------


## hharddy

جایی که دارید TedadDarBag را نمایش میدهید احتمالا stateless است.

----------


## fakhravari

> با سلام
> یک پراپرتی در StatelessWidget در runApp ایجاد کردم به صورت static که مقدار سبد در ان بزارم.
> الان مشکلی که دارم مقدار Badge در دکمه های اضافه و کم تغیر میکند و مشکلی نیست فقط نمایش نمیده.
> setState(() { var TedadDarBag = Lunch.LoginModel.TedadDarBag.toString(); });
> چون دکمه ای که این Badge کم زیاد میکند در جایی که شی Badge است نیست و در یک StatelessWidget  نیستند.


با سلام
app run در یک StatelessWidget و بقیه توی StatefulWidget 
اگر ممکن برسی کنید
https://s16.picofile.com/file/841430...anbgs.rar.html

----------


## hharddy

> با سلام
> app run در یک StatelessWidget و بقیه توی StatefulWidget 
> اگر ممکن برسی کنید
> https://s16.picofile.com/file/841430...anbgs.rar.html


 لطفا کد همون ویجت هارو بفرستید تست کنم

----------


## fakhravari

لینک اپلود شده است

----------


## hharddy

داخل پروژه دیگه قرار دادم اوکی هست آپدیت میشه مقدار badge




void main() => runApp(MyApp()
    );
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
          debugShowCheckedModeBanner: false,


          home:  Center(child: StartPage()),
    );
  }
}




class StartPage extends StatefulWidget {
  @override
  _StartPageState createState() => _StartPageState();
}


class _StartPageState extends State<StartPage> {


  int _TedadProduct = 0;
 
  void _RefreshBag() {
    setState(() {
      _TedadProduct++;
    });
  }




  Widget _shoppingCartBadge() {




    return Badge(
      position: BadgePosition.topEnd(top: 0, end: 3),
      animationDuration: Duration(milliseconds: 300),
      animationType: BadgeAnimationType.slide,
      badgeContent:
      Text(_TedadProduct.toString(), style: TextStyle(color: Colors.white)),
      child: IconButton(icon: Icon(Icons.shopping_cart), onPressed: () {
        _RefreshBag();
      }),
    );
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(


      body: Center(
        child: _shoppingCartBadge(),
      ),
    );
  }




}

----------


## fakhravari

خب ببنید من مقدارBadge در یک پراپرتی استاتیک  runApp در کلاس MyApp   دارم
مراحل پروژه توضیح بدم
بعد از runApp به صفحه StartPage.dart میرود. که شی Badge در آن صفحه است.

این صفحه جوری است که منو ها در drawer تعریف کردم و بعد از کلیک صفحه به body منتقل میشه .
_getDrawerItemScreen(_selectedIndex)) ایتم شروع 0 است و در واقع خانه است که لیست محصولات نمایش میده Index.dart
که روی دکمه کم زیاد من پراپرتی Lunch.LoginModel.TedadDarBag کم زیاد میکنم و مقدار اون لاگ میکنم کم و زیاد میشه ولی Badge ابدیت نمیشود

----------


## hharddy

> خب ببنید من مقدارBadge در یک پراپرتی استاتیک  runApp در کلاس MyApp   دارم
> مراحل پروژه توضیح بدم
> بعد از runApp به صفحه StartPage.dart میرود. که شی Badge در آن صفحه است.
> 
> این صفحه جوری است که منو ها در drawer تعریف کردم و بعد از کلیک صفحه به body منتقل میشه .
> _getDrawerItemScreen(_selectedIndex)) ایتم شروع 0 است و در واقع خانه است که لیست محصولات نمایش میده Index.dart
> که روی دکمه کم زیاد من پراپرتی Lunch.LoginModel.TedadDarBag کم زیاد میکنم و مقدار اون لاگ میکنم کم و زیاد میشه ولی Badge ابدیت نمیشود


خب ببینید شما میخواید از داخل یک ویجت دیگه state یک ویجت دیگر و اپدیت کنید اینجاست که باید از پکیج های مدیریت state مثل بلاک استفاده کنید  یا اگر نمیخواید بلاک استفاده کنید از استریم یا provider کمک بگیرید.

----------


## fakhravari

> خب ببینید شما میخواید از داخل یک ویجت دیگه state یک ویجت دیگر و اپدیت کنید اینجاست که باید از پکیج های مدیریت state مثل بلاک استفاده کنید  یا اگر نمیخواید بلاک استفاده کنید از استریم یا provider کمک بگیرید.


ممنون خودتون کدوم پیش نهاد میکنید پکیج بهتر یا استفاده از کنترل هایی که گفتید.
برای موارد اگر ممکن لینک کمکی مثال هایشان هم بزارید

----------


## fakhravari

چرا خطا میدهد
ایا باید sdk نصب کرد؟

----------


## fakhravari

> چرا خطا میدهد
> ایا باید sdk نصب کرد؟


provider: ^4.3.2+2

----------


## fakhravari

پراپرتی من از جنس کلاس و به صورت استاتیک چطوری در provider استفاده کنم؟ :متفکر: 

import 'package:flutter/foundation.dart';import 'package:vatanbgs/main.dart';


class ProviderLoad with ChangeNotifier {
  int _TedadDarBag = 0;
  int get TedadDarBag => Lunch.LoginModel.TedadDarBag;
}




روش بالا جواب نداد، مقدار رفرش نمیکند

----------


## hharddy

من از قابلیت های 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 رو هم اضافه کنید.

----------


## fakhravari

درست شد. ممنون

----------


## fakhravari

چطوری میشه یک فانکشن صدا زد؟
  static var tedad_subject = BehaviorSubject<int>();
  static var refreshGride = BehaviorSubject<Future<void>>();

----------


## fakhravari

با listen حل شد

----------

