PDA

View Full Version : تغیر مقدار Badge



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

hharddy
یک شنبه 25 آبان 1399, 20:27 عصر
جایی که دارید TedadDarBag را نمایش میدهید احتمالا stateless است.

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

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

hharddy
سه شنبه 27 آبان 1399, 21:54 عصر
با سلام
app run در یک StatelessWidget و بقیه توی StatefulWidget
اگر ممکن برسی کنید
https://s16.picofile.com/file/8414302234/vatanbgs.rar.html
لطفا کد همون ویجت هارو بفرستید تست کنم

fakhravari
چهارشنبه 28 آبان 1399, 15:07 عصر
لینک اپلود شده است

hharddy
پنج شنبه 29 آبان 1399, 23:32 عصر
داخل پروژه دیگه قرار دادم اوکی هست آپدیت میشه مقدار 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
جمعه 30 آبان 1399, 20:38 عصر
خب ببنید من مقدارBadge در یک پراپرتی استاتیک runApp در کلاس MyApp دارم
مراحل پروژه توضیح بدم
بعد از runApp به صفحه StartPage.dart میرود. که شی Badge در آن صفحه است.

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

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

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

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

fakhravari
شنبه 01 آذر 1399, 10:30 صبح
خب ببینید شما میخواید از داخل یک ویجت دیگه state یک ویجت دیگر و اپدیت کنید اینجاست که باید از پکیج های مدیریت state مثل بلاک استفاده کنید یا اگر نمیخواید بلاک استفاده کنید از استریم یا provider کمک بگیرید.
ممنون خودتون کدوم پیش نهاد میکنید پکیج بهتر یا استفاده از کنترل هایی که گفتید.
برای موارد اگر ممکن لینک کمکی مثال هایشان هم بزارید

fakhravari
شنبه 01 آذر 1399, 19:51 عصر
چرا خطا میدهد
ایا باید sdk نصب کرد؟

fakhravari
شنبه 01 آذر 1399, 21:04 عصر
چرا خطا میدهد
ایا باید sdk نصب کرد؟

provider: ^4.3.2+2

fakhravari
شنبه 01 آذر 1399, 21:11 عصر
پراپرتی من از جنس کلاس و به صورت استاتیک چطوری در 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
یک شنبه 02 آذر 1399, 21:12 عصر
من از قابلیت های 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
یک شنبه 02 آذر 1399, 22:47 عصر
درست شد. ممنون

fakhravari
جمعه 07 آذر 1399, 20:37 عصر
چطوری میشه یک فانکشن صدا زد؟
static var tedad_subject = BehaviorSubject<int>();
static var refreshGride = BehaviorSubject<Future<void>>();

fakhravari
جمعه 07 آذر 1399, 21:15 عصر
با listen حل شد