Почему функция не может быть вызвана в initState () {super.initState ()} во флаттере, но прекрасно работает, если вызывается позже на той же странице? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть функция с именем splitVendorMainCategory, которая просто разбивает список на два подсписка, описанных как:

List vendorMainCategory = ['one', 'two', 'three', 'four'];

Future splitVendorMainCategory() async {
 for (int i=0; i< (vendorMainCategoryLength); i+=2){

      vendorMainCategoryC1.add(vendorMainCategory[i]),                    
    },

    for(int j = 1; j < vendorMainCategoryLength; j+=2){
      vendorMainCategoryC2.add(vendorMainCategory[j]),
    }
  }

И я вызываю его прямо при инициализации страницы, но она возвращает два пустых вложенных элемента. списки, а список VendorMainCategory содержит элементы. Я вызываю функцию как:

 @override
 initState() {
   splitVendorMainCategory();
   super.initState(); 
}

Однако, когда я вызываю ту же функцию в «теле» на той же странице, она возвращает ожидаемый результат.

vendorMainCategoryC1 = [one, three]
vendorMainCategoryC2 = [two, four]    

Что может быть в результате чего функция не будет вызываться при инициализации страницы, но будет ли она работать нормально при вызове внутри другого виджета? При попытке запустить его в любом случае не выдается никакой ошибки, просто я получаю два разных результата. Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 09 апреля 2020

проблема здесь:

  1. splitVendorMainCategory() метод равен async, что означает, что для завершения его выполнения требуется некоторое время

  2. * Метод 1011 * не является асинхронным c, что означает, что он не будет ожидать какого-либо асинхронного c метода.

  3. , поэтому всякий раз, когда вы вызываете splitVendorMainCategory() до завершения его выполнения build() вызывается метод и начинается создание виджетов

Soln:

  1. Либо используйте futurebuilder в build() метод

или

используйте bool loading = true и установите его на false после завершения асинхронного метода c и вызовите setState(), чтобы метод build() вызывался снова
...