نقل قول: تغیر مقدار Badge
جایی که دارید TedadDarBag را نمایش میدهید احتمالا stateless است.
نقل قول: تغیر مقدار Badge
نقل قول:
نوشته شده توسط
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
نقل قول: تغیر مقدار Badge
نقل قول:
نوشته شده توسط
fakhravari
لطفا کد همون ویجت هارو بفرستید تست کنم
1 ضمیمه
نقل قول: تغیر مقدار Badge
نقل قول: تغیر مقدار Badge
داخل پروژه دیگه قرار دادم اوکی هست آپدیت میشه مقدار 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(),
),
);
}
}
1 ضمیمه
نقل قول: تغیر مقدار Badge
خب ببنید من مقدارBadge در یک پراپرتی استاتیک runApp در کلاس MyApp دارم
مراحل پروژه توضیح بدم
بعد از runApp به صفحه StartPage.dart میرود. که شی Badge در آن صفحه است.
این صفحه جوری است که منو ها در drawer تعریف کردم و بعد از کلیک صفحه به body منتقل میشه .
_getDrawerItemScreen(_selectedIndex))
ایتم شروع 0 است و در واقع خانه است که لیست محصولات نمایش میده Index.dart
که روی دکمه کم زیاد من پراپرتی Lunch.LoginModel.TedadDarBag کم زیاد میکنم و مقدار اون لاگ میکنم کم و زیاد میشه ولی Badge ابدیت نمیشود
نقل قول: تغیر مقدار Badge
نقل قول:
نوشته شده توسط
fakhravari
خب ببنید من مقدارBadge در یک پراپرتی استاتیک
runApp در کلاس MyApp دارم
مراحل پروژه توضیح بدم
بعد از
runApp به صفحه StartPage.dart میرود. که شی Badge در آن صفحه است.
این صفحه جوری است که منو ها در drawer تعریف کردم و بعد از کلیک صفحه به body منتقل میشه .
_getDrawerItemScreen(_selectedIndex))
ایتم شروع 0 است و در واقع خانه است که لیست محصولات نمایش میده Index.dart
که روی دکمه کم زیاد من پراپرتی Lunch.LoginModel.TedadDarBag کم زیاد میکنم و مقدار اون لاگ میکنم کم و زیاد میشه ولی Badge ابدیت نمیشود
خب ببینید شما میخواید از داخل یک ویجت دیگه state یک ویجت دیگر و اپدیت کنید اینجاست که باید از پکیج های مدیریت state مثل بلاک استفاده کنید یا اگر نمیخواید بلاک استفاده کنید از استریم یا provider کمک بگیرید.
نقل قول: تغیر مقدار Badge
نقل قول:
نوشته شده توسط
hharddy
خب ببینید شما میخواید از داخل یک ویجت دیگه state یک ویجت دیگر و اپدیت کنید اینجاست که باید از پکیج های مدیریت state مثل بلاک استفاده کنید یا اگر نمیخواید بلاک استفاده کنید از استریم یا provider کمک بگیرید.
ممنون خودتون کدوم پیش نهاد میکنید پکیج بهتر یا استفاده از کنترل هایی که گفتید.
برای موارد اگر ممکن لینک کمکی مثال هایشان هم بزارید
1 ضمیمه
نقل قول: تغیر مقدار Badge
چرا خطا میدهد
ایا باید sdk نصب کرد؟
نقل قول: تغیر مقدار Badge
نقل قول:
نوشته شده توسط
fakhravari
چرا خطا میدهد
ایا باید sdk نصب کرد؟
provider: ^4.3.2+2
نقل قول: تغیر مقدار Badge
پراپرتی من از جنس کلاس و به صورت استاتیک چطوری در provider استفاده کنم؟:متفکر:
import 'package:flutter/foundation.dart';import 'package:vatanbgs/main.dart';
class ProviderLoad with ChangeNotifier {
int _TedadDarBag = 0;
int get TedadDarBag => Lunch.LoginModel.TedadDarBag;
}
روش بالا جواب نداد، مقدار رفرش نمیکند
نقل قول: تغیر مقدار Badge
من از قابلیت های 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 رو هم اضافه کنید.
نقل قول: تغیر مقدار Badge
نقل قول: تغیر مقدار Badge
چطوری میشه یک فانکشن صدا زد؟
static var tedad_subject = BehaviorSubject<int>();
static var refreshGride = BehaviorSubject<Future<void>>();
نقل قول: تغیر مقدار Badge