为什么一个函数可能不会在 initState(){ super.initState()} 中被调用,但如果稍后在同一页面中调用,它会工作得很好?

Why might a function not get called in initState(){ super.initState()} in flutter, but work perfectly fine if called later in the same page?

我有一个名为 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]),
    }
  }

我在页面初始化时调用它,但它 returns 两个空的子列表,而列表 VendorMainCategory 包含元素。 我将该函数称为:

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

然而,当我在同一页面的 'body' 中调用相同的函数时,它 returns 预期的结果。

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

什么可能导致该函数在页面初始化时未被调用,但在另一个小部件中调用时却完全正常工作?无论哪种方式,当我尝试 运行 时都不会抛出任何错误,只是我得到了两个不同的结果。任何帮助将不胜感激。

这里的问题是:

  1. splitVendorMainCategory() 方法是 async 这意味着需要一些时间才能完成它的执行

  2. init() 方法是非异步的,这意味着它不会等待任何异步方法。

  3. 所以每当你调用 splitVendorMainCategory() 之前它完成它的执行 build() 方法被调用并开始构建小部件

索恩:

  1. 要么在build()方法中使用futurebuilder

  1. 使用 bool loading = true 并在异步方法完成后将其设置为 false 并调用 setState() 以便再次调用 build() 方法