دوستان سلام. به یکی از چرت ترین مشکلاتی که بهش برخوردم میخوام صحبت کنم.
تو یکی از پروژه ها یه متغیر رو داخل یه FutureBuilder ( داخل ListViewBuilder هم همین مشکل وجود داره) یه مقدار جدید دادم بهش . یه BottomNavigationBar هم داشتم که یه ویجت Text قرار داده بودم وهمون متغیر رو داخلش قرار داده بودم. به شکل زیر:
class BasketBar extends StatefulWidget {
@override
_BasketBarState createState() => _BasketBarState();
}
class _BasketBarState extends State<BasketBar> {
double? finalTotal;
...
@override
Widget build(BuildContext context) {
S().init(context);
return Scaffold(
appBar: buildAppBar(context),
body: FutureBuilder<List<Data>>(
future: getData,
builder: (context, local) {
if (local.hasData) {
...
myVariable = local.data!.name;
...
bottomNavigationBar: Text(myVariable.toString()),
اما مقدار داخل bottomNavigationBar برای بار اول بروز نمیشد و null نشون میداد. و باید صفحه رو رفرش میکردم تا مقدار درست رو نشون بده. بنابراین از کد زیر استفاده کردم:
Future.delayed(Duration.zero, () {
setState(() {
myVariable = local.data!.name;
});
});
با این کد، متغیر myVariable برای بار اول نشون داده شد اما انگار برنامه میفتاد رو دور تکرار و بی وقفه این setState اجرا میشد. بنابرین یه شرط اضافه کردم به این شکل:
if(myVariable == null)Future.delayed(Duration.zero, () {
setState(() {
myVariable = local.data!.name;
});
});
و مشکل حل شد!
اما قضیه از چه قرار بود؟
وقتی از setState استفاده میکنم ویجت build دوباره ساخته میشه و بنابراین فیچربیلدر هم دوباره ساخته میشه و این شرط :
Future.delayed(Duration.zero, () {
setState(() {
myVariable = local.data!.name;
});
});
دوباره تکرار میشه و مثل یه حلقه ی بی پایان ویجت ساخته میشه .
اما شرطی که اضافه کردیم فقط برای بار اول این کار رو انجام میده و تمام!!!