حل مشکل تکرار بی پایان یک اجرا هنگام استفاده از setState در FutureBuilder و ListView.Builder در فلاتر

دوستان سلام. به یکی از چرت ترین مشکلاتی که بهش برخوردم میخوام صحبت کنم.

تو یکی از پروژه ها یه متغیر رو داخل یه 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;
                 });
              });

دوباره تکرار میشه و مثل یه حلقه ی بی پایان ویجت ساخته میشه .

اما شرطی که اضافه کردیم فقط برای بار اول این کار رو انجام میده و تمام!!!

سیدعباس حسینی

نویسنده: AbbasHoseini

به دنبال خلق رویام تو دنیای برنامه نویسی پیرو دنیای آزاد

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.