为什么一个函数可能不会在 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]
什么可能导致该函数在页面初始化时未被调用,但在另一个小部件中调用时却完全正常工作?无论哪种方式,当我尝试 运行 时都不会抛出任何错误,只是我得到了两个不同的结果。任何帮助将不胜感激。
这里的问题是:
splitVendorMainCategory()
方法是 async
这意味着需要一些时间才能完成它的执行
init()
方法是非异步的,这意味着它不会等待任何异步方法。
所以每当你调用 splitVendorMainCategory()
之前它完成它的执行 build()
方法被调用并开始构建小部件
索恩:
- 要么在
build()
方法中使用futurebuilder
或
- 使用
bool loading = true
并在异步方法完成后将其设置为 false
并调用 setState()
以便再次调用 build()
方法
我有一个名为 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]
什么可能导致该函数在页面初始化时未被调用,但在另一个小部件中调用时却完全正常工作?无论哪种方式,当我尝试 运行 时都不会抛出任何错误,只是我得到了两个不同的结果。任何帮助将不胜感激。
这里的问题是:
splitVendorMainCategory()
方法是async
这意味着需要一些时间才能完成它的执行init()
方法是非异步的,这意味着它不会等待任何异步方法。所以每当你调用
splitVendorMainCategory()
之前它完成它的执行build()
方法被调用并开始构建小部件
索恩:
- 要么在
build()
方法中使用futurebuilder
或
- 使用
bool loading = true
并在异步方法完成后将其设置为false
并调用setState()
以便再次调用build()
方法